코딩테스트 준비를 위해 C++을 공부한 내용을 정리하고자 게시글을 작성하게 되었습니다.
대학에서 C언어를 공부한 상태에서 C++을 공부하는 상태이므로
C와 중복되는 개념을 제외하고, C와 C++의 차이점을 위주로 정리하고 있습니다.
목차 (update 23.05.19)
[C에서 C++로 넘어가기] - 1. C와 C++의 차이, namespace
[C에서 C++로 넘어가기] - 3. cin, cout, endl
[C에서 C++로 넘어가기] - 4. 문자열 입력받기 : String
[C에서 C++로 넘어가기] - 5. 정렬하기 : sort
[C에서 C++로 넘어가기] - 7. 이진 탐색- binary_search(), upper_bound(), lower_bound()
개인 학습용으로 정리하고 있는 게시글이라, 잘못된 정보가 많이 있을 수 있습니다.
위 게시글들은 간단히 참고하는 정도로 사용하시고 자세한 내용은 아래 사이트를 참조하시는걸 추천드립니다.
https://learn.microsoft.com/ko-kr/cpp/cpp/?view=msvc-170
C++이란?
우선, C++이란 C언어에 Class가 추가된 언어입니다. (처음에는 이름이 C with Classes였다고 합니다.)
Class를 지원하게 되어 C++은 C언어와 달리 객체지향 프로그래밍이 가능해졌다는 차이가 있습니다.
우선 Class(클래스)가 무엇인지 알아보겠습니다.
클래스를 이해하기 위해 참고한 강의영상에서는 클래스를 다음과 같이 설명했습니다.
- 클래스(=타입) : 특정한 용도를 수행하기 위한 변수와 함수를 모아 둔 틀 (자료형)
- 객체 : 그 틀을 이용하여 찍어낸 개체
클래스에 대해서는 다음 게시글에 따로 정리했으니, 확인해 주시기 바랍니다.
https://sirius7.tistory.com/80
객체지향 프로그래밍(OOP)이란?
C언어는 절차지향 언어, C+는 객체지향 언어라는 차이가 있습니다.
그렇다면 절차지향이 무엇인지, 객체지향이 무엇인지 간단히 살펴보겠습니다.
절차지향(Procedural Programming) 프로그래밍
- 프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임을 의미한다.
- 프로시저는 루틴, 하위프로그램, 서브루틴, 메서드, 함수라고도 하는데, 간단히 말하여 수행되어야 할 연속적인 계산 과정을 포함하고 있다.
- 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시된다
- 자동차 제조를 예로 들면 엔진, 차체, 핸들, 의자, 바퀴 순으로 차례대로 만들어지는 것
- 컴퓨터의 처리구조와 유사해서 실행 속도가 빠르다는 것이 장점
객체지향(Object Oriented Programming) 프로그래밍
- 프로그램을 수많은 객체(object)라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식.
- 객체란 하나의 역할을 수행하는 메소드와 변수(데이터)의 묶음
- 캡슐화, 상속, 다형화라는 3가지 중요한 개념이 있다.
- 캡슐화 : 변수와 함수를 하나의 단위로 묶는 것을 의미
- 상속 : 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것
- 다형성 : 하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것
- 장점 : 코드의 재활용성이 높고, 디버깅이 쉽다
- 단점 : 처리속도가 절차지향보다 느리고, 설계에 많은 시간이 소요된다.
일단은 이 정도로 간단히 정리하고 객체지향에 대해서는 다음에 정리해 보도록 하겠습니다.
헤더파일 선언하기
C++의 문법은 C언어의 문법과 호환이 되지만, 차이점도 당연히 존재합니다.
아래 내용은 아래 링크를 참고하여 작성하였습니다.
한번 간단하게 Hello, world!를 출력하는 코드를 통해 두 언어를 비교해 보겠습니다.
#include <stdio.h>
int main(void){
printf("Hello world!");
return 0;
}
#include <iostream>
using namespace std;
int main(void){
cout<<"Hello world!";
return 0;
}
먼저 헤더파일을 추가하는 첫 줄부터 차이점이 보입니다.
#include <iostream>과 같이, C++에서는 헤더파일 뒤에 .h를 붙이지 않습니다!
그다음줄을 살펴보면,
using namespace std;는 std라는 namespace를 사용한다는 뜻입니다.
그럼 namespace이 무엇인지 한번 살펴보겠습니다.
namespace
namespace는 어떤 변수나 함수의 소속을 알려주는 기능을 합니다.
C언어를 공부할 때는 전혀 고려하지 않았던 점인데, 왜 변수와 함수의 소속을 알아야 할까요?
왜냐하면, C언어에서는 식별자의 이름이 같을 수 없지만, C++에서는 식별자의 이름이 같을 수 있기 때문입니다.
이름이 같은 식별자가 있다면 당연히 충돌이 발생하고, 혼란이 생기겠죠?
이러한 문제를 방지하기 위해 사용하는 개념이 바로 namespace입니다.
한번 아래 예시를 봅시다.
#include <iostream>
namespace A {
int num = 10;
}
namespace B {
int num = 20;
int num2 = 7;
}
using namespace B;
int main() {
int num = 30;
std::cout << "main num : " << num << std::endl;
std::cout << "A num : " << A::num << std::endl;
std::cout << "B num : " << B::num << std::endl;
std::cout << "B num2 : " << num2 << std::endl;
return 0;
}
위의 코드에서는 num이라는 변수가 무려 3개나 선언되었습니다.
main()에서 한번, namespace A에서 한번, namespace B에서 한번
총 3개의 num 변수가 있는 셈이죠.
이 3가지 num을 구분하기 위해
namespace A의 num은 A::num,
namespace B의 num은 B::num으로 사용하여 구분할 수 있습니다.
정리하면, namespace 내의 변수나 함수는
[namespace이름]::[변수명 또는 함수명]
꼴로 사용하여 구분할 수 있습니다.
여기서 ::는 범위 지정 연산자(::, scope resolution operator) 입니다.
하지만, 유일한 이름의 변수를 사용할 때는 범위 지정 연산자를 사용하는 것이 번거로울 수 있습니다.
이때 사용하는 것이 using 지시자입니다.
using namespace 네임스페이스이름;
using 지시자는 명시한 namespace에 속한 이름을 범위 지정 연산자 없이 사용할 수 있게 해 주고, 위와 같이 사용합니다.
앞선 소스코드를 확인하면 main() 함수 내에는 num2라는 변수가 선언되지 않았지만, 정상적으로 B의 num2가 출력된 것을 확인할 수 있죠? 이는 using namespace B;를 통해 namespace B를 사용한다고 미리 선언했기 때문에 가능한 것입니다.
눈치가 빠르신 분은 이미 알아차렸겠지만, 위 소스코드에는 using namespace std;가 빠져 있습니다.
이 때문에 cout 앞에 std::가 붙어 있는데, 이는 cout이 std라는 namespace에 선언된 함수이기 때문입니다.
따라서, 자주 사용하는 cout앞에 매번 범위 지정 연산자를 붙이기 번거로우므로 using namespace std;를 앞에 붙여 사용하는 것입니다.
다음 게시글에서는 C++에서 입출력을 위해 사용하는 cin, cout에 대해 살펴보겠습니다.
'학습 정리 > 📖 C,C++' 카테고리의 다른 글
[C에서 C++로 넘어가기] - 5. 정렬하기 : sort (0) | 2023.01.04 |
---|---|
[C에서 C++로 넘어가기] - 4. 문자열 입력받기 : String (0) | 2023.01.04 |
[C에서 C++로 넘어가기] - 3. cin, cout, endl (0) | 2023.01.04 |
[C에서 C++로 넘어가기] - 2. class (0) | 2023.01.04 |
[C] 유클리드 호제법을 이용해서 최대공약수와 최소공배수 구하기 (0) | 2022.07.06 |