본문 바로가기
Study/C++

[C++] 클래스와 객체

by Jamie Lim 2020. 5. 24.

1. 객체

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

    - 객체는 캡슐화를 통해 외부의 접근을 통제해 자신의 내부 요소를 보호함

 

1) 캡슐화

  - 실세계나 C++ 프로그램이나 구성 객체들이 상호 통신하며 시스템이 구동된다

  - 캡슐화로 정보들을 보호할 수 있게 접근을 막지만 모든 요소를 차단하면 안된다

    정보를 교환하고 통신하기 위해 일부 요소를 노출시켜야 된다

 

2) 멤버 변수 & 멤버 함수

  - 객체는 상태와 행동으로 구성되어 있음

  - 상태 = 멤버 변수

  - 행동 = 멤버 함수

  - 멤버 변수(상태)를 알고 싶다면 멤버 함수(행동)를 호출해야 된다

 

3) 클래스와 객체

  (1) 클래스 (붕어빵 틀)

    - 객체를 만들어내기 위해 정의된 설계도,

    - 클래스는 객체도 실제도 아님

    - 멤버 변수와 멤버 함수를 선언하는 공간

 

  (2) 객체 (=인스턴스)  (붕어빵)

    - 객체는 생성될 때 클래스의 모양을 갖고 만들어짐

    - 멤버 변수와 멤버 함수로 구성되어 있음

    - 하나의 클래스로 여러 객체를 생성할 수 있음

    - 객제들은 상호 별도의 공간에 생성된다

 


2. 클래스

  1) 클래스 선언부

    - clsaa 키워드를 이용해 클래스 선언

colorscripter.com/info#e"

class 클래스이름 {
	
}

< 예시 >
class Circle {
	
}

    - 멤버 변수와 멤버 함수 선언

      멤버 변수 -> 클래스 선언 내에서 초기화 할 수 없다

      멤버 함수 -> 원형 형태로 선언해야 됨

    - 접근 지정자

      · Private, public, protected 중 하나

      · Public : 다른 모든 클래스나 객체에서 멤버의 접근이 가능함

      · Private : 어느 곳에서도 접근할 수 없음 (기본값)

      · Protected : 상속받은 자식만 접근이 가능함

 

  2) 클래스 구현

    - 클래스에 정의된 모든 멤버 함수 구현

    - 클래스의 재사용을 위해서 선언부와 구현부를 분리해 작성함

(함수의 리턴 타입) (클래스 이름) :: (멤버 함수) {
 	구현할 코드
}

< 예시 >
double Circle :: getArea(){
	return 3.14 * radius * radius;
}

 

  3) 객체 생성

    - main함수에서 클래스의 이름으로 호출해 생성

int main(){
	(클래스 이름) 객체이름;
}

< 예시 >
int main(){
	Circle dounut;      // 객체 생성
    donut.radius = 1;   // 멤버 변수 접근
    double area = donut.getArea();  // 멤버 함수 호출
}

    - 객체의 멤버에 접근하기 위해서는 객체 이름 뒤에 .(점)을 찍고 접근할 멤버 변수 혹은 멤버 함수를 적는다

 


3. 생성자

  - 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수

  - 클래스 이름과 동일한 멤버 함수

  - 객체를 초기화 해준다

 

  1) 생성자의 특징

// 생성자 선언
class Circle {
	Circle();       // 클래스 이름과 동일하며 리턴 타입 없음
    Circle(int r);
}

// 생성자 함수 구현
Circle::Circle() {   }
Circle::Circle(int r) {   }

    - 생성될 때 필요한 초기 작업을 위해 생성자를 사용함

    - 생성자의 이름은 반드시 클래스 이름과 동일해야 한다

    - 생성자는 리턴 타입을 선언하지 않음 (void 타입도 X)

    - 객체 생성 시 오직 한 번만 호출할 수 있다

    - 생성자는 중복이 가능하지만 그 중 하나만 실행 된다

    - 생성자가 선언되어 있지 않으면 기본 생성자를 자동을 생성 (컴파일러가)

       * 기본 생성자 : 컴파일러에 의해 자동 생성된 매개 변수가 없는 생성자 (함수 구현에도 내용 없음)

 

  2) 생성자 멤버 변수 초기화 방법

    (1) 생성자 코드에서 멤버 변수 초기화

class Point {
	int x, y;
public:
	Point();
	Point(int a, int b);
};

Point::Point() { x = 0; y = 0; }
Point::Point(int a, int b) { x = a; y = b; }

 

    (2) 생성자 서두에 초기값으로 초기화

class Point {
	int x, y;
public:
	Point();
	Point(int a, int b);
};

Point::Point() : x(0), y(0) { // x와 y를 0으로 초기화
}
Point::Point(int a, int b)    // x = a, y = b로 초기화
	: x(a), y(b) {
}

 

    (3) 클래스 선언부에서 직접 초기화

class Point {
	int x=0; y=0;
public:
	...
};

 

  3) 위임 생성자

Circle::Circle() : Circle(1) { }  // 위임 생성자

Circle::Circle(int r) {   // 타겟 생성자
	raidus = r;
    cout << "반지름은 " << radius << "이다" << endl;
}

    - 여러 생성자에 중복 작성된 코드의 간소화

    - 타겟 생성자 : 객체 초기화를 전담하는 생성자

    - 위임 생성자 : 타겟 생성자를 호출하는 생성자, 객체 초기화를 타겟 생성자에 위임

    

  4) 기본 생성자

class Circle {
	//Circle(); 이렇게 컴파일러가 자동 생성해 준다
}

int main(){
	Circla c;
}

    - 생성자는 항상 클래스 내에 있어야 한다. 하지만 개발자가 생성자를 작성하지 않으면 컴파일러에 의해 기본 생정자가 자동으로 생성된다

    - 기본 생성자는 매개 변수가 없고 생성자 함수 내에 구현되어 있지 않다

    - 생성자가 하나라도 선언되어 있는 경우 기본 생성자를 자동 생성하지 않는다

class Circle{
	int radius;
public:
	Circle(int r) { radius = r; }
}

int main(){
	Circle c1(5);  // Circle(int r) 생성자 호출
    Circle c2();   // 기본 생성자가 생성되지 않기 때문에 에러 발생
}

 


4. 소멸자

  - 객체가 소멸되는 시점에서 자동으로 호출되는 함수

  - 오직 한번만 자동 호출되며 임의로 호출할 수 없다

  - 객체 메모리 소멸 직접에 호출된다

 

  1) 소멸자 특징

class Circle {
		Circle();
		Circle(int r);
		
		~Circle();  // 소멸자 함수 구현
};

// 소멸자 함수 구현
Circle::~Circle() {
		
}

    - 객체가 사라질 때 실행 도중 동적 할당 받은 메모리 해제 등 마무리 작업을 하기 위해 소멸자를 사용한다

    - 소멸자 함수의 이름은 클래스 이름 앞에 ~를 붙인다

    - 소멸자는 리턴 타입이 없음

    - 중복으로 선언하는 것이 불가능하다

      소멸자는 하나의 클래스에는 오직 하나만 선언할 수 있다

    - 소멸자는 매개 변수가 없는 함수이다

    - 소멸자가 선언되어 있지 않으면 기본 소멸자가 자동 생성함

       * 기본 소멸자는 아무것도 하지 않고 단순 리턴이다

  

  2) 생성자와 소멸자 실행 순서

    - 객체가 선언된 위치에 따라  지역 개체는 함수가 종료하면 소멸되고 전역 객체는 프로그램이 종료할 때 소멸된다

    - 객체 생성

      · 전역 객체 : 프로그램에 선언된 순서로 생성

      · 지역 객체 : 함수가 호출되는 순간 순서대로 생성

    - 객체 소멸

      · 전역 객체 : 프로그램이 종료되면 전역 객체가 생성된 순서의 역순으로 소멸

      · 지역 객체 : 함수가 종료되면 객체가 생성된 순서의 역순으로 소멸

     - new를 이용해 동적으로 생성된 객체는 delete로 객체를 소멸한다

 

 

< 참고 >

명품  C++ 프로그래밍 - 황기태

'Study > C++' 카테고리의 다른 글

[C++] 입출력, 연산자  (0) 2020.08.02
[C++] 클래스와 객체 & 객체 포인터  (1) 2020.05.31
[C++] 포인터, 함수  (0) 2020.04.07
[C++] 조건, 반복,배열  (0) 2020.03.31

댓글