연재 완료/C++ Lang 이론

4. 클래스의 기초

라이피 (Lypi) 2018. 6. 25. 00:36
반응형

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라고 한다.

반응형