클래스, 객체, 구조체

최정훈·2024년 10월 12일

클래스

추상 자료형(사용자가 정의한 자료형)을 표현하기 위해 사용되는 표현 방법이다. C++에서 객체를 구현하기 위해서 사용하는 방법이다. 객체를 정의하는 일종의 블루 프린트이다.

사용자가 정의한 자료형이기 때문에 ‘사용자 정의형 타입’이라고도 부른다. 이는 메모리에 저장된 변수가 아니기 때문에 변수를 선언하는 것 처럼, 객체를 선언하고 초기화해주어야 객체로 사용할 수 있다.

객체지향 프로그래밍은 ‘캡슐화’라는 특징을 지닌다. 클래스를 통해 변수와 매서드를 하나로 묶어서 외부에서 접근하지 못하게하는 것이다. 하지만, 특정 기능을 수행하기 위해서 일부 데이터를 외부에 노출시켜야 하는 경우가 있다. 이러한 경우 접근 지정자를 통해서 노출여부를 결정할 수 있다. 만약 접근 지정자를 따로 명시하지 않는다면, 모두 private로 간주된다.

객체(인스턴스)

클래스를 기반으로 만들어져 실제로 메모리에 할당된 것.

  • 생성자(Constructor) 클래스 객체를 생성할 때, 객체의 맴버 변수를 초기화하는 함수이다. 객체를 생성할 때 1회 호출된다. 생성자 오버로딩을 통해서 다양한 생성자를 만들 수 있으며, 생성자의 이름은 클래스의 이름과 같다.


  • 소멸자(Destructor) 클래스 객체가 소멸될 때 호출되는 함수이다. 주로 동적할당 메모리를 해제하거나 임시 메모리를 지우기 위해 사용된다. 생성자와 마찬가지로 객체가 소멸될 때 1회 호출된다. 객체의 지역변수일 경우 해당 블록이 종료되면 소멸하고, 전역변수일 경우 프로그램이 종료될 때 소멸된다. 소멸자의 이름은 생성자와 마찬가지로 클래스와 동일하지만, 구별을 위해서 이름 앞에 ‘~’를 붙인다.
class Square {
    private :
        int width;
        int heigth;
    
    public :
		    // 생성자 1
        Square(int a, int b) { width = a; heigth = b; }
        
        // 생성자 2
        Square(int a) { width = a; heigth = a; }
        
        // 소멸자
        ~Square() {}
};

구조체

클래스와 같은 사용자 정의형 타입

C에서는 접근 지정자 없이, 무조건적으로 외부에서의 접근을 허락하지만, C++에서는 개념이 확장되어, 클래스의 개념과 거의 동일하게 사용할 수 있다. 다만, 클래스와 달리 구조체에서 접근 지정자를 따로 명시하지 않으면 모두 public으로 간주된다.

// 클래스
class Person { 
	string name;   
    private :
        int height;
        int weight;
};

// 구조체
struct Person { 
 	string name;
    private :
        int height;
        int weight;
};

위의 예시에서는 Person을 각각 클래스와 구조체로 정의하고 name이라는 string변수의 접근 지정자를 설정하지 않았다. 이 경우, 클래스 Person의 name은 private로 설정되어 외부에서 접근이 불가능하고, 구조체 Person의 name은 public으로 설정되어 외부에서 접근이 가능하다.

클래스, 구조체 바이트 패딩

바이트 패딩(Byte padding)
클래스나 구조체를 실제로 메모리에 할당할 때, 성능 향상을 위해서 추기적인 메모리를 삽입하는 것.

이는 메모리에서 CPU레지스터로 한번에 읽어오는(fetch 하는)데이터의 크기 때문에 일어난다. 만약 4byte씩 fetch하는 머신이 있다고 가정해보자.

**|a|bb|cccc|a|bb|cccc|a|bb|cccc|a|bb|cccc|...**

다음과 같이 자료형이 있을 때, cccc에 접근하러면, 2번의 fetch가 일어나야 한다. 첫번째 fetch에서 얻은 abbc와 두번째 fetch에서 얻은 ccca를 합쳐서 최종적인 cccc값을 읽을 수 있다.

패딩은 가장 큰 타입을 기준으로 일어난다. 예시를 살펴보자.

#include<iostream>

using namespace std;

struct s
{
    int a; // 4byte
    int b; // 4byte
    char c; // 1byte
    char d; // 1byte
    double e; // 8byte
    short f; // 2byte
};

위와 같이 있을 때, 구조체 s의 크기는 20byte가 나올것 같지만, 실제로는 32byte가 나온다. 가장 큰 타입인 double(8 byte)를 기준으로 패딩이 일어난 것이다.
int aint aint aint aint bint bint bint b
char cchar dpaddingpaddingpaddingpaddingpaddingpadding
double edouble edouble edouble edouble edouble edouble edouble e
short fshort fpaddingpaddingpaddingpaddingpaddingpadding

메모리에는 위의 표와 같이 위치하게 된다.

profile
게임개발자(희망)의 공부일지

0개의 댓글