본문 바로가기
Language & Framework & GIT/C++

[씨앤씨뿔]C++/ 클래스 & 객체 - 1

by veganwithbacon 2023. 4. 18.
반응형

클래스는 일반적으로 클래스 선언부(class declaration)클래스 구현부(class implementation)로 나뉘어 작성된다.

 

  클래스 선언부

class 키워드와 class 이름을 통해서 선언한다.

class Circle{ //Circle 이름의 클래스 선언
~~~~~~~~~
};  //반드시 세미콜론(;)으로 종료

 

  클래스 멤버

class Circle{
public:
	int radius = 5; //클래스 선언부에서 멤버 변수를 초기화할 수 있다.
    ~~
};

멤버 함수는 원형 형태로 선언되며, 리턴 타입, 매개 변수 리스트 등이 모두 선언되어야 한다.

double getArea();

 

  접근 지정자, public 

접근 지정자에는 private, public, protected 등 총 3종류가 있다.

 

public은 클래스 외부로부터의 접근을 허용

private은 외부에서 접근할 수 없음

protected는 중간 레벨인데 나중에 알려준다고 한다.

 

신기한 점은 접근지정자를 따로 알려주지 않을 시, private이 디폴트라는 것이다.

 


  클래스 구현부

double Circle :: getArea(){
~~~~~~
}

위의 :: 부분은 범위 지정 연산자(::)로 클래스 이름과 함께 멤버 함수를 기술할 수 있게 해주는 것이다.

클래스의 선언과 구현을 분리하는 이유는 클래스의 재사용을 위해서이다.


 

클래스와 객체하면 항상 먼저 떠오르는 것이 있다.

클래스, 객체 그리고 인스턴스가 무엇인가

  • 클래스 : 붕어빵 틀
  • 객체 : 붕어빵(클래스라는 틀에서 나온 모든 붕어빵)
  • 인스턴스 : 굽기, 속 재료의 양이나 종류에 따라 다른 붕어빵들

객체의 멤버에 접근하기 위해서는  

객체이름. 멤버와 같이 사용한다.

 

✅생성자

: 클래스가 생성될 때 자동으로 실행되는 이 멤버 함수를 통해 객체를 초기화한다.

 

- 생성자의 목적은 객체가 생성될 때 필요한 초기 작업을 하기 위함

- 생성자 함수는 오직 한 번만 실행(객체마다)

- 생성자 함수의 이름은 클래스 이름과 동일하게 작성되어야 한다

- 생성자 함수의 원형에 리턴 타입을 선언하지 않는다

- 생성자는 중복 가능하다(매개 변수 개수나 타입이 다르게 선언되어야 함)

 

위임 생성자(delegating constructor), 생성자가 다른 생성자 호출

한 클래스의 생성자들에게는 보통 객체를 초기화하는 비슷한 코드가 중복되는데, 이런 경우에 생성되는 것이 위임생성자이다.

Circle::Cicle(){
	radius = 1;
    cout << "반지름 " << radius << " 원 생성" << end1;
}
Circle::Circle(int r){
	radius = r;
 	cout << "반지름 " <<radius<<"원 생성" <<endl; 
}

 

C++에서는 중복되는 초기화 코드를 하나의 생성자로 몰고, 다른 생성자에서 이 생성자를 호출할 수 있게 한다.

Circle::Circle() : Circle(1){}

Circle::Circle(int r){
	radius = r;
    cout << "반지름 "<< radius << "원 생성" << endl;
}

Circle() 생성자가 호출되면 Circle() 생성자가 자신의 코드를 실행하기 전에 Circle(int r) 생성자를 호출해, r에 1을 넘겨주어 radius를 1로 초기화하고 반지름과 원 생성을 대신 출력하게 하는 것이다.

 

  타겟 생성자 : 객체의 초기화 작업이 코딩된 생성자

  위임 생성자 : 객체의 초기화를 다른 생성자에 위임하는 생성자

 

- 생성자 코드에서 멤버 변수 초기화

 

- 생성자 서두에 초깃값으로 초기화 : 생성자 코드의 구현부에 멤버 변수와 초깃값을 쌍으로 지정하고 이들을 콤마(,)로 나열 작성.

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

Point::Point(int a)
	: x(a), y(0){
}
Point::Point(int a)
	:x(100+a), y(100){
}

 

위 둘 중 하나의 방법으로 해결 가능

 

- 클래스 선언부에서 직접 초기화

 

생성자는 유저가 만들지 않는다면 컴파일러가 기본 생성자를 만들어 삽입하므로, 생성자는 클래스마다 항상 존재한다.

 

 

기본  생성자는 클래스에 선언된 어떤 생성자도 없을 때 보이지 않게 기본생성자를 생성한다.

 

 

기본생성자가 자동으로 생성되지 않는 경우는  이미 하나라도 생성자가 선언되어 있기 때문이다.


✅소멸자

: 객체가 소멸되는 시점에서 자동으로 호출되는 클래스의 멤버

 

class Circle{
	Circle();
    Circle(int r);
    ~~~~~~
    ~Circle(); //소멸자 함수 선언
};             //리턴타입&매개변수도 없고 소멸자는 오직 하나만 존재한다

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

- 소멸자의 목적은 객체가 사라질 때 마무리 작업을 하기 위함

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

- 소멸자는 리턴 타입이 없으며 어떤 값도 리턴해서는 안된다

- 소멸자는 한 개만 존재하며, 매개 변수를 가지지 않는다.

- 소멸자가 선언되어 있지 않으면 기본 소멸자(default destructor)가 자동으로 생성된다

 

객체는 생성의 반대순으로 소멸된다


지역 객체(local object) : 함수 내에서 선언된 객체

전역 객체(global object) : 함수 바깥에 선언된 객체

 

전역 객체나 지역 객체 모두 생성된 순서의 반대순으로 소멸된다.


#️⃣ 접근 지정자

: 객체 지향 언어에서는 객체를 캡슐화하고, 외부에서 접근 가능한 공개 멤버와 외부의 접근을 허용하지 않는 비공개 멤버를 구분한다.

 

C++에서의 멤버  접근 지정자(access specifier)

- private(비공개)

- public(공개)

- protected(보호)

class Sample{
private:
	//private 멤버 선언. 클래스 내의 멤버 함수만 접근 가능
public : 
	//public 멤버 선언. 클래스 내외의 모든 함수에게 접근 가능
protected:
	//protected 멤버 선언. 클래스 내의 멤버와 상속받은 파생 클래스에만 접근 허용
};

⏺Private 멤버

: private 접근 지정으로 선언된 멤버, 클래스 내의 멤버 함수들에게만 접근이 허용

 

⏺Public 멤버

: public 접근 지정으로 선언된 멤버, 클래스 내외를 막론하고 프로그램의 모든 함수들에게 접근이 허용

 

⏺Protected 멤버

: protected 접근 지정으로 선언된 멤버, 클래스 내의 멤버 함수와 이 클래스를 상속받은 파생 클래스의 멤버 함수에게만 접근이 허용

 

접근지정자는 다른 접근 지정자를 설정할때까지 같은 접근지정자가 사용된다.

 

#️⃣디폴트 접근 지정은 private

접근 지정을 하지 않은 경우 디폴트 접근 지정은 private으로 처리된다.

캡슐화의 기본 원칙이 비공개이기 때문이다. 


#️⃣멤버 보호와 생성자

  멤버 변수는 private으로 지정하는 것이 바람직하다

다른 각도로 보면 public이 멤버 변수에 주로 사용됐다면 생성자가 지금처럼 활발하게 사용되지 않았을 수도 있다.

일반적으로 멤버 변수에 대해서는 public 사용을 자제하고 private으로 선언하는 것이 바람직하다.

 

  생성자는 public으로

보통 클래스 외부에서 객체를 생성하므로 생성자를 public으로 선언해야 한다.

생성자가 public으로 선언되지 않다면 컴파일 오류가 발생한다.

 

 

반응형

댓글