[전공]

[명품 C++] 03 클래스와 객체

danhan 2022. 6. 2. 11:06

출처 :

  • 명품 C++ Programming (저자 황기태)
  • 객체지향프로그래밍

객체

캡슐화

  • 객체의 본질적인 특성
  • 외부에 객체의 일부분 공개

멤버 변수와 멤버 함수

  • 상태 state와 행동 behavior로 구성
  • 멤버 변수에 상태 저장
  • 멤버 함수에 행동 저장
  • 직접 값에 접근하지 않음 → 멤버 함수를 통해 멤버 변수에 접근

클래스와 객체

클래스

  • 객체를 만드는 틀, 설계도
  • 객체 (== 실체)가 아님
  • 멤버 변수와 멤버 함수로 구성

클래스 선언부 class declaration

  • class 키워드를 이용
  • 멤버 변수와 멤버 함수 선언
    • 멤버 변수는 클래스 선언 내에서 초기화할 수 없음
    • 멤버 함수는 원형 prototype 형태로 선언
  • 멤버에 대한 접근 권한 지정
    • private, public, protected
    • public - 다른 모든 클래스나 객체에서 멤버의 접근이 가능함
    • 디폴트는 private
  • 헤더파일 소속으로 .h 파일에 들어감
// 클래스 선언부
class Circle {
		// 디폴트는 private
		int radius1;
	public:              // 멤버에 대한 접근 지정자
		int radius2;       // 멤버 변수
		double getArea();  // 멤버 함수
};  // 끝에 세미콜론 꼭 붙이기!

클래스 구현부 class implementation

  • 클래스에 정의된 모든 멤버 함수 구현
  • 소스 파일 소속으로 .cpp 파일에 들어감
// 클래스 구현부
double Circle :: getArea() {       // ::는 범위 지정 연산자
	return 3.14 * radius * radius;   // radius는 Circle 클래스의 멤버 변수
}

*교수님 질문!

클래스 선언부와 구현부를 나누는 이유는?

  1. 코드를 감추기 위해! 내부의 노하우를 담은 구현부는 인코딩해서 감춰두고, 헤더파일 통해 함수를 사용할 수 있도록..함수를 사용할 떄 모든 구현부를 알 필요없다.
  2. 클래스를 다른 파일에서 활용하기 위해!

.cpp 파일에 헤더파일(선언부) 없이 구현부만 있으면 컴파일 가능한가?

  • 그 클래스가 뭔지 모르기 때문에 에러가 난다.

객체

  • 클래스 모양 그대로 가지고 탄생
  • 멤버 변수와 멤버 함수로 구성
  • 메모리에 생성됨
  • 실체와 같은 말
  • 객체들은 서로 다른 공간에 생성

클래스와 객체의 관계

class TV {
	bool on;
	int channel;
	int volume;
public:
	void powerOn() { }
	void increaseChannel() { }
};  // 세미콜론 꼭 쓰기!

// TV 객체 1과 TV 객체 2는 서로 다른 별도의 영역에 멤버들을 만든다.
#include <iostream>
using namespace std;

class Circle {
public:
	int radius;
	double getArea();
	// Cicle의 기본 생성자가 자동으로 생성된다.
};

double Circle::getArea() {
	return 3.14 * radius * radius;
}

int main() {
	Circle donut;        // donut 객체 생성 -> 메모리가 할당 된다.
	donut.radius = 1;    // donut 멤버 변수 접근 - public 이라서 접근 가능
	double area = donut.getArea();   // donut 멤버 함수 호출
}	

실습 예제

#include <iostream>
using namespace std;

class Rectangle {
public:
	int width;
	int height;
	int getArea();
};

int Rectangle::getArea() {
	return width * height;
}

int main() {
	Rectangle rect;
	rect.width = 3;
	rect.height = 5;
}