본문 바로가기

Programming Languages

(32)
[클래스와 객체]-생성자의 종류-복사 생성자 복사 생성자(copy constructor)란 같은 클래스의 객체를 복사하여 객체를 만드는 생성자이다. 만일 복사 생성자를 명시적으로 선언하지 않으면 컴파일러는 원본 객체의 멤버들을 그대로 복사하여 객체를 정의하는 복사 생성자를 자동으로 만든다. 예를 들어 [소스코드 4-6]의 클래스 CounterM의 객체를 다음과 같이 정의하였다고 하자. CounterM cnt4(99); // ① 0부터 99까지 카운트하는 계수기 객체 CounterM cnt5(cnt4); // ② cnt4를 복사한 계수기 객체 cnt5 정의 CounterM cnt6 = cnt4; // ③ cnt4를 복사한 계수기 객체 cnt6 정의 객체 cnt4는 데이터 멤버 maxValue와 value가 각각 99와 0인 상태로 정의될 것이다. 그..
[클래스와 객체]-생성자의 종류-디폴트 생성자 생성자는 어떠한 매개변수를 이용하여 객체를 초기화할 것인가에 따라 여러 개를 다중정의할 수 있다. 이러한 생성자 중에는 디폴트 생성자, 복사 생성자, 이동 생성자라는 특별한 유형의 생성자가 있다. 디폴트 생성자(default constructor)는 매개변수가 없는 생성자 또는 매개변수가 있지만 모두 디폴트 값이 있는 디폴트 인수만 포함하고 있는 생성자이다. ex) CounterM() { value = 0; } 위 예제의 생성자는 매개변수를 가지고 있지 않으므로 디폴트 생성자이다. 만일 클래스를 선언할 때 생성자를 선언하지 않으면 컴파일러는 아무런 일도 하지 않는 디폴트 생성자를 만든다. [소스코드 4-1]에 예시된 Counter 클래스는 생성자를 포함하고 있지 않으므로, 컴파일러는 다음과 같은 생성자를..
[클래스와 객체]-생성자와 소멸자-소멸자 소멸자(destructor)는 객체가 소멸될 때 자동으로 실행되는 함수로서, 객체의 소멸에 따라 필요한 제반 처리를 하기 위한 코드가 포함된다. 클래스 선언문 내에서 소멸자의 선언 형식은 다음과 같다. class ClassName{ ...... public: ...... ~ClassName(){ // 소멸자 ...... } }; 소멸자의 선언형식 역시 일반 멤버함수와 유사하나, 다음과 같이 고유한 사항도 있다. 소멸자는 클래스이 이름에 ' ~ '를 붙여 선언한다. return 명령으로 값을 반환할 수 없으며, 함수 머리에 반환할 자료형을 표시하지 않는다. 매개변수를 포함할 수 없다. 소멸자는 다중정의할 수 없으며, 클래스에 하나만 정의한다. public 멤버로 선언하는 것이 일반적이다. 상속을 통해 파생..
[클래스와 객체]-생성자와 소멸자-생성자 객체의 속성(즉, 데이터 멤버)은 객체의 현재 상태를 나타내는 값이다. 그러므로 처음 객체가 만들어졌을 때에는 그 객체의 초기 상태를 적절히 지정하여 두어야 한다. 반드시 수행해야 하는 초기화 과정을 실수로 누락하면 프로그램은 올바로 동작하지 않는다. 이러한 실수가 발생하지 않도록 초기화 과정을 자동화할 수 있다면 불필요한 에러를 유발하지 않을 수 있다. 이러한 목적으로 사용할 수 있는 것이 생성자(constructor)이다. 생성자는 객체가 생성될 때 수행할 작업을 정의하는 특수한 멤버함수로서, 객체를 정의하는 문장에 의해 자동적으로 호출된다. 생성자의 선언 생성자의 기본적인 선언 형식은 다음과 같다. class ClassName{ ...... public: ClassName(fParameterList..
[클래스와 객체]-클래스 선언과 객체 정의 클래스는 C++ 언어에서 객체지향 개념을 구현하기 위한 도구로서, 프로그램에서 사용하고자 하는 객체들에 대한 형판을 정의한 것으로 볼 수 있다. 즉, 클래스와 객체의 관계는 자료형과 변수의 관계와 유사하다. 그러나 자료형이 변수가 저장할 데이터의 형태만 정의한 반면, 클래스는 각각의 객체를 표현하는 속성과 함께 그 객체들에 대한 메시지를 처리하는 메소드를 정의해 놓은 것 이다. 그리고 객체는 이러한 형판에 따라 만들어진 사례가 되는 것이다. C++ 언어에서는 클래스 안에 정의한 속성들을 데이터 멤버(data member)라고 부르고, 메소들르 멤버함수(member function)라고 부른다. 클래스의 선언 클래스 선언문의 형식은 다음과 같다. class ClassName { 가시성_지시어_1: 데이터 ..
[클래스와 객체]-객체지향 프로그래밍의 주요 개념 C++ 언어는 객체지향 프로그래밍을 지원하는 프로그래밍 언어이다. 객체지향 언어의 효시는 1967년에 발표된 Simula67이다. 그 이름을 통해 예상할 수 있는 것처럼 Simula는 시뮬레이션(simulation)을 위해 개발된 언어이다. 시뮬레이션이란 현실세계에 존재하는 여러 가지 개체와 이들이 상호작용하는 과정을 컴퓨터를 통해 가상으로 수행하는 것이다. 이처럼 객체지향 개념의 태동이 시뮬레이션과 관계가 있다는 점은 객체지향을 이해하는데 큰 의미가 있다. 즉, 분석의 출발점이 '어떠한 프로세스를 통해 작업을 수행하는가'가 아니라 '현실세계를 시물레이션하는 컴퓨터 내의 가상세계 안에 어떠한 개체들이 존재하는가'이다. 시뮬레이션의 대상이 되는 개체들은 각각 정해진 동작을 하며, 그 과정에서 개체 각각의 ..
[함수]-inline 함수 함수를 호출하는 과정에는 인수를 전달하고, 함수의 위치로 분기하며, 결과를 반환하고, 호출한 위치로 되돌아오는 동작이 수반된다. 이에 따른 처리시간 및 코드의 증가는 비록 미미한 것이지만, 때로는 매우 빠른 처리가 필요하여 불필요한 시간 지연을 피하고 싶을때가 있다. 특히 모듈의 크기가 매우 작아 모듈을 실행하는 시간이나 모듈 크기가 함수 호출에 따른 부수적인 시간 및 크드의 양과 큰 차이가 없고, 이 모듈을 매우 빈번히 호출한다면 함수를 사용하지 않는 것이 더 바람직할 수 있다. inline 함수는 함수가 가지는 모듈화의 장점을 살리면서 이러한 불필요한 실행 효율 저하를 막기 위해 사용할 수 있다. inline 함수를 작성하는 것은 inline 키워드를 사용하는 것 외에는 일반 함수와 동일하다. 그러나..
[함수]-함수의 다중정의 다중정의(overloading)란 동일한 이름에 대하여 여러 가지 의미를 부여하는 것이다. C++ 언어에서는 함수를 다중정의할 수 있다. 즉, 동일한 이름을 갖는 함수를 여러 개 정의할 수 있다. 함수를 다중정의하는 것은 동일한 개념의 처리를 다양한 데이터나 객체에 대해 해야 할 경우 쓰인다. 각각의 대상에 맞는 처리방법을 같은 이름을 갖는 함수들로 만듦으로써 의미를 일맥상통하게 만들어 주는 효과가 있다. 함수를 다중정의한 경우, 사용되는 함수가 같은 이름을 가지고 있는 여러 함수 중에서 어느 함수를 의미하는가를 구분할 수 있어야 한다. 구분의 기준은 인수의 개수 및 인수의 자료형이다. 컴파일러는 이를 근거로 동일한 이름을 갖는 여러 함수 중에서 어느 함수를 사용한 것인지를 알아낸다. 반환 자료형은 구분..