소스 코드 201

[C++] 52. 함수 개체

[C++] 함수 개체 이번에는 함수 호출 연산자 중복 정의와 함수 개체를 알아보기로 해요. C++언어에서는 함수 호출 연산자를 중복정의 할 수 있습니다. 함수 호출 연산자의 연산 기호는 ( ) 입니다. 따라서 함수 호출 연산자를 중복 정의할 때 메서드 이름은 operator()입니다. 메서드 뒤에 입력 매개 변수 리스트를 열거하는 ()에는 개발자가 개수와 형식을 결정하고 반환 형식도 개발자가 정합니다. [반환형식] operator() ([입력 매개 변수 리스트]); 그리고 함수 호출 연산자를 중복 정의한 형식의 개체를 함수 개체라고 부릅니다. 함수 개체는 형식 내부에 함수 호출 연산자를 중복 정의하고 있어서 마치 함수처럼 호출하여 사용할 수 있습니다. 먼저 간단하게 함수 호출 연산자 중복 정의를 사용하여..

[C++] 51. 묵시적 형 변환 연산자 중복 정의

[C++] 묵시적 형 변환 연산자 중복 정의 이번에는 묵시적 형변환 연산자 중복 정의를 알아봅시다. C++언어에서 int 형식과 char 형식은 상호 묵시적 형 변환이 가능합니다. 이는 int 형식 변수에 char 형식을 대입하면 컴파일 내부에서 char 형식의 값을 int 형식의 값으로 묵시적 형 변환하여 대입하기 때문입니다. int a = 3; char c = 'a'; c = a; //묵시적 형변환에 의해 a를 char 형식의 값으로 변환 후 대입 a = c; //묵시적 형변환에 의해 c를 int 형식의 값으로 변환 후 대입 C++언어에서는 개발자가 묵시적 형 변환 연산자를 중복 정의할 수 있습니다. 묵시적 형 변환 연산자를 중복 정의할 때는 operator 키워드 뒤에 형 변환할 형식 이름을 사용합..

[C++] 50. 인덱스 연산자 중복 정의

[C++] 인덱스 연산자 중복 정의 이번에는 인덱스 연산자 중복 정의를 살펴보기로 해요. 배열과 같은 컬렉션은 인덱스 연산을 통해 원소에 접근할 수 있게 사용자 편의를 제공하곤 합니다. 배열의 인덱스 연산의 결과는 좌항에 올 수도 있기 때문에 연산 결과는 원소 자체를 의미합니다. 만약 정수 형식의 데이터를 원소로 하는 배열 클래스를 정의하고 인덱스 연산자를 중복 정의한다면 원소 자체를 반환하게 구현해야 하므로 다음과 같이 정의합니다. int &operator[](int index);//인덱스 연산자 중복 정의 다음은 인덱스 연산을 중복 정의하여 정수 형식의 데이터를 보관하는 DCArr 클래스를 정의하고 이를 사용한 예제 코드입니다. //DCArray #pragma once class DCArray { i..

[ C++] 49. 대입 연산자 중복 정의

[ C++] 대입 연산자 중복 정의 이번에는 대입 연산자 중복 정의를 하는 방법을 살펴보기로 할게요. 대입 연산자는 개발자가 정의하지 않으면 디폴트 대입 연산자가 동작합니다. 디폴트 대입 연산자는 디폴트 복사 생성자처럼 단순히 메모리 내용을 복사하는 얕은 복사를 진행합니다. 복사 생성자처럼 클래스 내부에 동적으로 생성한 다른 개체를 갖고 있을 때 깊은 복사를 하는 대입 연산자를 중복 정의할 필요가 있습니다. 깊은 복사와 얕은 복사는 복사 생성자 부분을 다시 살펴보기기 바랍니다. [C++] 16. 생성자, 소멸자 여기에서는 복사 생성자에서 예를 들었던 동적 배열을 예로 들게요. 동적 배열은 생성할 때 보관할 원소의 최대 개수를 입력 인자로 받아 배열을 동적으로 생성하게 할 거예요. DCArray::DCAr..

[C++] 48. 증감 연산자 중복 정의

[C++] 증감 연산자 중복 정의 이번에는 증감 연산자 중복 정의를 하는 방법을 살펴보기로 할게요. 아시는 것처럼 증감 연산자는 단항 연산자로 전위에 올 때와 후위에 올 때 연산 결과가 다릅니다. 전위에 올 때는 값을 증감한 자기 자신이 연산 결과이고 후위에 올 때는 변경하기 전의 자신의 값입니다. 따라서 전위 증감 연산자의 반환 형식은 자기 자신을 전달하기 위해 클래스 형식 &를 사용합니다. 그리고 후위 증감 연산자의 반환 형식은 증감하기 전 자신의 값을 복사한 개체를 상수 값으로 반환하기 위해 const 클래스 형식을 사용합니다. C++에서 증감 연산자 중복 정의할 때 전위인지 후위인지 구분하기 위해 후위 증감 연산자 중복 정의할 때는 스텁 매개 변수를 추가로 받게 정의합니다. 다음은 Score 클래..

[ C++] 44. 상속과 다형성 최종 실습 – 코드

상속과 다형성 최종 실습한 코드예요. //StuConst.h #pragma once class StuConst { public: static const int def_iq; static const int max_iq; static const int min_iq; static const int def_hp; static const int max_hp; static const int min_hp; static const int def_stress; static const int max_stress; static const int min_stress; static const int def_scnt; static const int max_scnt; static const int min_scnt; private:..

[C++] 43. 상속과 다형성 최종 실습 – 파생 클래스

[C++] 상속과 다형성 최종 실습 – 파생 클래스 이제 파생 형식인 학사 학생, 운동학생, 마법학생과 진입점 main 부분을 구현합시다. 먼저 학사 학생 클래스에 필요한 멤버들을 고민해 보기로 해요. class SStudent : public Student { 학사 학생은 더미 뇌가 멤버 필드로 필요합니다. int dummy; 그리고 더미 뇌는 공부한 횟수가 5이 배수일 때마다 1씩 증가해야 하므로 공부한 횟수도 기억해야죠. int total_scnt; public: SStudent(string name); “공부하다.”, “강의받다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.” 메서드를 재정의해야겠죠. virtual void Study(); virtual void ListenLe..

[C++] 42. 상속과 다형성 최종 실습 – 학생

[C++] 상속과 다형성 최종 실습 – 학생 이제 상속과 다형성의 마지막 실습 시나리오를 보고 설계 및 구현해 보기로 해요. 시나리오를 보면 정의할 형식은 학생, 학사 학생, 운동학생, 마법학생이 있습니다. 학생을 기반 클래스로 정의하고 나머지 클래스는 파생 클래스로 정의하면 되겠죠. 먼저 학생 클래스에 필요한 멤버들을 고민해 보기로 해요. 학생 클래스는 멤버 필드로 이름, 주민번호, 체력, 지력, 스트레스와 연속으로 공부한 횟수가 필요합니다. 그리고 주민번호를 순차적으로 부여하기 위해서는 정적 멤버로 가장 최근에 부여한 주민번호가 필요하겠죠. 그리고 멤버 메서드로 “공부하다.”, “자습하다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.”가 필요합니다. 그리고 이들 메서드는 파생 형식..

[C++] 39. 상속, 다형성 실습1 (상품, 할인 상품)

[C++] 상속, 다형성 실습 (상품, 할인 상품) 이제 상속과 다형성 실습을 해 봅시다. 이번 실습은 상품을 소재로 할게요. 시나리오 1. 상품 상품 이름과 가격을 멤버 필드로 갖습니다. 생성할 때 이름과 가격을 입력 인자로 받습니다. 가격과 이름의 접근자를 제공하며 가격 접근자는 가상 메서드입니다. 상품 정보를 출력하는 가상 메서드를 제공합니다. 형식 내부에서만 접근 가능한 가격 설정자와 이름 설정자가 있습니다. 2. 할인 상품 할인율을 멤버 필드로 갖습니다. 상품 이름과 가격, 할인율을 입력 인자로 받습니다. 가격 접근자와 상품 정보 출력하는 메서드를 재정의합니다. 할인율의 접근자 메서드를 제공합니다. 형식 내부에서만 접근할 수 있는 할인율 설장자가 있습니다. 여러분께서 먼저 작성해 본 후에 비교해..

[C++] 38. C++에서의 형 변환

C++에서의 형 변환 이번에는 C++언어에서 제공하는 형 변환에 관해 살펴보기로 해요. 이 부분은 OOP 특징은 아니지만 앞에서 dynamic_cast를 사용하는 방법을 소개하여 다른 형 변환도 알아보려는 거예요. 먼저 C++ 언어에서도 강제 형변환(명시적 형변환이라고도 부름)을 제공하고 있습니다. 하지만 강제 형변환은 잘못 사용하면 심각한 버그를 유발할 수 있습니다. 다음은 서로 관련이 없는 Man 클래스와 Student 클래스를 정의한 후에 강제 형변환을 사용하는 예제입니다. 컴파일 오류는 발생하지 않지만 프로그램 동작 중에 버그로 런 타임 오류가 발생할 수 있습니다. //강제 형 변환이 갖는 위험 요소 #include #include using namespace std; class Man { str..

[C++] 37. 하향 캐스팅

[C++] 하향 캐스팅 이번에는 기반 형식 포인터 변수로 참조하고 있는 형식을 프로그램 동작 시에 파생 형식으로 형 변환하는 하향 캐스팅을 알아보기로 해요. 다형성은 캡슐화와 상속을 보다 효과적이고 현실 세계에 근접하게 표현할 수 있게 해주는 특징입니다. 하지만 기반 클래스 형식 포인터 변수로 파생 개체를 관리하는 것은 치명적인 단점이 있습니다. 만약 기반 클래스 형식에서는 약속할 필요가 없는 메서드가 파생 클래스 형식에 있을 때 해당 메서드의 접근 수준을 public으로 제공해도 접근하지 못합니다. 이러한 약점을 보완하기 위해 많은 OOP언어에서는 런 타임에 파생 개체 형식으로 형 변환(캐스팅)하는 방법을 제공하고 있으며 이를 하향 캐스팅이라 합니다. C++언어에서는 dynamic_cast를 통해 하향..

[C++] 36. 다중 상속

[C++] 다중 상속 이번에는 여러 개의 기반 형식에서 파생하는 형식을 정의하는 다중 상속을 살펴볼게요. C++언어에서는 기반 형식을 여러 개를 정의하는 다중 상속을 지원합니다. 많은 이들은 다중 상속을 사용할 때 주의하라고 권하거나 아예 다중 상속을 사용하지 말 것을 권합니다. 실제 Java나 C#에서는 여러 개의 기반 클래스에서 파생하는 형식을 정의하는 문법을 제공하지 않습니다. C++보다 나중에 만들어진 이들 언어에서는 C++언어의 다중 상속 문법의 위험을 알고 난 이후에 만들어져서 이러한 문법을 제외하고 있습니다. 그렇지만 Java나 C#에서도 여러 개의 인터페이스를 기반으로 파생한 형식을 정의하는 문법은 제공하고 있습니다. 여기에서는 C++언어에서 제공하는 다중 상속이 어떠한 위험을 갖고 있는지..

[C++] 35. 인터페이스 (INTERFACE)

[C++] 인터페이스 (INTERFACE) 이번에는 인터페이스(interface)를 살펴볼게요. 인터페이스는 특정 기능을 구현할 것을 약속한 추상 형식을 말합니다. Java나 C# 등의 다른 OOP언어에서는 인터페이스 형식을 제공합니다. C++언어에서는 인터페이스 형식을 제공하지는 않지만 순수 가상 메서드를 이용하여 정의할 수 있습니다. 인터페이스는 멤버 필드나 구체적으로 구현한 메서드를 갖지 않고 특정 기능을 약속한 메서드만 갖습니다. 그리고 모든 멤버는 사용하는 개발자와의 약속으로 모든 멤버를 public으로 접근 지정합니다. C++언어에서는 구조체는 디폴트 가시성이 public이어서 구조체를 이용하여 인터페이스를 정의하는 이들도 많습니다. #define interface struct interfac..

[C++] 34. 추상 클래스(ABSTRACT CLASS)

[C++] 추상 클래스(ABSTRACT CLASS) 이번에는 추상(Abstract) 클래스를 살펴볼게요. 추상 클래스는 다른 형식의 기반 클래스로만 사용할 수 있고 개체를 생성할 수 없는 클래스를 말합니다. 이에 대응하는 개념으로 개체를 생성할 수 있는 클래스를 구상 클래스입니다. .C++언어에서는 멤버 메서드 중에 순수 가상 메서드를 하나라도 갖고 있는 클래스는 추상 클래스입니다. 순수 가상 메서드는 virtual 키워드로 메서드를 선언하고 메서드 내부를 정의하지 않겠다는 =0;를 표시한 메서드를 말합니다. 그리고 순수 가상 메서드는 다른 OOP 언어에서 추상 메서드와 같은 의미입니다. virtual void Play()=0; //순수 가상 메서드(추상 메서드) 다음은 순수 가상 메서드를 갖고 있는 음..

[C++] 33. 메서드의 다형성

[C++] 메서드의 다형성 형식의 다형성은 기반 형식 포인터 변수로 파생 형식 개체를 설정하거나 기반 형식 참조 변수로 파생 형식 개체를 설정할 수 있는 특징이죠. 그런데 형식의 다형성만 제공한다면 기반 형식 변수로 멤버 메서드를 호출하면 실제 개체 형식에 관계없이 기반 형식에 정의한 메서드가 동작합니다. 메서드의 다형성은 기반 형식 변수로 멤버 메서드를 호출하였을 때 실제 개체 형식에 정의한 메서드가 동작할 수 있는 OOP언어의 특징입니다. 예를 들어 음악가 형식을 기반으로 파생한 형식으로 피아니스트와 드러머가 있다고 가정할게요. 그리고 음악가에는 “연주하다.”와 “인사하다.” 기능을 제공할거예요. “인사하다.” 기능은 파생 형식에 관계없이 같은 동작을 수행하지만 “연주하다.” 기능은 파생 형식에 따라..

[C++] 32. 형식의 다형성

[C++] 형식의 다형성 이번에는 형식의 다형성을 살펴볼게요. 형식의 다형성은 기반 형식 포인터 변수로 파생 형식 개체를 설정하거나 기반 형식 참조 변수로 파생 형식 개체를 설정할 수 있는 특징입니다. 예를 들어 음악가 형식을 기반으로 파생한 형식으로 피아니스트와 드러머가 있다고 가정할게요. “피아니스트는 음악가이다.”, “드러머는 음악가이다.” 처럼 일반화관계로 정의하기 적합한 관계죠. 만약 음악가 형식 포인터 변수가 있다면 음악가 개체를 설정할 수 있겠죠. 그런데 피아니스트와 드러머는 음악가가 아닌가요? 네. 피아니스트나 드러머도 음악가입니다. 이러한 일반화관계의 특징을 OOP언어에서 활용할 수 있게 만든 문법이 다형성입니다. void StartConcert(Musician *musician); in..

[C++] 31. 다형성 개요

[C++] 다형성 개요 이번에는 OOP의 주요 특징 세 가지인 캡슐화, 상속, 다형성 중에 다형성에 관해 살펴봅시다. 다형성은 기반 형식의 멤버를 파생 형식에서 상속받는 장점을 활용할 수 있는 OOP 특징입니다. 하나의 기반 형식에서 파생한 다양한 파생 클래스가 있을 때 같은 형식의 변수로 접근할 수 있으면 프로그래밍을 효과적으로 할 수 있겠죠. C++언어에서는 기반 형식의 포인터 변수로 파생 형식의 개체를 설정할 수 있습니다. 그리고 기반 형식의 참조 변수로 파생 형식의 개체를 설정할 수도 있습니다. class Musician { }; class Pianist:public Musician { }; int main() { Musician *musician = new Pianist(); //기반 형식 포인..

[C++] 30. 무효화

[C++] 무효화 기반 클래스에서 정의한 멤버 메서드와 같은 이름으로 파생 형식에서 정의하면 어떻게 동작할까요? 파생 클래스에서 기반 클래스에 정의한 이름과 같은 이름으로 메서드를 만들면 기반 클래스에 정의한 메서드를 무효화합니다. 예를 들어 일반 프로그래머가 있고 EH 프로그래머가 있는데 대부분의 행위에 있어 EH 프로그래머는 일반 프로그래머와 같게 일을 한다고 가정합시다. 하지만 일반 프로그래머가 프로그래밍을 할 때 “생각하면서 코딩을 한다.”와 같이 하는데 EH 프로그래머가 프로그래밍을 할 때는 “생각한 것을 문서화 하고 이를 보면서 코딩을 한다.”고 해 볼게요. 이 때 일반 프로그래머의 프로그래밍이라는 메서드를 무효화합니다. //무효화 #include #include using namespace ..

[C++] 27. 상속(일반화 관계) 개요

[C++] 상속(일반화 관계) 개요 이제 OOP의 세 가지 주요 특징인 캡슐화, 상속, 다형성 중에 상속에 관해 알아볼게요. 상속은 다른 형식에 정의한 것을 마치 자신에서 정의한 것처럼 만드는 OOP의 특징입니다. 이러한 관계를 UML에서는 일반화 관계라 부르고 삼각형과 실선으로 관계를 표시합니다. 일반화 관계는 “피아니스트는 음악가이다.”처럼 “이다.(is a)”로 나타낼 수 있는 관계입니다. 이 때 음악가처럼 일반적인 클래스를 기반 클래스라 말하며 피아니스트처럼 특수한 클래스를 파생 클래스라 부릅니다. C++에서 일반화 관계를 표현할 때 파생 문법을 이용합니다. 파생 문법은 파생 클래스를 정의할 때 기반 클래스를 다음처럼 나타냅니다. class Pianist : public Musician { }; ..

[C++] 26. 캡슐화 최종 실습 – 구체적 구현

[C++] 캡슐화 최종 실습 – 구체적 구현 이제 마지막으로 메서드를 구체적으로 구현합시다. 약속한 기능을 구현하면서 필요하면 별도의 메서드를 추가하세요. 여기에서 추가하는 메서드는 다른 형식에서 호출해서 사용하지 않는 메서드이므로 접근 지정을 private으로 지정하세요. 특히 멤버 필드의 값이 특정 범위 내에 있어서 필터링을 요구하면 설정자 메서드를 추가하여 구현하세요. 설정자 메서드에서 멤버 필드 값을 범위 내에서 조절하는 기능을 작성하면 버그를 만들 확률을 줄일 수 있습니다. 여러분께서 각자 구현해 본 후에 비교해 보세요. 여기에서는 지력, 체력, 스트레스, 연속으로 공부한 횟수는 범위가 정해져 있습니다. 이에 이들 멤버 필드 값을 설정하는 설정자를 추가합시다. 물론 이들 메서드는 형식 외부에서 ..

[C++] 23. 캡슐화 최종 실습 – 멤버 필드 24. 멤버 메서드 25. 테스트 코드 작성

[C++] 캡슐화 최종 실습 – 멤버 필드 23. 캡슐화 최종 실습 – 멤버 필 먼저 클래스 이름은 Student로 정할게요. 주민 번호는 변하지 않으므로 상수화 멤버 필드로 정의하세요. const int pn;//주민번호 주민 번호를 순차적으로 부여하기 위해 정적 멤버 필드로 가장 최근에 부여한 주민 번호가 필요하겠죠. static int last_pn;//가장 최근에 부여한 주민 번호 이름은 문자열로 정하면 되겠죠. string name;//이름 지력과 체력, 스트레스, 연속으로 공부한 횟수는 정수 형식으로 정의하면 되겠네요. int iq;//지력 int hp;//체력 int stress;//스트레스 int scnt;//연속으로 공부한 횟수 최소값, 최대값, 디폴트 값은 형식 내에 정해진 값이므로 정..

[C++] 21. 캡슐화 실습2 – 학생

[C++] 캡슐화 실습 – 학생 클래스 이번 실습은 학생 클래스를 캡슐화하는 실습입니다. 이번에는 시나리오를 보고 클래스 다이어그램을 작성한 후에 이를 구현해 보기로 해요. 1. 시나리오 학생은 생성할 때 학생 이름을 전달받습니다. 그리고 학생 번호는 순차적으로 부여합니다. 이 외에 학생의 국어, 영어, 수학 성적을 -1로 설정합니다. 학생을 생성한 후에는 학생의 국어, 영어, 수학 성적을 입력할 수 있습니다. 만약 학생 성적이 0에서 100을 벗어나면 -1로 설정합니다. 학생 이름과 번호, 각 과목의 성적과 총점 및 평균을 확인할 수 있습니다. 그리고 전체 학생 수를 확인할 수 있습니다. 그리고 학생 정보를 출력하는 기능을 제공합니다. 2. 클래스 다이어그램으로 나타내기 먼저 클래스 이름을 결정해야겠죠..

[C++] 20. 캡슐화 실습1 – 복소수

[C++] 캡슐화 실습 – 복소수 캡슐화 실습을 해 보기로 해요. 이번에는 복소수 클래스 캡슐화예요. OOP 프로그래밍 할 때 구현 이전의 작업과 이후의 많은 작업을 CASE 도구로 UML로 표현할 때가 많아요. CASE 도구에는 Rose, Together, StarUML 등이 있습니다. 이 책에서는 CASE 도구를 사용하는 방법을 구체적으로 다루지는 않지만 많은 곳에서 UML로 작성한 다이어그램으로 실습할 내용 등을 소개할 거예요. UML로 클래스를 표현할 때는 세 칸으로 구성한 사각형으로 나타내요. 맨 위는 클래스 이름, 두 번째는 멤버 필드, 마지막 칸은 멤버 메서드를 표현합니다. 멤버 앞에 +(public), -(private), #(protected)은 접근 지정자를 나타내죠. 그리고 멤버 필드..

[C++] 19. 특별한 멤버 this

[C++] 특별한 멤버 this 개체의 메서드에서는 특별한 키워드 this를 사용할 수 있어요. this는 컴파일러에 의해 자동으로 캡슐화하는 정적 멤버입니다. this 키워드는 개체 자신을 나타내며 클래스 형식의 포인터입니다. this 키워드를 통해 접근할 수 있는 것은 클래스에 캡슐화한 멤버입니다. 따라서 멤버 필드와 지역 변수와 같은 이름이어도 this 키워드로 접근하면 멤버 필드를 접근합니다. 참고로 전역 변수와 지역 변수, 멤버 필드의 이름이 같을 때 전역 변수는 스코프 연산자(::)와 함께 사용할 수 있고 멤버 필드는 this 키워드와 함께 사용할 수 있습니다. 지역 변수는 변수명만 가지고 접근할 수 있죠. 물론 이름이 다르다면 스코프 연산자(::)나 this를 굳이 사용할 필요는 없어요. /..

[C++] 18. 상수화 멤버

[C++] 상수화 멤버 클래스를 정의할 때 멤버 필드 앞에 const를 붙여서 선언한 것을 상수화 멤버라고 말합니다. 비 정적 상수화 멤버 필드는 생성자에서 반드시 초기화 기법으로 상수 값을 설정해야 합니다. 그리고 정적 상수화 멤버 필드는 클래스 외부 선언에서 초기값을 지정해야 합니다. class Student { const int num; //비 정적 상수화 멤버 필드 string name; int hp; static const int max_hp; //정적 상수화 멤버 필드 public: Student(int _num,string _name); }; const int Student::max_hp=200; //정적 상수화 멤버 필드 초기값 지정 Student::Student(int _num,strin..

[C++] 17. 정적(static) 멤버

[C++] 정적(static) 멤버 멤버의 종류를 나누는 기준은 여러 기준이 있어요. 그 중에 하나가 해당 멤버가 개체의 멤버인지 혹은 형식의 멤버인지로 구분하는 거예요. 이러한 기준으로 구분하면 형식의 멤버와 개체의 멤버로 구분할 수 있어요. 형식의 멤버는 static 키워드를 사용하여 선언해서 정적(static) 멤버, 개체의 멤버를 비정적 멤버라 불러요. C++에서 정적 멤버는 형식 정의 내에서 해당 멤버를 static 키워드를 붙여 선언합니다. 정적 멤버들은 개체마다 제공하는 멤버가 아니라 형식 내에 유일한 멤버예요. 학생을 생성할 때 학생의 일련번호를 차례대로 부여한다고 할 때 학생의 일련번호는 각각의 학생마다 별도로 유지해야죠. 하지만 이번에 생성할 학생에게 어떠한 일련번호를 부여할 것인지는 ..

[C++] 16. 생성자, 소멸자

[C++] 생성자, 소멸자 이번에는 개체를 생성할 때 수행하는 생성자와 소멸할 때 수행하는 소멸자를 알아볼게요. 생성자는 개체를 생성할 때 수행할 기능을 정의하는 특별한 메서드입니다. 생성자는 반환 형식을 개발자가 정할 수 없으며 메서드 이름을 형식 이름과 같게 정의합니다. 그리고 소멸자는 개체를 소멸할 때 수행할 기능을 정의하는 특별한 메서드예요. 소멸자도 반환 형식을 개발자가 정할 수 없으며 메서드 이름은 ~형식 이름이예요. #pragma once //Student.h class Student { public: Student(void);//생성자 ~Student(void);//소멸자 }; C++ 언어에세 생성자는 개체가 만들어지는 시점에 동작합니다. 예를 들어 Student stu; 처럼 클래스 형식..

[C++] 15. 접근 지정자

[C++] 접근 지정자 이번에는 멤버의 가시성을 설정하는 접근 지정자에 관해 알아볼게요. C언어의 구조체는 모든 곳에서 모든 멤버를 접근할 수 있어요. 이러한 특징은 개발자가 멤버에 접근하기 쉬워서 구현하기 쉽게 생각할 수 있지만 시나리오에 맞게 데이터를 유지하는 것은 어려울 수 있어요. 예를 들어 설명할게요. 프로그램에서 이름, 번호, 아이큐를 멤버로 갖는 학생 형식이 있다고 가정합시다. 학생 개체는 생성할 때 이름과 번호를 부여하고 아이큐는 100으로 설정하기로 해요. 그리고 학생이 공부하면 아이큐가 공부한 시간만큼 증가하게 만들거예요. 단 아이큐는 300을 넘지 않게 하기로 해요. 그런데 학생 개체를 사용하는 곳에서 학생 구조체의 멤버에 접근할 수 있어서 “공부하다.” 기능을 호출하지 않고 직접 아..

[C++] 14. 캡슐화 개요

[C++] 14. 캡슐화 개요 이제 C++언어에서 캡슐화에 관한 사항을 알아보기로 해요. 캡슐화는 여러 개의 멤버를 하나의 형식으로 묶는 과정을 말합니다. C언어에서는 구조체를 이용하여 캡슐화를 했었죠. C++언어에서도 구조체를 이용하여 캡슐화를 할 수 있습니다. 하지만 일반적으로 클래스를 이용하여 캡슐화를 할 때가 대부분입니다. 먼저 C언어에서의 캡슐화와 C++언어에서의 캡슐화의 차이를 간단하게 알아볼게요. C언어에서 구조체에는 데이터만 멤버 필드(멤버 변수)로 캡슐화할 수 있었죠. 하지만 C++에서는 기능도 멤버 메서드로 캡슐화를 할 수 있습니다. 그리고 C언어에서는 캡슐화한 멤버를 모든 곳에서 접근할 수 있지만 C++언어에서는 구조체에 접근 지정자를 사용하여 가시성을 설정할 수 있습니다. 그리고 앞..

[C++] 13. OOP 개요

[C++] OOP 개요 이제 C++언어가 갖는 주요 특징인 OOP(Object Oriented Programming, 개체(객체) 지향 프로그래밍)에 관한 사항을 다루기 시작할게요. 특히 OOP에 관한 특징들은 클래스 문법을 통해 다룰거예요. OOP란 프로그램의 세계에 현실 세계를 반영하자는 것에서 출발했어요. 우리가 사는 현실 세계는 수 많은 생명체들이 메시지를 서로 주고 받으면 살아가고 있어요. 이처럼 프로그램도 개체들이 서로 메시지를 주고 받으며 동작하게 하자는 것이죠. 그런데 프로그램에서는 개체를 만들기 위해서는 먼저 형식 정의가 필요해요. 현실 세계에서는 사람이나 호랑이, 음악가, 학생처럼 추상적인 개념을 정의하고 있죠. 마찬가지로 프로그램에서도 형식을 정의할 수 있는데 C++언어와 Java, ..