반응형

분류 전체보기 2946

[C++] 캡슐화 실습 - 테스트 모듈 작성하기

3. 4 테스트 모듈 작성하기 이번에는 캡슐화 실습이 정상적으로 수행하는지를 테스트하기 위한 모듈을 작성하려고 합니다. 많은 개발자가 테스트를 위한 모듈은 구현이 끝나가는 시점에 작성합니다. 하지만 이와 같은 형태의 개발 공정을 가지게 되면 발생하게 될 많은 경우를 생각할 수 있는 시간적/정신적 제약으로 버그나 예외를 발견하지 못하고 테스트를 완료할 확률이 높아집니다. 될 수 있으면 테스트 모듈은 약속이 정해지고 나면 구현과 병행하여 작성하는 것이 높은 테스트 결과물을 얻어낼 수 있을 것입니다. 물론, 각 프로젝트의 규모나 성질에 따라 개발 공정은 달라질 수 있습니다. 여러분 각자가 Stu.h 를 포함하는 구문을 명시한 후에 main 함수가 포함될 진입점 소스를 작성해 보시기 바랍니다. 해당 소스에서는 ..

[C++]정적 멤버로 구성된 클래스 사용하기

3. 3 정적 멤버로 구성된 클래스 사용하기 C++ 언어에서는 전역 스코프가 존재합니다. 하지만 C#이나 Java와 같은 OOP 언어에서는 전역 스코프가 존재하지 않는데 이 같은 경우에 정적 클래스를 정의하여 이를 극복합니다. C++에는 전역 스코프가 존재하기 때문에 지금과 같은 작업이 불필요하다고 생각할 수도 있겠지만 이렇게 프로그래밍할 수도 있다는 것을 한 번 살펴보시고 여러분의 판단에 맞게 사용하시기 바랍니다. 캡슐화 실습 주제에서 학생의 체력, 아이큐, 스트레스, 연속으로 공부하다를 수행한 카운터는 개체 생성 시에 설정할 디폴트 값과 최소값, 최대값이 약속되어 있습니다. 이럴 때 #define 문을 사용하거나 열거형이나 정적 멤버 상수 필드나 전역 상수를 이용할 수 있을 것입니다. 여기에서는 이러..

[C++] 클래스에 캡슐화 할 멤버 약속하기

3. 2 클래스에 캡슐화 할 멤버 약속하기 구현해야 할 멤버 필드와 멤버 메서드에 대해서 살펴보았으면 이를 프로젝트에 Stu 클래스를 추가한 후에 목적에 맞게 멤버 필드와 멤버 메서드를 추가해 보시기 바랍니다. 멤버 메서드의 내부 구현은 다음 단계에서 할 것이니 CPP 소스 파일에 멤버 메서드는 내부가 비어 있는 상태로 만들어 보세요. (리턴 형식이 있는 메서드는 0이나 ""와 같은 값으로 형식에 맞게 반환하는 코드는 표현하여 컴파일 오류가 나지 않도록 작성해 보시기 바랍니다. 효과적으로 표현하기 위해 프로젝트를 생성하여 Program.cpp 소스 파일을 추가하시고 Class 추가를 통해 Stu.h 와 Stu.cpp 파일도 추가하신 후에 [그림 3.1]과 [그림 3.2]에 있는 멤버들을 캡슐화해 보시기 ..

[C++] 캡슐화 실습 - 구현할 실습 대상

3. 1 구현할 실습 대상 3.1.1 멤버 필드 이번 장에서는 2장에서 다룬 캡슐화를 여러분이 직접 구현해 보시길 바랍니다. 각자가 직접 구현을 하시고 책에 있는 내용과 비교하는 단계로 학습을 해 주시고 미리 책을 보시고 따라 하는 것은 여러분의 실력 향상에 큰 도움이 되지 못할 것입니다. [그림 3.1] 이번 실습에서 구현할 Stu 클래스는 [그림 3.1]에 있는 멤버 필드와 [그림 3.2]에 있는 멤버 메서드입니다. 먼저, 정적 멤버 필드로는 가장 최근에 생성한 학생의 번호를 보관하는 last_num이 있고 비 멤버 필드로는 차례대로 부여되는 번호(num)와 생성 시 입력 인자로 전달받는 이름(name)이 있고 그 외에 체력(hp), 아이큐(iq), 스트레스(stress), 연속으로 공부한 횟수(sc..

[C++] 특별한 정적 멤버 this

2.2.5 특별한 정적 멤버 this 모든 클래스에는 컴파일러에 의해 자동으로 캡슐화하는 정적 멤버 this가 있습니다. 멤버 this의 접근 지정은 private으로 설정되어 있어 코드 상에서는 노출되어 있지 않지만, 해당 클래스 스코프 내에서 사용할 수 있습니다. 그리고 this는 해당 클래스 형식의 포인터 형식입니다. 컴파일러는 개체 인스턴스의 멤버 메서드를 호출하면 해당 개체를 this멤버에 설정하고 해당 형식의 메서드를 호출하는 코드로 전개하게 됩니다. 그리고 지역 변수명으로 존재하지 않는 명칭이 멤버 필드에 있으면 자동으로 this 개체의 멤버를 호출하게 코드를 전개해 주게 됩니다. 또한, 개발자가 명시적으로 this 키워드를 통해 멤버 필드에 접근하면 같은 이름의 지역 변수와 구별해서 사용할..

[C++] 상수화 멤버

2.2.4 상수화 멤버 캡슐화된 멤버들을 구분하는 또 다른 기준 중의 하나는 상수 멤버와 비 상수 멤버로 나누는 것입니다. 상수 멤버는 형식 정의 내에 멤버 앞에 const 키워드가 붙여 명시하게 됩니다. 상수 멤버 필드는 const 키워드가 앞에 붙고 상수 멤버 메서드는 뒤에 붙게 됩니다. 상수 멤버 필드는 값이 변경되지 않는 멤버 필드이고 상수 멤버 메서드는 멤버 필드값을 변경하는 구문을 포함하지 못하는 메서드입니다. 예를 들어, 학생 생성 시에 학번을 부여하고 이후에는 학번을 변경하지 못하게 하고자 한다면 상수 멤버 필드로 사용할 수 있습니다. 또 다른 예로 학생의 iq가 최대 200까지만 올라갈 수 있게 하려고 한다면 static 상수 멤버 필드로 정할 수 있습니다. 그리고 학생의 정보를 확인만 ..

[C++] 개체의 멤버와 형식의 멤버

2.2.3 개체의 멤버와 형식의 멤버 캡슐화된 멤버의 종류를 나누는 기준은 여러 기준이 있을 수 있습니다. 그중에 하나가 해당 멤버가 개체의 멤버인지 혹은 형식의 멤버인지로 구분을 할 수가 있습니다. 이러한 기준으로 구분할 때 형식의 멤버를 정적(static) 멤버라 부르고 개체의 멤버를 비 정적 멤버라 부릅니다. C++에서 정적 멤버는 형식 정의 내에서 해당 멤버를 static 키워드를 붙여 명시해야 합니다. static 키워드가 붙여 명시된 정적 멤버들은 개체에 종속적인 멤버가 아닌 형식에 종속적인 멤버가 됩니다. 예를 들어, 학생을 생성할 때 학생의 일련번호를 차례대로 부여한다고 할 때 학생의 일련번호는 각각의 학생마다 별도로 유지가 되어야 할 것입니다. 하지만 이번에 생성할 학생에게 어떠한 일련번..

[C++] 소멸자

- 소멸자 C++은 Java나 C#과 달리 플랫폼에서 개체들을 관리(Managed)하지 않습니다. 물론, 여기서 얘기하는 C++은 Native 기반의 C++을 얘기를 하는 것이며 .NET에서 개발하는 Managed C++을 얘기하는 것이 아닙니다. 플랫폼에서 관리하는 개체를 관리화(Managed) 개체라고 하는데 이들은 소멸에 관한 책임이 개발자에게 부여하지 않고 플랫폼이 해당 개체를 참조하는 변수가 있는지를 플랫폼이 조사합니다. 이러한 조사(세대 조사)를 통해 참조되지 않는 개체들은 플랫폼의 가비지 수집할 때 수집 대상이 되는 형태로 관리가 되기 때문에 개발자가 소멸에 관한 책임이 적습니다. 이들과 달리 C++에서는 생성되는 개체는 관리화 개체가 아니므로 개발자가 소멸에 관한 책임을 져야 합니다. 소멸..

[C++] 생성자

- 생성자 C++에서 특정 클래스 형식의 개체 인스턴스를 생성할 때 new 연산자를 사용합니다. new 연산자에서는 요청하는 형식의 개체를 위해 메모리를 할당하고 가상 함수 테이블을 형성하는 등의 초기 작업을 수행한 후에 생성자 메서드를 수행하고 생성된 개체의 메모리 주소를 반환합니다. 만약, 사용자가 생성자 메서드를 정의하지 않는다면 개체의 메모리를 할당하고 가상 함수 테이블을 형성하는 등의 초기 작업을 수행한 후 해당 개체의 메모리 주소를 반환하는데 이러한 작업을 수행하는 것을 디폴트 기본 생성자라고 합니다. 하지만 사용자가 생성자 메서드를 정의하면 디폴트 기본 생성자는 형성되지 않게 됩니다. 이러한 이유로 사용자가 입력 매개 변수가 있는 생성자를 정의했을 때 입력 인자를 전달하지 않고 개체를 생성하..

[C++] 2.2.1 멤버 메서드

2.2.1 멤버 메서드 이번에는 멤버 메서드에 대해서 알아보기로 합시다. C++언어에서 사용자가 형식을 정의할 경우 멤버 필드와 멤버 메서드를 캡슐화할 수 있다고 하였습니다. 멤버 메서드를 캡슐화를 할 경우 메서드에서 수행할 코드를 정의하는 것은 클래스 정의문 내에서 할 수도 있고 클래스 정의문 외부에서도 할 수 있습니다. 클래스 외부에 메서드에서 수행할 코드를 정의한 예 class Stu { public: void Study(); }; void Stu::Study() { cout

반응형