[전공]

[명품 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;
}