일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- c#
- 독립기념관
- 추천
- 원격 제어 프로그램
- 표준 라이브러리 함수
- 실습으로 다지는 c#
- 안드로이드 앱 개발
- 알고리즘
- 언제나휴일
- c언어
- 프로젝트
- Windows Forms
- 언제나 휴일
- 파이썬
- 졸업 작품 소재
- C++
- 동영상 강의
- 네트워크 프로그래밍
- 소스 코드
- 동영상
- 강의
- 충남 천안
- 클래스 다이어그램
- 소켓 통신
- 무료 동영상 강의
- 캡슐화
- 산책하기 좋은 곳
- 유튜브 동영상 강의
- 표준 입출력
- 실습
- Today
- Total
목록C++ (80)
프로그래밍 언어 및 기술 [언제나휴일]
[C++] 개체 출력자 이번에는 개체 출력자가 무엇인지 알아보기로 해요. C++에서 기본 형식의 값을 스트림에 출력할 때는 ostream 형식 개체와 왼쪽 쉬프트(
[C++] iostream 흉내내기 이번에는 cin과 cout으로 출력 및 입력할 때 쉬프트 연산을 사용하는 원리를 살펴보기 위해 iostream 클래스를 흉내내 보기로 할게요. 여기에서 설명하는 것은 원리를 살펴보기 위한 것이지 iostream 클래스의 내부를 정확하게 표현하기 위한 것이 아닙니다. 실제 iostream 클래스는 여기에서 설명하는 것보다 훨씬 정교하고 신뢰성있게 정의하고 있어요. C언어에서 printf 함수로 출력하거나 scanf 함수로 입력받을 때는 포멧 사용자를 사용했었죠. 하지만 C++에서 cin과 cout을 사용할 때는 포멧 사용자 없이 쉬프트 연산을 사용했어요. 어떠한 포멧으로 출력 혹은 입력해야 하는지 표현하지 않아도 알아서 입출력해 주었죠. 이러한 것이 가능한 이유는 클래스..
[C++] 함수 개체 이번에는 함수 호출 연산자 중복 정의와 함수 개체를 알아보기로 해요. C++언어에서는 함수 호출 연산자를 중복정의 할 수 있습니다. 함수 호출 연산자의 연산 기호는 ( ) 입니다. 따라서 함수 호출 연산자를 중복 정의할 때 메서드 이름은 operator()입니다. 메서드 뒤에 입력 매개 변수 리스트를 열거하는 ()에는 개발자가 개수와 형식을 결정하고 반환 형식도 개발자가 정합니다. [반환형식] operator() ([입력 매개 변수 리스트]); 그리고 함수 호출 연산자를 중복 정의한 형식의 개체를 함수 개체라고 부릅니다. 함수 개체는 형식 내부에 함수 호출 연산자를 중복 정의하고 있어서 마치 함수처럼 호출하여 사용할 수 있습니다. 먼저 간단하게 함수 호출 연산자 중복 정의를 사용하여..
[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++] 인덱스 연산자 중복 정의 이번에는 인덱스 연산자 중복 정의를 살펴보기로 해요. 배열과 같은 컬렉션은 인덱스 연산을 통해 원소에 접근할 수 있게 사용자 편의를 제공하곤 합니다. 배열의 인덱스 연산의 결과는 좌항에 올 수도 있기 때문에 연산 결과는 원소 자체를 의미합니다. 만약 정수 형식의 데이터를 원소로 하는 배열 클래스를 정의하고 인덱스 연산자를 중복 정의한다면 원소 자체를 반환하게 구현해야 하므로 다음과 같이 정의합니다. int &operator[](int index);//인덱스 연산자 중복 정의 다음은 인덱스 연산을 중복 정의하여 정수 형식의 데이터를 보관하는 DCArr 클래스를 정의하고 이를 사용한 예제 코드입니다. //DCArray #pragma once class DCArray { i..
[ C++] 대입 연산자 중복 정의 이번에는 대입 연산자 중복 정의를 하는 방법을 살펴보기로 할게요. 대입 연산자는 개발자가 정의하지 않으면 디폴트 대입 연산자가 동작합니다. 디폴트 대입 연산자는 디폴트 복사 생성자처럼 단순히 메모리 내용을 복사하는 얕은 복사를 진행합니다. 복사 생성자처럼 클래스 내부에 동적으로 생성한 다른 개체를 갖고 있을 때 깊은 복사를 하는 대입 연산자를 중복 정의할 필요가 있습니다. 깊은 복사와 얕은 복사는 복사 생성자 부분을 다시 살펴보기기 바랍니다. [C++] 16. 생성자, 소멸자 여기에서는 복사 생성자에서 예를 들었던 동적 배열을 예로 들게요. 동적 배열은 생성할 때 보관할 원소의 최대 개수를 입력 인자로 받아 배열을 동적으로 생성하게 할 거예요. DCArray::DCAr..
[C++] 증감 연산자 중복 정의 이번에는 증감 연산자 중복 정의를 하는 방법을 살펴보기로 할게요. 아시는 것처럼 증감 연산자는 단항 연산자로 전위에 올 때와 후위에 올 때 연산 결과가 다릅니다. 전위에 올 때는 값을 증감한 자기 자신이 연산 결과이고 후위에 올 때는 변경하기 전의 자신의 값입니다. 따라서 전위 증감 연산자의 반환 형식은 자기 자신을 전달하기 위해 클래스 형식 &를 사용합니다. 그리고 후위 증감 연산자의 반환 형식은 증감하기 전 자신의 값을 복사한 개체를 상수 값으로 반환하기 위해 const 클래스 형식을 사용합니다. C++에서 증감 연산자 중복 정의할 때 전위인지 후위인지 구분하기 위해 후위 증감 연산자 중복 정의할 때는 스텁 매개 변수를 추가로 받게 정의합니다. 다음은 Score 클래..
[C++] 클래스에 연산자 중복 정의 이번에는 클래스 내부에 멤버 메서드로 연산자를 중복 정의하는 방법을 알아봅시다. 클래스 내부에 멤버 메서드로 연산자를 중복 정의할 때도 메서드의 이름은 operator 키워드에 연산 기호로 나타냅니다. 대신 피연산자 중에서 좌항에 오는 자기 자신은 입력 매개 변수 리스트에 열거하지 않습니다. 주의할 점은 사용하는 곳에서 피연산자의 좌항에 클래스 형식이 올 때만 동작한다는 것입니다. 교환 법칙이 성립할 때는 우항에 클래스 형식이 올 때 수행할 수 있게 전역 연산자 중복 정의도 같이 하시기 바랍니다. 다음은 전역 연산자 중복 정의에서 다루었던 학생 클래스에 == 연산자 중복 정의했던 코드를 클래스 내부에 메서드로 연산자 중복 정의하는 코드입니다. //Student.h #..
[C++] 전역 연산자 중복 정의 개발자는 전역이나 클래스 내에서 연산자 중복 정의할 수 있습니다. 먼저 전역에서 연산자 중복 정의 방법을 알아봅시다. 연산자 중복 정의할 때는 메서드 이름 대신 operator 키워드 뒤에 정의할 연산 기호를 명시합니다. 그리고 피연산자는 순서대로 입력 매개 변수 리스트에 열거하고 연산 결과는 리턴 형식으로 표현합니다. [리턴 형식] operator [연산기호] (입력 매개 변수 리스트) { [기능 구현] } 간단하게 학생 클래스를 정의한 후에 == 연산자를 전역에 중복 정의해 볼게요. 다음과 같은 학생 클래스가 있다고 가정해요. //Student.h #pragma once #include #include using namespace std; class Student {..
이번에는 연산자 중복 정의에 관해 알아보기로 해요. 연산자 중복 정의란 하나 이상의 피연산자가 사용자 정의 형식일 때 연산 기능을 정의하는 것입니다. C++에서는 개발자는 자신이 정의한 형식을 피연산자로 사용할 때 사용하는 곳에서 연산 기호를 사용할 수 있게 연산 기능을 정의할 수 있습니다. 자신이 정의한 형식에 특정 연산의 기능을 정의하면 사용하는 개발자는 직관적으로 사용할 수 있습니다. 예를 들어 IsEqual 메서드를 제공하고 있을 때 == 연산자 중복 정의를 제공하여 사용하는 개발자는 == 연산을 사용할 수 있게 만드는 것입니다. 다음은 C++언어에서 연산자 중복 정의에 관한 사항들입니다. – 피연산자 중에 최소 하나는 사용자 정의 형식이어야 한다. – 기본적으로 함수 중복 정의의 규칙을 따른다...
상속과 다형성 최종 실습한 코드예요. //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++] 상속과 다형성 최종 실습 – 파생 클래스 이제 파생 형식인 학사 학생, 운동학생, 마법학생과 진입점 main 부분을 구현합시다. 먼저 학사 학생 클래스에 필요한 멤버들을 고민해 보기로 해요. class SStudent : public Student { 학사 학생은 더미 뇌가 멤버 필드로 필요합니다. int dummy; 그리고 더미 뇌는 공부한 횟수가 5이 배수일 때마다 1씩 증가해야 하므로 공부한 횟수도 기억해야죠. int total_scnt; public: SStudent(string name); “공부하다.”, “강의받다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.” 메서드를 재정의해야겠죠. virtual void Study(); virtual void ListenLe..
[C++] 상속과 다형성 최종 실습 – 학생 이제 상속과 다형성의 마지막 실습 시나리오를 보고 설계 및 구현해 보기로 해요. 시나리오를 보면 정의할 형식은 학생, 학사 학생, 운동학생, 마법학생이 있습니다. 학생을 기반 클래스로 정의하고 나머지 클래스는 파생 클래스로 정의하면 되겠죠. 먼저 학생 클래스에 필요한 멤버들을 고민해 보기로 해요. 학생 클래스는 멤버 필드로 이름, 주민번호, 체력, 지력, 스트레스와 연속으로 공부한 횟수가 필요합니다. 그리고 주민번호를 순차적으로 부여하기 위해서는 정적 멤버로 가장 최근에 부여한 주민번호가 필요하겠죠. 그리고 멤버 메서드로 “공부하다.”, “자습하다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.”가 필요합니다. 그리고 이들 메서드는 파생 형식..
[C++] 상속과 다형성 최종 실습 시나리오 이제 상속과 다형성의 마지막 실습이예요. 다음의 시나리오를 보고 직접 클래스 다이어그램도 작성해 보고 구체적으로 구현해 보세요. 시나리오 프로그램이 시작하면서 학사 학생과 운동 학생, 마법 학생을 한 명씩 생성 학생을 생성 후 전체 학생에게 강의=>자습=>잠자기=>휴식하기=>음료마시기=>노래하기 순으로 진행 (각 단계마다 학생 정보를 출력) 자습하기에서는 해당 학생이 학사 학생이면 독서도 지시함 휴식하기에서는 해당 학생이 마법 학생이면 여행도 지시함 노래하기에서는 해당 학생이 운동 학생이면 춤추게 지시함 1. 학생 멤버 필드로 이름, 주민번호, 체력, 지력, 스트레스가 있음 주민번호: 순차적 부여 이름: 생성 시 전달 지력:100(최소 0, 최대 200) 체력..
[C++] 상속과 다형성 실습 (도형) 이번 실습은 도형을 소재로 할게요. 위 그림은 Visual Studio에서 제공하는 기능을 사용하여 출력한 클래스 다이어그램입니다. 시나리오 1. 도형 도형 ID를 순차적으로 부여합니다. 순수 가상 메서드로 Draw 메서드를 제공합니다. 파생 형식에서도 접근 가능한 GetID 접근자를 제공합니다. 2. 점 x와 y 좌표 멤버를 갖습니다. 생성자에서 x, y 좌표를 입력 인자로 받습니다. Draw 메서드를 재정의합니다. 3. 선 두 개의 점을 멤버로 갖습니다. 생성자에서 두 점의 x, y 좌표를 입력 인자로 받습니다. Draw 메서드를 재정의합니다. 여러분께서 먼저 작성해 본 후에 비교해 보세요. 작성하다 막히면 앞에 상속과 다형성에 관한 내용을 보시면서 하시기 바랍..
[C++] 상속, 다형성 실습 (상품, 할인 상품) 이제 상속과 다형성 실습을 해 봅시다. 이번 실습은 상품을 소재로 할게요. 시나리오 1. 상품 상품 이름과 가격을 멤버 필드로 갖습니다. 생성할 때 이름과 가격을 입력 인자로 받습니다. 가격과 이름의 접근자를 제공하며 가격 접근자는 가상 메서드입니다. 상품 정보를 출력하는 가상 메서드를 제공합니다. 형식 내부에서만 접근 가능한 가격 설정자와 이름 설정자가 있습니다. 2. 할인 상품 할인율을 멤버 필드로 갖습니다. 상품 이름과 가격, 할인율을 입력 인자로 받습니다. 가격 접근자와 상품 정보 출력하는 메서드를 재정의합니다. 할인율의 접근자 메서드를 제공합니다. 형식 내부에서만 접근할 수 있는 할인율 설장자가 있습니다. 여러분께서 먼저 작성해 본 후에 비교해..
C++에서의 형 변환 이번에는 C++언어에서 제공하는 형 변환에 관해 살펴보기로 해요. 이 부분은 OOP 특징은 아니지만 앞에서 dynamic_cast를 사용하는 방법을 소개하여 다른 형 변환도 알아보려는 거예요. 먼저 C++ 언어에서도 강제 형변환(명시적 형변환이라고도 부름)을 제공하고 있습니다. 하지만 강제 형변환은 잘못 사용하면 심각한 버그를 유발할 수 있습니다. 다음은 서로 관련이 없는 Man 클래스와 Student 클래스를 정의한 후에 강제 형변환을 사용하는 예제입니다. 컴파일 오류는 발생하지 않지만 프로그램 동작 중에 버그로 런 타임 오류가 발생할 수 있습니다. //강제 형 변환이 갖는 위험 요소 #include #include using namespace std; class Man { str..
[C++] 하향 캐스팅 이번에는 기반 형식 포인터 변수로 참조하고 있는 형식을 프로그램 동작 시에 파생 형식으로 형 변환하는 하향 캐스팅을 알아보기로 해요. 다형성은 캡슐화와 상속을 보다 효과적이고 현실 세계에 근접하게 표현할 수 있게 해주는 특징입니다. 하지만 기반 클래스 형식 포인터 변수로 파생 개체를 관리하는 것은 치명적인 단점이 있습니다. 만약 기반 클래스 형식에서는 약속할 필요가 없는 메서드가 파생 클래스 형식에 있을 때 해당 메서드의 접근 수준을 public으로 제공해도 접근하지 못합니다. 이러한 약점을 보완하기 위해 많은 OOP언어에서는 런 타임에 파생 개체 형식으로 형 변환(캐스팅)하는 방법을 제공하고 있으며 이를 하향 캐스팅이라 합니다. C++언어에서는 dynamic_cast를 통해 하향..
[C++] 다중 상속 이번에는 여러 개의 기반 형식에서 파생하는 형식을 정의하는 다중 상속을 살펴볼게요. C++언어에서는 기반 형식을 여러 개를 정의하는 다중 상속을 지원합니다. 많은 이들은 다중 상속을 사용할 때 주의하라고 권하거나 아예 다중 상속을 사용하지 말 것을 권합니다. 실제 Java나 C#에서는 여러 개의 기반 클래스에서 파생하는 형식을 정의하는 문법을 제공하지 않습니다. C++보다 나중에 만들어진 이들 언어에서는 C++언어의 다중 상속 문법의 위험을 알고 난 이후에 만들어져서 이러한 문법을 제외하고 있습니다. 그렇지만 Java나 C#에서도 여러 개의 인터페이스를 기반으로 파생한 형식을 정의하는 문법은 제공하고 있습니다. 여기에서는 C++언어에서 제공하는 다중 상속이 어떠한 위험을 갖고 있는지..
[C++] 인터페이스 (INTERFACE) 이번에는 인터페이스(interface)를 살펴볼게요. 인터페이스는 특정 기능을 구현할 것을 약속한 추상 형식을 말합니다. Java나 C# 등의 다른 OOP언어에서는 인터페이스 형식을 제공합니다. C++언어에서는 인터페이스 형식을 제공하지는 않지만 순수 가상 메서드를 이용하여 정의할 수 있습니다. 인터페이스는 멤버 필드나 구체적으로 구현한 메서드를 갖지 않고 특정 기능을 약속한 메서드만 갖습니다. 그리고 모든 멤버는 사용하는 개발자와의 약속으로 모든 멤버를 public으로 접근 지정합니다. C++언어에서는 구조체는 디폴트 가시성이 public이어서 구조체를 이용하여 인터페이스를 정의하는 이들도 많습니다. #define interface struct interfac..
[C++] 추상 클래스(ABSTRACT CLASS) 이번에는 추상(Abstract) 클래스를 살펴볼게요. 추상 클래스는 다른 형식의 기반 클래스로만 사용할 수 있고 개체를 생성할 수 없는 클래스를 말합니다. 이에 대응하는 개념으로 개체를 생성할 수 있는 클래스를 구상 클래스입니다. .C++언어에서는 멤버 메서드 중에 순수 가상 메서드를 하나라도 갖고 있는 클래스는 추상 클래스입니다. 순수 가상 메서드는 virtual 키워드로 메서드를 선언하고 메서드 내부를 정의하지 않겠다는 =0;를 표시한 메서드를 말합니다. 그리고 순수 가상 메서드는 다른 OOP 언어에서 추상 메서드와 같은 의미입니다. virtual void Play()=0; //순수 가상 메서드(추상 메서드) 다음은 순수 가상 메서드를 갖고 있는 음..
[C++] 메서드의 다형성 형식의 다형성은 기반 형식 포인터 변수로 파생 형식 개체를 설정하거나 기반 형식 참조 변수로 파생 형식 개체를 설정할 수 있는 특징이죠. 그런데 형식의 다형성만 제공한다면 기반 형식 변수로 멤버 메서드를 호출하면 실제 개체 형식에 관계없이 기반 형식에 정의한 메서드가 동작합니다. 메서드의 다형성은 기반 형식 변수로 멤버 메서드를 호출하였을 때 실제 개체 형식에 정의한 메서드가 동작할 수 있는 OOP언어의 특징입니다. 예를 들어 음악가 형식을 기반으로 파생한 형식으로 피아니스트와 드러머가 있다고 가정할게요. 그리고 음악가에는 “연주하다.”와 “인사하다.” 기능을 제공할거예요. “인사하다.” 기능은 파생 형식에 관계없이 같은 동작을 수행하지만 “연주하다.” 기능은 파생 형식에 따라..
[C++] 형식의 다형성 이번에는 형식의 다형성을 살펴볼게요. 형식의 다형성은 기반 형식 포인터 변수로 파생 형식 개체를 설정하거나 기반 형식 참조 변수로 파생 형식 개체를 설정할 수 있는 특징입니다. 예를 들어 음악가 형식을 기반으로 파생한 형식으로 피아니스트와 드러머가 있다고 가정할게요. “피아니스트는 음악가이다.”, “드러머는 음악가이다.” 처럼 일반화관계로 정의하기 적합한 관계죠. 만약 음악가 형식 포인터 변수가 있다면 음악가 개체를 설정할 수 있겠죠. 그런데 피아니스트와 드러머는 음악가가 아닌가요? 네. 피아니스트나 드러머도 음악가입니다. 이러한 일반화관계의 특징을 OOP언어에서 활용할 수 있게 만든 문법이 다형성입니다. void StartConcert(Musician *musician); in..
[C++] 다형성 개요 이번에는 OOP의 주요 특징 세 가지인 캡슐화, 상속, 다형성 중에 다형성에 관해 살펴봅시다. 다형성은 기반 형식의 멤버를 파생 형식에서 상속받는 장점을 활용할 수 있는 OOP 특징입니다. 하나의 기반 형식에서 파생한 다양한 파생 클래스가 있을 때 같은 형식의 변수로 접근할 수 있으면 프로그래밍을 효과적으로 할 수 있겠죠. C++언어에서는 기반 형식의 포인터 변수로 파생 형식의 개체를 설정할 수 있습니다. 그리고 기반 형식의 참조 변수로 파생 형식의 개체를 설정할 수도 있습니다. class Musician { }; class Pianist:public Musician { }; int main() { Musician *musician = new Pianist(); //기반 형식 포인..
[C++] 무효화 기반 클래스에서 정의한 멤버 메서드와 같은 이름으로 파생 형식에서 정의하면 어떻게 동작할까요? 파생 클래스에서 기반 클래스에 정의한 이름과 같은 이름으로 메서드를 만들면 기반 클래스에 정의한 메서드를 무효화합니다. 예를 들어 일반 프로그래머가 있고 EH 프로그래머가 있는데 대부분의 행위에 있어 EH 프로그래머는 일반 프로그래머와 같게 일을 한다고 가정합시다. 하지만 일반 프로그래머가 프로그래밍을 할 때 “생각하면서 코딩을 한다.”와 같이 하는데 EH 프로그래머가 프로그래밍을 할 때는 “생각한 것을 문서화 하고 이를 보면서 코딩을 한다.”고 해 볼게요. 이 때 일반 프로그래머의 프로그래밍이라는 메서드를 무효화합니다. //무효화 #include #include using namespace ..
[C++] 접근 지정자 protected 이번에는 접근 지정자 protected에 관해 알아보기로 해요. 캡슐화에서 접근 지정자를 사용하여 멤버의 가시성을 설정할 수 있다는 것을 다뤘었죠. private으로 접근 지정한 것은 형식 내부에서 사용할 수 있고 public으로 지정하면 모든 곳에서 접근할 수 있다는 것은 이미 소개하였습니다. 파생 클래스를 정의하면 기반 형식의 멤버를 상속받는다고 하였는데 접근 지정을 private으로 설정한 멤버는 어떻게 접근할까요? priavate으로 접근 지정한 멤버는 파생 클래스에서도 접근할 수 없습니다. 분명히 상속받아 개체 내부에 있지만 가시성이 없어 접근할 수 없습니다. 이럴 때는 기반 클래스에서 protected로 접근 지정하여 파생 클래스에서 접근할 수 있게 해..
[C++] 파생 개체의 생성과 소멸 과정 이번에는 일반화 관계에 있는 파생 클래스 형식의 개체를 생성과 소멸 과정을 알아보기로 할게요. 파생 클래스 형식의 개체를 생성할 때는 기반 클래스를 생성한 후에 파생 클래스를 생성합니다. 실제 생성한 개체에는 기반 클래스에 정의한 멤버도 만들어지는 것이죠. 그리고 소멸할 때는 생성 과정의 역으로 파생 클래스의 소멸자를 수행한 후에 기반 클래스의 소멸자를 수행합니다. 다음은 이를 확인하기 위해 기반 클래스 음악가와 파생 클래스 피아니스트 클래스에 생성자와 소멸자를 추가하여 어떤 순서로 수행하는지 확인하기 위한 출력문을 작성한 예제 코드입니다. //파생 개체의 생성과 소멸 과정 #include #include using namespace std; class Music..
[C++] 상속(일반화 관계) 개요 이제 OOP의 세 가지 주요 특징인 캡슐화, 상속, 다형성 중에 상속에 관해 알아볼게요. 상속은 다른 형식에 정의한 것을 마치 자신에서 정의한 것처럼 만드는 OOP의 특징입니다. 이러한 관계를 UML에서는 일반화 관계라 부르고 삼각형과 실선으로 관계를 표시합니다. 일반화 관계는 “피아니스트는 음악가이다.”처럼 “이다.(is a)”로 나타낼 수 있는 관계입니다. 이 때 음악가처럼 일반적인 클래스를 기반 클래스라 말하며 피아니스트처럼 특수한 클래스를 파생 클래스라 부릅니다. C++에서 일반화 관계를 표현할 때 파생 문법을 이용합니다. 파생 문법은 파생 클래스를 정의할 때 기반 클래스를 다음처럼 나타냅니다. class Pianist : public Musician { }; ..
[C++] 캡슐화 최종 실습 – 구체적 구현 이제 마지막으로 메서드를 구체적으로 구현합시다. 약속한 기능을 구현하면서 필요하면 별도의 메서드를 추가하세요. 여기에서 추가하는 메서드는 다른 형식에서 호출해서 사용하지 않는 메서드이므로 접근 지정을 private으로 지정하세요. 특히 멤버 필드의 값이 특정 범위 내에 있어서 필터링을 요구하면 설정자 메서드를 추가하여 구현하세요. 설정자 메서드에서 멤버 필드 값을 범위 내에서 조절하는 기능을 작성하면 버그를 만들 확률을 줄일 수 있습니다. 여러분께서 각자 구현해 본 후에 비교해 보세요. 여기에서는 지력, 체력, 스트레스, 연속으로 공부한 횟수는 범위가 정해져 있습니다. 이에 이들 멤버 필드 값을 설정하는 설정자를 추가합시다. 물론 이들 메서드는 형식 외부에서 ..
[C++] 캡슐화 최종 실습 – 멤버 필드 23. 캡슐화 최종 실습 – 멤버 필 먼저 클래스 이름은 Student로 정할게요. 주민 번호는 변하지 않으므로 상수화 멤버 필드로 정의하세요. const int pn;//주민번호 주민 번호를 순차적으로 부여하기 위해 정적 멤버 필드로 가장 최근에 부여한 주민 번호가 필요하겠죠. static int last_pn;//가장 최근에 부여한 주민 번호 이름은 문자열로 정하면 되겠죠. string name;//이름 지력과 체력, 스트레스, 연속으로 공부한 횟수는 정수 형식으로 정의하면 되겠네요. int iq;//지력 int hp;//체력 int stress;//스트레스 int scnt;//연속으로 공부한 횟수 최소값, 최대값, 디폴트 값은 형식 내에 정해진 값이므로 정..