추상 자료형(사용자가 정의한 자료형)을 표현하기 위해 사용되는 표현 방법이다. C++에서 객체를 구현하기 위해서 사용하는 방법이다. 객체를 정의하는 일종의 블루 프린트이다.
사용자가 정의한 자료형이기 때문에 ‘사용자 정의형 타입’이라고도 부른다. 이는 메모리에 저장된 변수가 아니기 때문에 변수를 선언하는 것 처럼, 객체를 선언하고 초기화해주어야 객체로 사용할 수 있다.
객체지향 프로그래밍은 ‘캡슐화’라는 특징을 지닌다. 클래스를 통해 변수와 매서드를 하나로 묶어서 외부에서 접근하지 못하게하는 것이다. 하지만, 특정 기능을 수행하기 위해서 일부 데이터를 외부에 노출시켜야 하는 경우가 있다. 이러한 경우 접근 지정자를 통해서 노출여부를 결정할 수 있다. 만약 접근 지정자를 따로 명시하지 않는다면, 모두 private로 간주된다.
클래스를 기반으로 만들어져 실제로 메모리에 할당된 것.
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
};
| int a | int a | int a | int a | int b | int b | int b | int b |
|---|---|---|---|---|---|---|---|
| char c | char d | padding | padding | padding | padding | padding | padding |
| double e | double e | double e | double e | double e | double e | double e | double e |
| short f | short f | padding | padding | padding | padding | padding | padding |
메모리에는 위의 표와 같이 위치하게 된다.