PART 2. 객체 지향 프로그래밍
- chapter 5. 클래스의 기초
예제 : 날짜 정보를 저장하는 Date 클래스
Date.h
#pragma once #include <iostream> #include <string> //클래스 만들기 class Date { //'private' 직접 접근 불가 private: //'멤버 변수'(=필드) 선언 int year; int month; int day; //'public' 직접 접근 가능 public: std::string memo = "실험"; public: //'멤버 함수'(=메소드) 선언 void setDate(int year, int month, int day); void printDate(); int getYear(); int getMonth(); int getDay(); Date(int year, int month, int day); Date(); ~Date(); };
Date.cpp
#include "Date.h" void Date::setDate(int year, int month, int day) { Date::year = year; Date::month = month; Date::day = day; } void Date::printDate() { std::cout << Date::year << "년 " << Date::month << "월 " << Date::day << "일" << std::endl; } int Date::getYear() { return Date::year; } int Date::getMonth() { return Date::month; } int Date::getDay() { return Date::day; } Date::Date(int year, int month, int day) { Date::year = year; Date::month = month; Date::day = day; } Date::Date() { Date::year = 2018; Date::month = 6; Date::day = 24; } Date::~Date() { }
main.cpp
#include "Date.h" int main() { //'Date'클래스의 'day_1'인스턴스 생성 Date day_1; //인자가 없는 생성자. //메소드 호출 day_1.setDate(1990, 5, 18); day_1.memo = "내 생일"; //퍼블릭 필드 직접 출력 (dot(.)연산자 사용) std::cout << day_1.memo << std::endl; std::cout << day_1.getYear() << "년" << day_1.getMonth() << "월" << day_1.getDay() << "일" << std::endl; //'Date'클래스의 'day_2'인스턴스 생성 Date day_2(2000, 06, 15); //인자가 있는 생성자. day_2.memo = "동생 생일"; std::cout << day_2.memo << std::endl; day_2.printDate(); //인스턴스 동적 생성 (디폴트 생성자가 호출됨) Date* day_3 = new Date; //동적 생성된 객체의 메소드 호출 day_3->memo = "오늘"; //동적 생성된 객체의 퍼블릭 필드 직접 출력 (arrow(->)연산자 사용) std::cout << day_3->memo << std::endl; day_3->printDate(); delete day_3; //동적 생성할 때 인수있는 생성자 호출하기 Date* day_4 = new Date(2000, 01, 01); std::cout << day_4->memo << std::endl; day_4->memo = "새천년의 시작"; std::cout << day_4->memo << std::endl; day_4->printDate(); delete day_4; }
1. 클래스 선언
2. 객체 생성과 멤버 접근
3. 객체의 동적 생성
4. 접근 제어 (접근 지정자 사용)
- 'private:' : 전용 멤버, 클래스 내부에서만 사용가능한 멤버.
- 'public:' : 공용 멤버, 클래스 외부에서도 자유롭게 사용가능한 멤버.
(예제에서는 변수에만 private를 줬지만, 함수에도 private를 줘서 외부에서 접근하지 못하게 할 수 있다.)
※ 접근 지정자는 가능한 엄격하게 지정하는 것이 좋다.
※ 특히 멤버 변수에는 가능한 private를 사용해서 직접 변경을 막고 접근자와 설정자를 사용하게 하는 것이 좋다.
5. 접근자(Accessor)와 설정자(Mutator)
- 접근자(Accessor)는 멤버 변수의 값을 반환해주는 멤버 함수로 주로 get으로 시작한다.
- 설정자(Mutator)는 멤버 변수의 값을 변경하는 멤버 함수로 주로 set으로 시작한다.
6. 멤버 변수를 private로 보호하고, 접근자와 설정자를 사용하게 할 때의 이점
1) 클래스의 인터페이스와 구현이 분리되어 구현을 변경하기 쉬워진다.
2) 설정자의 매개변수로 잘못된 값이 넘어온 경우, 설정자에서 사전에 차단할 수 있다.
3) 필요할 때 멤버 변수값을 계산하여 반환할 수 있다.
4) 접근자만을 제공함으로 읽기만 가능한 멤버 변수를 만들 수 있다.
7. 멤버 함수 외부 정의
- 멤버 함수를 클래스 내부에 정의하면 자동적으로 인라인 함수가 되고, 외부에 정의하면 일반적인 함수처럼 호출된다.
- 따라서 간단하고 자주 호출하는 함수는 클래스 내부에서 정의하는 것이 유리하고, 반대의 경우에는 외부에 정의하는 것이 좋다.
8. 클래스 선언(declaration)과 정의(definition) 분리
9. 멤버 함수 중복 정의
- 멤버 함수도 함수이므로 중복 정의가 가능하다.
(예제에서는 생성자를 중복 정의했다.)
10. 생성자와 소멸자도 사용했지만 자세한 내용은 다음에 소개하겠다.
※ 클래스 내부에서 멤버 변수에 값을 줄 수 없다고 하는데 된다.
C++11에서 변경된 내용으로 in-class initilizer라고 한다.