[C++] 03-1. 클래스와 객체

SunowMin·2023년 9월 26일
0

C++

목록 보기
4/8

1. 객체에 대한 이해

객체는 캡슐화된다.

  • 캡슐화(encapsulation)
    : 객체의 구성 요소들을 캡슐로 싸서 보호하고 볼 수 없게 하는 것

객체의 일부 요소는 공개된다.

  • 객체들이 서로 정보를 교환하고 통신하기 위함

C++ 객체는 멤버 함수와 멤버 변수로 구성된다.

  • 멤버 변수 : 객체의 상태(state)를 나타내는 속성들
  • 멤버 함수 : 행동(behaviour)을 구현한 코드들
  • 외부에서 C++ 객체에게 어떤 작업을 요청하거나 상태를 알고자 할 때, 객체 내에 공개된 멤버 함수를 호출

C++ 클래스와 C++ 객체

  • C++ 클래스(class)
    : 객체(object)를 정의하는 틀 혹은 설계도, 클래스에서 멤버 변수와 멤버 함수를 선언함
  • C++ 객체
    : 멤버 변수 메모리와 멤버 함수 코드를 실제 가지고 C++ 프로그램이 실행되는 동안 실존하는 실체 혹은 인스턴스(instance)
  • 클래스는 컴파일이 끝나면 사라지지만, 프로그램은 실행 중에 객체를 생성하여 멤버 변수에 값을 저장하고 멤버 함수 코드 실행 가능
  • 클래스는 하나이지만 객체들은 얼마든지 생성 가능하며, 이때 각 객체들은 상호 별도 공간에 생성됨

객체 - 인스턴스의 차이점
거의 비슷하게 사용하지만 정확히 말하자면 아래와 같다.
객체 : 클래스의 타입으로 선언되었을 때를 지칭
인스턴스 : 그 객체가 메모리에 할당되어 실제 사용될 때를 지칭 (객체를 인스턴스화한 것)





2. C++ 클래스 만들기

  • C 언어 구조체(struct)와 같이 개발자가 정의하는 새로운 데이터 타입
  • 클래스 선언부와 클래스 구현부로 나누어 작성됨
class Circle {
public:
	int radius; // 멤버 변수
    double getArea(); // 멤버 함수
};


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

① 클래스 선언부 (class declaration)

  • 클래스의 모양을 정의하는 것

클래스 선언

class Circle { // Circle 이름의 클래스 선언
	...
}; // 반드시 세미콜론(;)으로 종료
  • 멤버 변수와 멤버 함수의 원형을 선언
  • 클래스는 'class 키워드' + '클래스 이름'으로 선언됨
  • 이들은 {와}로 감싸며 마지막에 세미콜론(;) 필수

클래스 멤버

class Circle {
public:
	int radius; // 멤버 변수
    double getArea(); // 멤버 함수
};
  • 멤버는 변수와 함수로 구성되어있고, 아래와 같이 초기화 함
  • 멤버 함수는 원형 형태로 선언되며, 리턴 타입, 매개 변수 리스트 등이 모두 선언되어야 함

접근 지정자, public

class Circle {
public:   // 이하의 모든 멤버는 다른 접근 지정자가 선언할 때까지 public 접근 지정
     ... 
};
  • 접근 지정자가 선언되면, 다른 접근 지정자로 선언될 때까지 모든 멤버에 대해 적용됨
  • 종류
    (1) public : 클래스 외부로부터 접근을 허용
    (2) private : 외부에서 전혀 접근 불가하며, 아무 접근 지정이 없는 멤버는 private으로 처리됨
    (3) protected

② 클래스 구현부(class implementation)

  • 클래스 선언부에 선언된 멤버 함수의 코드를 구현
double Circle::getArea(){
	return 3.14*radius*radius;
}
  • 범위 지정 연산자(::)를 사용하여 클래스 이름과 함께 멤버 함수를 기술함
    (같은 이름의 함수가 다른 클래스에 존재할 수 있기 때문)

클래스 선언과 구현을 분리하는 이유
클래스의 재사용을 위함
클래스를 사용하고자 하는 다른 C++ 파일에서는 컴파일 시 클래스의 선언부만 필요하기 때문





3. 객체 생성과 객체 활용

#include <iostream> 
using namespace std; 

class Circle {
public:
	int radius; 
	double getArea(); 
}; 

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

int main() {
	Circle donut; 
	donut.radius = 1; // donut 객체의 반지름을 1로 설정
	double area = donut.getArea(); // donut 객체의 면적 알아내기
	cout << "donut 면적은 " << area << endl;

	Circle pizza; 
	pizza.radius = 30; // pizza 객체의 반지름을 30으로 설정
	area = pizza.getArea(); // pizza 객체의 면적 알아내기
	cout << "pizza 면적은 " << area << endl;
}

객체 생성과 객체 이름

  • 객체는 클래스 모양과 기능을 그대로 간직한 실체로서 이름을 가짐
  • 기본 타입의 변수를 선언하는 것과 같은 방법으로 객체를 생성하고 이름을 붙임
Circle donut;  // Circle 클래스의 객체 생성. 객체 이름은 donut
Circle pizza;  // Circle 클래스의 객체 생성. 객체 이름은 pizza
  • 변수가 생성되면 메모리에 변수 공간이 할당되는 것처럼, 객체가 생성되면 클래스 크기의 메모리가 할당

객체의 멤버 접근

  • 객체의 멤버에 접근하기 위해서는 객체 이름 뒤에 .(점)을 찍고 그 뒤에 멤버를 쓴다.
donut.radius = 1;   // donut 객체의 radius 멤버에 1을 기록
double area = donut.getArea();   // donut 객체의 getArea()멤버 함수를 호출
  • getArea()가 리턴한 값이 area에 저장됨
  • donut 객체는 main()에 의해 생성되었으므로 area 변수와 함께 main()의 스택에 존재됨




해당 포스팅은 '황기태, 『명품 C++ Programming』, 생능출판사'를 참고하여 작성하였습니다.

0개의 댓글