학습 정리/📖 C,C++

[C에서 C++로 넘어가기] - 1. C와 C++의 차이, namespace

무딘붓 2023. 1. 3. 15:46

 

코딩테스트 준비를 위해 C++을 공부한 내용을 정리하고자 게시글을 작성하게 되었습니다.

대학에서 C언어를 공부한 상태에서 C++을 공부하는 상태이므로
C와 중복되는 개념을 제외하고, C와 C++의 차이점을 위주로 정리하고 있습니다.

 

목차 (update 23.05.19)

[C에서 C++로 넘어가기] - 1. C와 C++의 차이, namespace

[C에서 C++로 넘어가기] - 2. class

[C에서 C++로 넘어가기] - 3. cin, cout, endl

[C에서 C++로 넘어가기] - 4. 문자열 입력받기 : String

[C에서 C++로 넘어가기] - 5. 정렬하기 : sort

[C에서 C++로 넘어가기] - 6. vector

[C에서 C++로 넘어가기] - 7. 이진 탐색- binary_search(), upper_bound(), lower_bound()

 

 

개인 학습용으로 정리하고 있는 게시글이라, 잘못된 정보가 많이 있을 수 있습니다.
위 게시글들은 간단히 참고하는 정도로 사용하시고 자세한 내용은 아래 사이트를 참조하시는걸 추천드립니다.

 

https://learn.microsoft.com/ko-kr/cpp/cpp/?view=msvc-170

 

C++ 문서 - 시작, 자습서, 참조.

Microsoft C++ 및 Visual Studio 사용자를 위한 C++ 프로그래밍 참조.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/cpp/standard-library/cpp-standard-library-reference?view=msvc-170&viewFallbackFrom=vs-2019 

 

C++ 표준 라이브러리 참조

자세한 정보: C++ STL(표준 라이브러리 참조)

learn.microsoft.com

 


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언어의 문법과 호환이 되지만, 차이점도 당연히 존재합니다.

아래 내용은 아래 링크를 참고하여 작성하였습니다.

 

https://ko.wikiversity.org/wiki/%ED%8F%AC%ED%84%B8:%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%B5%ED%95%99/C%2B%2B/C%EC%96%B8%EC%96%B4%EC%97%90%EC%84%9C_C%2B%2B%EB%A1%9C_%EB%84%98%EC%96%B4%EA%B0%80%EA%B8%B0

 

포털:컴퓨터공학/C++/C언어에서 C++로 넘어가기 - 위키배움터

이 문서는 대문/포털:컴퓨터공학/C++의 하위문서입니다. 문서를 수정하기 전에 토론:대문/포털:컴퓨터공학/C++을 참고해 주시기 바랍니다. C에서 C++로 넘어가기[편집] 우리는 C언어에서 다음과 같

ko.wikiversity.org

 

한번 간단하게 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에 대해 살펴보겠습니다.