클래스

클래스란?

c의 구조체에서 확장된 c++에서의 구조체이다.

c의 구조체는 변수에 국한되지만 클래스는 변수 뿐 아니라 함수까지 포함 할 수 있다. 또한 제한자를 통하여 함수나 변수의 접근범위를 제한할 수 있다.(구조체는 public으로 제한자가 정해짐)

우리는 앞서 객체지향에 관한 이야기를 하였다. c++을 객체지향적 언어로 볼 수 있는 이유중 가장큰 부분은 이 클래스 때문이다. 클래스를 이용하여 객체를 찍어낼 수 있다. 즉 클래스는 객체를 만들어주는 틀로 생각하면 된다.

즉 클래스 자체는 완벽한 데이터타입이 되며 모든 데이터 타입 부분에서 사용 가능하다.

접근제한자

위에서 제한자를 이야기하였다. 이는 접근 제한자를 의미한다. 이것은 무엇일까??

종류는 총 세가지로 나뉜다.

1.public

어디에서든 사용이 가능하다. (자기 클래스 뿐아니라 상속된 자식클래스, 클래스 외부 에서 모두 접근가능. 보통 함수를 public으로 한다.) 상속은 뒤에서 보다 자세히 설명하도록 하겠다.

2.protected

자기 자신의 클래스와 상속된 클래스 에서 접근가능

3.private

저기자신의 클래스 내에서만 접근가능. 보통 맴버변수를 private로 선언한다.

클래스 만들기

  • 헤더파일-절때 이렇게 사용하지 않아도 된다. 대게 이렇게 쓴다. 클래스의 정의부이다.

    class <클래스명>{

    public:
           <함수명>(); <--생성자
        ~<함수명>(); <--소멸자
    
    private:
        맴버변수;
    
    public:
        맴버변수에 대한 set과 get함수;
           맴버함수;
    

    }; <---여기 꼭 세미콜론을 붙여주어야한다.

  • .cpp 파일-함수의 정의부

    #include "클래스 정의부"
    
    클래스명::함수명():맴버변수(디폴트값){
    
    }
    
    클래스명::~함수명()::맴버변수(){
    
    }
    
    //set함수는 외부 영역에서 클래스내부의 값을 setting 하여주는 함수이다.(private으로 하였기에 함수를 통하여 내클래스로 내려와 정의하는 방식이다.)
    
    void 클래스명::함수명(<type> 변수명){
    
        맴버변수=변수명;
    
    }
    
    ->대게 이런식으로 한다. 포인터나 클래스가 변수로 들어와 받아야하는경우 deep copy로 해주어야 한다. 이는 뒤에서 설명하도록 하겠다.
    
    //get함수는 외부 영역에 클래스 값을 넘겨주는 것이다.
    
    <내보내줄 데이터 타입> 클래스명::함수명(){
    
        return (내보내줄 맴버변수)
    
    }
    

  • 그리고 메인

  • 컴파일!

deep copy

call by reference나 call by pointer를 통하여 class에서 set을 하는 경우 deep copy를 한다. 그이유는 그냥 대입연산자를 통하여 복사하는 경우 주소가 복사되기에 같은 방향을 가리킨다. 따라서 값을 for문을 통하여 복사해 주도록 하자.

생성자

객체를 생성할때 맴버변수를 초기화해주는 것이다.

    클래스명::함수명():맴버변수(디폴트값){

    }

    또는
        클래스명::함수명(){
        맴버변수 = 디폴트값;
    }

이런식으로 사용하여준다.

예제1.

예제2.

생성자의 오버로당

생성자는 함수와 마찬가지로 매개변수의 리스트와 타입에 따라 다르게 인식하여 오버로딩이 가능하다.

사용 방법은 함수와 동일하게 매개변수의리스나 타입만 바꾸어주면 잘 작용한다.

정의부

main문

결과

복사 생성자

이미 만들어진 클래스의 맴버변수 값을 생성할 클래스의 맴버변수에 대입연산자를 통하여 복사하고 싶을때 사용한다.

메인함수

정의

int main(){

    <클래스명> <새로만들클래스> = <기존클래스>;

    return 0;
}

.cpp함수

<클래스명>(const <클레스명(데이터타입)> &변수명){

    매개변수=변수명.매개변수;

}

결과

소멸자와 deep copy

소멸자는 객체가 소멸될 시 자동으로 호출된다.

보통 동적 배열 할당을 해제하여 주는대에 사용한다.

소멸자의 정의

~클래스명::클래스이름(){
delete[] 동적배열된 맴버변수;
}

그러면 이렇게 한번 생각해보자.

어느 클래스에서 동적배열을 할당한 배열에 set함수를 통하여 외부값을 받았다고 해보자.

이를 대입연산자 = 을 이용하여 대입시 동적배열을한 포인터와 외부포인터가 가리키는 값이 동일하게 된다.

그런데 클래스의 동적배열된 메모리영역은 소멸자를 통하여 해제가 될것이고, 그렇게 된다면 기존에 가리키고 있떤 데이터공간의 메모리 공간이 해제가 된다.

그렇게되면 외부에서 기존에 가리키고 있던 포인터는 오류가 발생한다.

또한 두개의 서로다른 인스턴스가 동일한 공간을 가리키는경우 메모리 해제시 두번째 해제되는것은 해제할것이 없어지게 되어 오류가 발생한다.

따라서 이를 해결하기 위하여 값을 반복문을 통하여 받아주는 deep copy를 실행하여야 한다.

+ Recent posts