Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

클래스(Class) 본문

C & C++/C++ Basic

클래스(Class)

snd-snd 2019. 9. 21. 20:52

클래스

 

기존의 C언어에 있는 구조체에 함수를 추가(+접근제어자+상속의 개념)시킨 개념이라고 볼 수 있다.

// 클래스 선언 방법

class 클래스이름 {
접근제어자:
    멤버변수 선언
    멤버함수 선언 및 정의(생성자 포함)
}    
#include "stdafx"
#include <iostream>

class Test {
protected:
    char name[32]; //멤버변수
    int aga; //멤버변수
    
public:
    Test(char* _name, int _age) { //생성자
        name = _name;
        age = _age;
    }

    void print() { //멤버함수
        cout << "이름: " << name << endl;
        cout << "나이: " << age << endl;
    }
}    


void main() {
    
    Test test("김태호", 28);
    test.print();
}

 

 

접근제어자

 

 접근제어자는 접근할 수 있는 범위를 제한한다. 이는 클래스 내부에 선언된 데이터를 외부로부터 보호하거나,

굳이 외부의 사용자가 알 필요없는 부분이나 내부적으로만 사용되는 정보를 감추기 위해 사용된다.

C++에서는 클래스 선언시 접근제어자를 별도로 기술하지 않을 경우 기본값 'private'으로 간주한다.

 

public : 클래스 멤버에 관한 모든 외부 접근을 허용한다.

protected : 클래스 멤버에 관한 모든 외부 접근을 차단하되, 상속 관계에 있는 파생 클래스는 접근이 가능하다.

private : 클래스 내부에서만 접근이 가능하며, 모든 외부 접근과 파생 클래스 접근을 차단한다.

 

 

 

멤버 함수의 구현

 

 멤버 함수의 구현 방법은 두 가지가 존재하는데, 하나는 클래스 내부에 구현하는 것이고,

또 하나는 클래스 내부에는 프로토타입만 선언하고, 외부에서 함수를 구현하는 것이다.

class Test {
public:

    void internalFunction(){
        cout << "클래스 내부 정의 함수" << endl;
    }
    
    void externalFunction(); //프로토타입
}

void Test::externalFunction() {
    cout << "클래스 외부 정의 함수" << endl;
}

 

이 둘의 차이점을 설명하려면 인라인(inline) 함수에대해 알아야 한다. 

 

 먼저 C++에서 함수를 호출하게 되면 호출하기 직전의 기존 정보를 저장한 뒤 인자값을 넘겨주고 실행 순서를 

바꾼 뒤 함수의 수행이 끝나면 사용한 메모리를 정리하고 반환값을 받게된다. 이는 함수 호출 전후로 필수적으로

시간과 메모리를 사용하게되는 작업들이 존재한다는 것이고, 곧 이러한 작업이 많다면 오버헤드가 발생한다.

물론 일반적인 PC에서 이러한 프로그램이 실행될 경우 별반 문제될 것은 없다. 하지만 메모리나 성능이 제약된

프로세서를 프로그래밍할 경우 무시 못할 성능 저하의 요인이 될 수 있다.

 

 함수 호출시 소요되는 시간과 메모리 사용을 줄이기 위해 도입된 방법이 인라인(inline) 함수이다.

인라인(inline) 함수는 컴파일시 함수를 호출하는 곳에 함수코드 자체를 삽입해 호출이 일어나지 않도록 해

함수 호출시 사용되는 소요가 사라지게 되므로 속도가 올라가 성능 저하의 요인을 막을 수 있다.

 

하지만 반대 급부로 함수코드 자체를 삽입하기 때문에 프로그램의 길이는 더 길어지게 된다.

 

 다시 본론으로 돌아가 클래스 내부 구현과 외부 구현의 차이를 설명하자면,

클래스 내부에 멤버함수를 구현할 경우 컴파일러는 내부에 구현된 멤버함수를 인라인 함수로 치환하여 처리하고,

외부에 구현할 경우 컴파일러 판단에 따라 함수를 치환하여 처리한다.

 

 

 

생성자와 소멸자

 

 객체의 생성 / 소멸시 자동으로 호출되는 함수로 생성자의 경우 오버로딩을 통해 다중 정의가 가능하지만,

소멸자의 경우 단 하나만이 존재한다. 클래스 선언시 생성자와 소멸자를 정의하지 않을 경우, 보이지는 않지만

컴파일러가 자동으로 기본 생성자와 소멸자를 만들어 넣는다.

 

 생성자는 클래스의 인스턴스 생성을 통해서도 호출되지만, new연산자를 이용해 동적 객체 생성시에도

호출된다. 반대로 소멸자는 인스턴스 생성시 해당 스코프를 벗어나 객체가 소멸될 경우 호출되고,

동적 객체는 delete연산자를 이용해 제거해야만 소멸자가 호출된다. 이는 곧 동적 객체 생성시

반드시 delete연산자를 이용해 사용한 메모리를 제거해 주어야 한다는 의미와 같다.

 

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

변환 생성자(Conversion Constructor)  (0) 2019.09.22
복사 생성자(Copy Constructor)  (0) 2019.09.22
네임 스페이스(Namespace)  (0) 2019.09.21
디폴트 매개변수(Default Parameter)  (0) 2019.09.21
C → C++  (0) 2019.09.16
Comments