C & C++/디딤돌 C++ 66

[C++] 41. 상속과 다형성 최종 실습 시나리오

[C++] 상속과 다형성 최종 실습 시나리오 이제 상속과 다형성의 마지막 실습이예요. 다음의 시나리오를 보고 직접 클래스 다이어그램도 작성해 보고 구체적으로 구현해 보세요. 시나리오 프로그램이 시작하면서 학사 학생과 운동 학생, 마법 학생을 한 명씩 생성 학생을 생성 후 전체 학생에게 강의=>자습=>잠자기=>휴식하기=>음료마시기=>노래하기 순으로 진행 (각 단계마다 학생 정보를 출력) 자습하기에서는 해당 학생이 학사 학생이면 독서도 지시함 휴식하기에서는 해당 학생이 마법 학생이면 여행도 지시함 노래하기에서는 해당 학생이 운동 학생이면 춤추게 지시함 1. 학생 멤버 필드로 이름, 주민번호, 체력, 지력, 스트레스가 있음 주민번호: 순차적 부여 이름: 생성 시 전달 지력:100(최소 0, 최대 200) 체력..

[C++] 40. 상속과 다형성 실습2 (도형)

[C++] 상속과 다형성 실습 (도형) 이번 실습은 도형을 소재로 할게요. 위 그림은 Visual Studio에서 제공하는 기능을 사용하여 출력한 클래스 다이어그램입니다. 시나리오 1. 도형 도형 ID를 순차적으로 부여합니다. 순수 가상 메서드로 Draw 메서드를 제공합니다. 파생 형식에서도 접근 가능한 GetID 접근자를 제공합니다. 2. 점 x와 y 좌표 멤버를 갖습니다. 생성자에서 x, y 좌표를 입력 인자로 받습니다. Draw 메서드를 재정의합니다. 3. 선 두 개의 점을 멤버로 갖습니다. 생성자에서 두 점의 x, y 좌표를 입력 인자로 받습니다. Draw 메서드를 재정의합니다. 여러분께서 먼저 작성해 본 후에 비교해 보세요. 작성하다 막히면 앞에 상속과 다형성에 관한 내용을 보시면서 하시기 바랍..

[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++] 29. 접근 지정자 protected

[C++] 접근 지정자 protected 이번에는 접근 지정자 protected에 관해 알아보기로 해요. 캡슐화에서 접근 지정자를 사용하여 멤버의 가시성을 설정할 수 있다는 것을 다뤘었죠. private으로 접근 지정한 것은 형식 내부에서 사용할 수 있고 public으로 지정하면 모든 곳에서 접근할 수 있다는 것은 이미 소개하였습니다. 파생 클래스를 정의하면 기반 형식의 멤버를 상속받는다고 하였는데 접근 지정을 private으로 설정한 멤버는 어떻게 접근할까요? priavate으로 접근 지정한 멤버는 파생 클래스에서도 접근할 수 없습니다. 분명히 상속받아 개체 내부에 있지만 가시성이 없어 접근할 수 없습니다. 이럴 때는 기반 클래스에서 protected로 접근 지정하여 파생 클래스에서 접근할 수 있게 해..

[C++] 28. 파생 개체의 생성과 소멸 과정

[C++] 파생 개체의 생성과 소멸 과정 이번에는 일반화 관계에 있는 파생 클래스 형식의 개체를 생성과 소멸 과정을 알아보기로 할게요. 파생 클래스 형식의 개체를 생성할 때는 기반 클래스를 생성한 후에 파생 클래스를 생성합니다. 실제 생성한 개체에는 기반 클래스에 정의한 멤버도 만들어지는 것이죠. 그리고 소멸할 때는 생성 과정의 역으로 파생 클래스의 소멸자를 수행한 후에 기반 클래스의 소멸자를 수행합니다. 다음은 이를 확인하기 위해 기반 클래스 음악가와 파생 클래스 피아니스트 클래스에 생성자와 소멸자를 추가하여 어떤 순서로 수행하는지 확인하기 위한 출력문을 작성한 예제 코드입니다. //파생 개체의 생성과 소멸 과정 #include #include using namespace std; class Music..

[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++] 22. 캡슐화 최종 실습 – 시나리오

[C++] 캡슐화 최종 실습 – 시나리오 이번에는 단계별로 캡슐화를 실습해 보기로 해요. 여러분께서는 각 단계별로 먼저 직접 해 본 후에 비교하시기 바랍니다. 여기에서는 다음의 시나리오를 캡슐화 실습할 거예요. 다음 내용처럼 학생 데이터를 정의하시오. 1. 멤버 필드 주민번호: 순차적 부여 이름: 생성 시 전달 지력:100(최소 0, 최대 200) 체력: 100 (최소 0, 최대 200) 스트레스: 0 (최소 0, 최대 100) 연속으로 공부한 횟수: 0 (0,5), 공부를 하면 1 증가, 그 외의 행위를 하면 0으로 리셋, scnt로 부름 2. 접근 가능한 멤버 메서드(접근 지정이 public) 공부하다(체력 5소모, 지력: scnt 만큼 증가, 스트레스: 2감소) 강의를 받다.(체력 3소모, 지력: ..

[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, ..

[C++] 11. 논리 형식 bool 제공 12. string 형식 개요

[C++] 논리 형식 bool , string 형식 개요 11. 논리 형식 bool 제공 C언어에서는 논리 형식을 제공하지 않아요. 대신 0은 거짓으로 취급하고 0 이외의 것은 참으로 판별하죠. 그리고 연산 결과가 거짓이면 0, 참이면 1이었어요. C++언어에서는 높은 가독성과 신뢰성을 높이기 위해 논리 형식 bool을 제공하고 있어요. bool 형식 변수에는 값으로 true와 false를 사용할 수 있어요. 하지만 C++언어에서는 여전히 0은 거짓으로 취급하고 0 이외의 것은 참으로 판별하고 있습니다. //논리 형식 bool 사용 #include using namespace std; bool IsEvenNumber(int num); void main() { bool check = false; int n..

[C++] 10. 신뢰성 강화(열거형)

[C++] 10. 신뢰성 강화(열거형) C++언어는 C언어보다 자료 형식에 관한 부분에서 신뢰성을 강화하고 있어요. 먼저 C언어에서는 열거형 변수에 정수 형식을 대입하거나 초기화를 하는 것이 가능합니다. //C언어에서의 열거형 사용 //Program.c #include enum Gender { FEMALE, MALE }; int main() { enum Gender g = 3;//C언어에서는 열거형 변수에 정수형을 대입 및 초기화 가능 printf("g is %d\n",g); return 0; } ▷ 실행 결과 g is 3 하지만 C++에서는 열거형 변수에 정수 형식을 대입하거나 초기화할 수 없어요. 다음은 열거형 변수에 정수를 대입하였을 때 컴파일 오류가 발생하는 예제 코드예요. //신뢰성 강화 - 열..

[C++] 9. 레퍼런스 변수

[C++] 9. 레퍼런스 변수 C++언어에서 변수 선언문에서 &를 사용하는 참조 변수 선언을 제공하고 있습니다. 참조 변수는 별도의 메모리를 할당하지 않고 변수 선언문에서 초기화에 사용한 변수의 메모리를 참조하여 사용합니다. #include using namespace std; int main() { int i =0; int &r = i; //r은 i변수를 참조 r = 9; //i=9;와 같은 결과(r 변수는 i변수를 참조) cout