카테고리 없음

[C++ 배우기 01] 클래스(class)와 객체(instance)

개발새발주발 2022. 6. 4. 19:35
728x90
더보기

이건 왜 안없어지는거지 ~?~?~ ㅜㅜ 

클래스(class)
  • 객체 지향 언어인 C++에는 '클래스'가 존재한다. 이 객체를 찍어내는 틀, 설계도라 할 수 있는 것이 바로 클래스이다. 
  • 조금 더 쉽게 표현해보자면 C의 구조체(struct)가 C++에서 클래스(class)로 확장되었다고 말할 수 있다.
  • 클래스에는 구조체와 달리 '함수'가 포함된다.

= 즉, 객체의 설계도인 클래스 내부에서는 멤버 변수, 멤버함수를 선언할 수 있다. 

 

객체(object 또는 instance)
  • 객체는 변수들과 함수로 이루어지는 대상을 하나의 단위로 표현한 것이다.  
  • 클래스에서 정의된 멤버변수로 구성되며 멤버함수를 사용한다. 
  • 객체들은 class내부가 아닌 별도의 공간에 생성되어 사용된다. 
  • 객체가 instance로 표현되는 이유는 인스턴스가 어떤 메모리 공간에 구현된 실체를 의미하기 때문이다.

 

더보기

사실 이런 설명만 늘어놓은 줄글만 보면 이해가 되지 않는다. 

예를 들어보자면 TV라는 클래스를 만들어보자.

class TV에는 TV가 작동하기 위한 powerbutton, volume, channel등의 변수가 있고 turnon, turnoff, changeChannel등의 (동작을 실행시키는)함수가 있다고 한다.

그렇다면 클래스에서는 변수와 함수들에 대한 정의를 하고 별도의 공간인 main함수에서 선언한 tv라는 객체는 앞서말한 변수와 함수를 모두 포함한다. 이 객체를 통해 멤버변수에 접근하여 volume을 낯추고 Channel을 돌리는 것이다. 

 

그런데 !! 클래스를 사용하기 앞서 '접근' 이라는 개념에 대해 알고 가야한다. 이번엔 접근 권한 지정자에 대해 알아보자(주섬주섬)

접근 권한 지정자    상속 가능 여부(참조만 할 것)
public: 프로그램 어디에서도 접근(invoke) 상속 불가능 
private: 같은 클래스 내, friend 로 선언된 함수나 클래스에 의해 접근  상속 가능 
protected 같은 클래스 내, 서브 클래스, friend에 의해서 만 접근  상속 가능 

(쨘 !!)

접근 권한 지정자를 생략하면 private권한으로 취급한다. 생략하면 class에서 멤버변수,함수들을 디폴트로 private로 선언한다는 것 ~~ 

 

클래스 사용법 

그럼 이제 클래스 사용할 준비는 끝 ! 클래스 사용법에 대해 알아보자

class 클래스 이름 {
접근 권한 지정자:
	멤버변수 ;
접근 권한 지정자:
	멤버함수 ;
};

int main(){
	class (클래스 이름) (객체 이름);
    객체이름. 멤버함수 ;

C++에서 클래스를 생성하고 사용하는 문법이다. 

 

그렇다면 실제 생성 및 구현 예시를 보자 ! 

(참고 : this는 클래스 내의 멤버변수를 나타낸다. 모든 멤버함수는 함수의 인스턴스의 주소를 가리키는 this 포인터를 가지고 있다. )

 

(참고 : 클래스 객체의 멤버를 직접 접근하기 위해서는 점(.)을 사용한다. )

아주아주 간단하게 tv의 volume만을 나타내는 클래스 생성과 구현 ! 

 

이제 이런 멤버변수, 함수들을 추가하여 엮다보면 하나의 TV작동 알고리즘을 구현할 수 있을 것이다. 

 

 

하지만 !! 아직 끝나지 않았다 

생성자와 파괴자라는 클래스의 특수한 멤버 함수를 배우고 가야한다 .. ;_; 

생성자(Constructor)
  • 클래스 이름(){} (생성자 이름은 클래스의 이름과 동일)
  • 한 객체의 데이터 멤버들을 초기화 
  • 클래스 객체가 만들어질 때 자동적으로 실행
  • 해당 클래스의 공용 멤버 함수로 선언
  • 생성자를 정의하지 않으면 묵시 생성자를 컴파일러가 생성
  • 함수 이름 다중화 가능 
  • return 타입, 값 없음 ! 

생성자 정의는 간단하다. class내에서 생성할 때는 TV(){}, 별도의 공간에서 정의할 때는 TV::TV(){}

 

파괴자 (Destructor)
  • ~클래스 이름(){} 
  • 객체가 없어지기 직전 데이터 멤버들을 삭제 
  • 클래스 객체가 범위를 벗어나거나 삭제될 때 자동적으로 기동 
  • 해당 클래스의 공용 멤버로 선언 
  • 파괴자를 정의하지 않으면 묵시 파괴자를 컴파일러가 생성
  • 함수 이름 다중화 안됨

파괴자 정의도 마찬가지이다. class내에서 생성할 때는 ~TV(){}, 별도의 공간에서 정의할 때는 TV::~TV(){}

 

코드로 살펴보자 !

생성자, 소멸자를 각각 정의하고 이전과 같은 main함수에서 출력하면 

 

다음과 같은 결과값이 나온다 ! 

 

이번 글에서는 생성자, 소멸자에 대해 클래스와 관련해 짧게 알아보았다. 다음에 다중 생성자와 같은 조금 더 깊은 내용에 대해 다루어보도록 할 것이며 시험의 도비인 필자는 이만 떠난다 ~~