본문 바로가기
프로그래밍/그래픽스

[C++] C++ 프로그래밍 언어의 특징 및 기본 코드 예제

by moo-ti 2023. 8. 15.
반응형

C++

1979년, 덴마크의 컴퓨터 과학자 비야네 스트롭스트룹(1950-12-30 ~)은 C++ 프로그래밍 언어를 개발한 것으로 유명한 덴마크의 컴퓨터 과학자이다. 비야네 스트롭스트룹은 C++의 선구 자격 언어인 "C with Classes" 작업에 착수하였다. 1985년 C++ 언어의 특징은 C언어에 객체지향 프로그래밍을 지원하기 위한 내용이 덧붙여진 것이라고 할 수도 있지만, 애초부터 객체지향을 염두에 두고 만들어진 언어와는 다르게 C언어로서 더 좋은 수속형 언어로 취급하기도 한다. 수속형 언어란 주어진 문법 규정에 따라 처리 과정을 써서 이를 연결하여 프로그램을 작성하는 컴퓨터 프로그래밍 언어를 말한다. 예로는 포트란, 알골, 코볼 따위의 컴파일러 언어가 있다. 초기의 C++는 C 위에 놓인 번역기(translator)로 구현되었다. 즉, C++ 프로그램을 일단 C 프로그램으로 변환하고 나서 C 컴파일러로 컴파일하는 식이었고 따라서 C 언어에 대해 상위 호환성을 갖는 언어였다. 과거에는 그랬으나 그 후에 C언어의 표준 규격이 바뀌면서 const 수식 등 C++의 기능이 C 언어에 받아들이기도 했다. 현재 C 언어와 C++와의 사이에는 엄격한 호환성은 없다.

 

class Capsule
{
public:
	Capsule() { }
    int getData();		// 은닉된 데이터는 메서드를 사용해 인터페이스로 사용 한다.
    
private:			// 자기 클래스에서만 액세스를 한정한다. 은닉하는 방법으로 사용.
	int data;
};

int Capsule::getData()
{
	return this->data;	// this 가 자동으로 넘어온다.
}

C++의 캡슐화

캡슐화는 2가지 요소를 만족하도록 언어적으로 구현되어야 한다. 바로 데이터와 메소드 결합, 외부에 데이터나 메소드를 은닉하는 것이다. 첫 번째 데이터와 메소드의 결합은 객체의 저장 공간의 위치를 함수에 넘김으로써 데이터와 메소드를 결합하는 것이다. this는 객체의 위치 주소 값인 포인터이다. 그리고 객체지향 프로그래밍에서 작성된 프로그램 코드는 재사용이 중요하기 때문에 사용 방법을 잘 알고 사용해야 한다. 보통 클래스 안에 깊숙이 알 필요가 없는 경우가 많은데 그럴 경우에 따라 객체를 설계할 때 멤버 변수나 멤버 함수를 다 알릴 필요가 없다. 어떤 요소들은 내부에서만 사용하고 비공개로 설정할 필요가 있다. 이런 비공개의 방법(private, protected, public 접근 제한자)으로 은닉을 선정하고 캡슐화의 한 요소가 될 수 있다.

위 코드를 보자. 여기서 데이터와 메소드의 결합은 멤버 함수를 구성할 때 this라는 포인터로 상징되는 것을 개발자 코드 내에 코딩 없이도 자동으로 넘겨주어 해당 클래스 내의 멤버 변수들을 사용하게 함으로써 언어적으로 결합한다. this는 자동으로 객체의 공간 위치 값이 메모리의 주소 값이다. Capsule:: 가 붙는 클래스의 멤버 함수는 실행할 때 자동으로 모두 this가 넘어가며 static 메소드는 this가 제외된다.

 

C++로 Hello World 를 출력하는 프로그램

# include <iostream> //iostream이라는 헤더를 가져온다

using namespace std; //namespace의 std 모듈을 사용한다

int main() { //메인메소드의 시작지점이다.

    cout << "Hello, world!" << endl; //"Hello, World!" 콘솔로 출력한다.

    return 0; //0을 리턴해 프로그램을 확실히 종료시킨다.
}//메인메소드를 끝낸다

만약 C++ 20의 모듈 기능을 이용한다면 다음과 같이 쓸 수 있다.

import std.core;

using namespace std;

int main() {

    cout << "Hello, world!" << endl;

    return 0;
}

되도록 void main을 사용하지 않는 것이 좋다. 컴퓨터는 프로그램이 0이 아닌 수를 돌려보내면 그 프로그램이 제대로 종료되었다고 생각하지 않는다. 즉, int main으로 숫자 0을 반환해 프로그램이 잘 종료되었다는 것을 컴퓨터에 알려주는 것이 좋다. 아까 설명한 접근자를 이용해서 클래스도 캡슐화가 가능하다. 따라서 객체를 설계할 때는 특정 멤버 변수나 멤버 함수를 외부에서 접근을 제한할 필요가 있다. 접근 제어 키워드는 3가지로 private, public, protected가 있다. private 은 자기 클래스에서만 접근을 허용한다. 그리고 public은 모두 접근을 허용한다. 또 protected는 자기 클래스와 상속을 받은 자식 클래스에서만 접근을 허용한다. C언어에서는 전역변수와 지역변수, 그리고 동적할당에 의한 데이터 저장공간을 만들 수 있다. 마찬가지로 C++에서도 전역변수로 객체를 생성할 수도 있고 지역변수로 생성하는 것도 가능하다. 또한 new를 통해 동적으로 객체를 생성시킬 수 있다.

 

 

정적 할당 객체
C++에서 변수를 잡듯이 객체도 선언을 통해 이루어진다. C에서 전역변수와 지역변수로 나누는 것과 같이, 객체 역시 같은 방식으로 전역 또는 지역 객체로 선언할 수 있다.전역 정적 객체는 main() 함수가 실행되기 전 저장공간이 생성되고, 생성자가 호출된다. 객체가 생성되면 메모리에 데이터 저장공간이 생기고 바로 생성자가 호출된다. 따라서 전역 정적 객체 생성자의 호출은 main 함수보다 먼저 이루어진다.

동적 할당 객체
new에 의해 생성되고, delete에 의해 삭제된다. new로 생성되면, new 실행 시점에서 객체의 저장공간인 메모리를 확보하고 생성자가 자동 실행된다. 동적 객체는 힙영역에 존재하고 포인터를 넘겨받아서 객체 포인터 변수에 주소 값을 저장하고 처리한다.'new'의 코딩은 함수에 넣을 수밖에 없으므로 main 함수 시작 이후에야 가능하다.이미 설정된 메모리 공간을 이용하여 객체 정의하기 C/C++는 포인터를 사용한다. 이것은 객체의 크기만 확보되면 객체를 사용하는 데 아무 문제가 없다. 따라서 이미 설정된 변수를 포인터를 이용하여 객체화해서 사용할 수 있다.

 

반응형

'프로그래밍/그래픽스' 카테고리의 다른 글

JAVA  (0) 2023.08.24
컴파일러(Compiler)란?  (0) 2023.08.20
프로그래밍(Programming)이란?  (0) 2023.08.19
[C] C언어의 장점과 단점  (0) 2023.08.15
[C] C언어 프로그래밍과 알고리즘 개론  (0) 2023.08.14