본문 바로가기
Programming Language/C++

[C++] C++의 기본 (1)

by spareone 2025. 4. 30.

C언어와 C++언어의 큰 차이점이라고 한다면,
C언어는 절차 지향 프로그래밍 언어이고 C++는 객체 지향 프로그래밍 언어입니다.

객체 지향 프로그래밍 언어의 특징은 다음과 같습니다.

  1. 캡슐화 (Encapsulation)
  2. 상속성 (Inheritance)
  3. 다형성 (Polymorphism)

1번의 경우 class로 이를 구현하며, class의 기능을 물려받아 또 다른 class를 정의한다는 것이 2번의 개념입니다.
function overloading이나 overriding에 관련된 것들은 3번이며, 이 역시 class와 관련된 것들이 있습니다.

이번 글과 다음 글에서는 C++만이 가지고 있는 기본적인 사항들을 다룰 것입니다.


1. 표준 입출력

C++에서는 다음 함수를 통해 표준 입출력을 처리합니다.

cin : 입력, cout : 출력

#include <iostream>
using namespace std;
 
int main() {
int n;
 
cout << "n 입력 : ";
cin >> n;
 
cout << "입력된 n의 값 : " << n << '\n'; // '\n' 대신 endl로 작성 가능
}

cin, cout을 사용할 경우 C언어에서 써 오던 형식문자(%d)를 사용할 필요가 없습니다.
따라서 변수의 자료형에 상관 없이 코드를 더 직관적으로 작성할 수 있습니다.

cout 줄바꿈 시 ‘\n’ 대신 endl로도 작성 가능합니다. 다만 속도는 ‘\n’이 조금 더 빠릅니다.

하지만 cin, cout을 사용하더라도 문자열 입력에는 한계가 존재합니다.

#include <iostream>
using namespace std;
 
int main() {
char s[20];
 
cout << "s 입력 : ";
// cin >> s; // 공백 입력 불가
cin.getline(s, 20, '\n'); // 공백 입력 가능 ('\n'을 입력의 기준으로 삼으며, 생략 가능)
 
cout << "입력된 s의 값 : " << s << '\n'; // '\n' 대신 endl로 작성 가능
}

cin으로 문자열 입력 시 공백을 처리할 수 없습니다.
이를 위해 다음과 같은 함수를 사용합니다.

cin.getline(문자열 변수, 크기, 기준 문자(기본값 : ‘\n’, 생략 가능))

해당 함수는 기준 문자가 입력될 때 까지 입력을 받으며, 기본값은 ‘\n’ (엔터) 입니다.’
cin.getline(s, 20)은 변수 s에 최대 20의 크기로 공백을 포함한 문자를 받을 수 있습니다.

2. Namespace

다양한 라이브러리를 사용할 경우, 해당 라이브러리에 중복되는 이름이 있을 수 있습니다.
이를 해결하기 위해 namespace라는 개념이 도입되었고, 2개 이상의 라이브러리에서 함수나 class의 이름이 중복되더라도 겹치지 않도록 사용할 수 있습니다.

[그림 1] func 함수가 중복되는 모습

[그림 1]의 경우 func()를 실행할 때, 해당 함수가 LibA의 함수인지 LibB의 함수인지 모호하여 에러를 반환합니다.
이것을 namespace를 이용하여 해결해 보겠습니다.

[그림 2] namespace 적용 구조

A::func()를 실행시키면, A에 해당하는 namespace의 func()를 호출하게 됩니다.
즉, 네임스페이스 이름::호출 요소 이름 코드를 통해 해당 namespace의 요소를 가져올 수 있게 됩니다.

1번에서 cin, cout 함수를 사용했었는데, 이는 std namespace(standard namespace)에 정의된 함수입니다.
따라서 원래 아래와 같이 코드를 작성해야 합니다.

#include <iostream>
 
int main() {
int n;
 
std::cout << "n 입력 : ";
std::cin >> n;
 
std::cout << "입력된 n의 값 : " << n << '\n'; // '\n' 대신 endl로 작성 가능
}

이렇게 해야 하는 이유는, 위에서 언급했듯 cin과 cout이 std namespace(standard namespace) 안에 작성되어 있기 때문입니다.
하지만 이렇게 코드를 작성하게 되면 작성이 불편해지고, 가독성도 떨어집니다.

#include <iostream>
using std::cin;
 
int main() {
int n;
 
std::cout << "n 입력 : ";
cin >> n; // using으로 인해 std:: 사용 불필요
 
std::cout << "입력된 n의 값 : " << n << '\n'; // '\n' 대신 endl로 작성 가능
}

이렇게 using std::cin을 작성할 경우, “cin 함수는 무조건 std namespace 안에서 꺼내 쓰겠다”와 같은 의미가 됩니다.
따라서 cin에 대해서는 앞에 std::를 작성할 필요가 없습니다.
하지만 cout 등 다른 std 요소들은 여전히 std::를 붙여야 합니다.

#include <iostream>
using namespace std;
 
int main() {
int n;
 
cout << "n 입력 : ";
cin >> n;
 
cout << "입력된 n의 값 : " << n << '\n'; // '\n' 대신 endl로 작성 가능
}

std 안에 정의된 요소들을 std:: 없이 사용하기 위해서는 위와 같이 using namespace std를 작성하면 됩니다.
이는 “cin, cout 등 std 안에 정의된 요소들은 무조건 std에서 꺼내 쓰겠다”와 같은 의미가 되며, 보통 include <iostream>과 같이 사용하게 됩니다.

3. Function Overloading

객체지향 요소 중 다형성의 특징에 속하는 함수 오버로딩(함수 중복)입니다.

이는 같은 이름의 함수를 여러 개 사용할 수 있도록 하며,
이것이 가능한 이유는 C++에서 함수를 구별할 때 함수 이름과 매개 변수를 활용하기 때문입니다.

void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
 
void swap(double *x, double *y) {
int temp = *x;
*x = *y;
*y = temp;
}

위 두 개의 swap 함수는 C++에서 서로 다른 함수로 인식됩니다.
함수 이름은 같지만, 매개 변수가 다르기 때문입니다.

swap()을 호출할 때 int *을 매개변수로 보내면 위의 swap이 호출될 것이고,
double *을 매개변수로 보내면 아래의 swap이 호출될 것입니다.

int func(int x) {
...
}
 
double func(int x) {
...
}

return type만 다르다면 서로 다른 함수로 인식하지 않습니다.
즉, 위 2개의 함수는 오버로딩이 불가능합니다.

4. 함수의 기본 매개변수

C++에서는 매개변수 생략 시 default로 지정되는 매개 변수의 값을 작성할 수 있습니다.

int power(int x, int y = 2) {
int res = 1;
for (int i = 0; i < y; i++) {
res *= i;
}
return res;
}
 
power(2); // 2번째 매개변수는 자동으로 2가 됨
 
power(2, 3)

위와 같은 함수를 정의하고 호출할 때, power(2)를 호출하게 되면 2번째 매개변수는 자동으로 default 값인 2가 됩니다.

해당 특징을 이용할 때 고려되어야 할 몇 가지 사항들이 있습니다.

  1. default 매개 변수 지정은 뒤에서부터 가능
    • int power(int x = 2, int y) 와 같은 형식으로 작성할 수 없습니다.
  2. 모호한 호출 상황의 발생 가능성
    • int power(int x), int power(int x, int y = 2) 함수가 정의되어 있고
    • power(2)를 호출할 경우 어떤 함수가 호출되어야 하는지 모호한 상황이 발생합니다.

5. new와 delete

C에서는 malloc()과 free() 함수로 동적 메모리를 할당하고 해제할 수 있습니다.
C++에서는 new와 delete를 이용하여 이를 구현할 수 있습니다.

int *p = (int *) malloc(sizeof(int)) // C에서의 동적 할당
free(p) // C에서의 동적 할당 해제
 
int *p = new int; // C++에서의 동적 할당
delete p; // C++에서의 동적 할당 해제
 
int *p = new int(100); // C++에서는 동적 할당과 동시에 값 초기화 가능
// 해당 코드는 선언과 동시에 값을 100으로 초기화합니다.
 
 
int *p = (int *) malloc(sizeof(int) * 3) // C에서의 동적 배열 할당 (int형 3개)
free(p) // C에서의 동적 배열 할당 해제
 
int *p = new int[3]; // C++에서의 동적 배열 할당 (int형 3개)
delete [] p; // C++에서의 동적 배열 할당 해제

6. bool 자료형

C++에서는 bool 자료형이 추가되어 true, false 값을 사용할 수 있습니다.

bool b1 = true; // int로 형 변환 시 1
bool b2 = false; // int로 형 변환 시 0
 
bool b1 = 4 - 2; // bool로 형 변환 시 true (0이 아니면 true)
bool b2 = 4 - 4; // bool로 형 변환 시 false (0이면 false)

'Programming Language > C++' 카테고리의 다른 글

[C++] 클래스와 객체  (0) 2025.04.30
[C++] C++의 기본 (2)  (0) 2025.04.30
[C++] C언어 살펴보기  (0) 2025.04.30

댓글