C++의 구조체는 멤버 함수를 포함할 수 있다는 면에서 C의 구조체보다 의미가 확장되었다. 이형 타입 변수의 집합인 구조체가 스스로의 동작을 정의할 수 있다는 것은 객체 지향 구현 측면에서 매우 중요한 의미가 있다.
C의 전통적인 구조체와 C++에서 확장된 구조체의 차이를 구분하기 위해 확장된 의미의 구조체에 클래스라는 새로운 이름 붙혔다.
구조체 선언문에서 struct 키워드를 class라는 키워드로 바꾸기만 하면 클래스가 된다. C의 구조체와 다르게 C++의 구조체는 멤버 함수, 생성자, 파괴자를 가질 수 있고 상속도 가능하며 클래스가 쓰이는 모든 곳에 사용할 수 있다. C++에서 구조체와 클래스의 유일한 차이점은 멤버에 대한 디폴트 접근 지정뿐이다.
struct S
{
int x; // 구조체의 디폴트접근지정은 public
}
S s;
s.x = 1234; // 구조체 외부에서 접근 가능.
class C
{
int x; // 클래스의 디폴트접근지정은 private
}
C c;
c.x = 1234; // 클래스 외부에서 접근 불가능.
구조체의 디폴트 접근 지정은 public이고 클래스의 디폴트 접근 지정은 private이다. 클래스는 객체의 안정성을 위해 외부에서 멤버 데이터를 함부로 접근하지 못하게 멤버를 숨기는 것을 지향한다. 하지만 C++의 구조체는 C언어와의 호환성을 위해 디폴트 접근 지정이 public일 수 밖에 없다.
class ClassName
{
public:
멤버 변수;
멤버 함수;
private:
멤버 변수;
멤버 함수;
}; // 세미콜론 반드시 필요하다.
구조체와 마찬가지로 멤버 개수에 제한이 없다. int, long, double 등의 기본 자료형은 물론이고 배열, 구조체 등의 유도형과 다른 클래스형의 변수까지 멤버로 포함할 수 있다.
구조체와 동일하게 중첩이 가능하다.
C++에서는 구조체의 태그가 타입으로 승격되어 태그만으로 구조체 변수를 선언할 수 있다. C와 C++ 구조체의 차이
마찬가지로 C++에서 클래스는 int, double, char와 같은 기본형 타입과 동일한 하나의 타입으로 취급된다. 클래스가 완전한 타입으로 취급될 수 있도록 C++은 여러가지 언어적 장치(생성자, 연산자 오버로딩 등)를 제공한다.
| 정수형 | 클래스 | C++의 관련 문법 |
|---|---|---|
int i; | Complex C; | 클래스의 이름이 타입과 같은 자격을 가진다. |
int i = 3; | Complex C(1.0, 2.0); | 생성자를 사용하여 선언과 동시에 초기화 할 수 있다. |
int i = j; | Complex D = C; | 복사 생성자를 사용하여 같은 타입의 다른 객체로부터 생성된다. |
i = j; | D = C; | 대입 연산자 |
i + j; | D + C; | 연산자 오버로딩 |
i = 3.14; | Complex C(1.2); | 변환 생성자, 변환 함수 |
3 + i; | 1.0 + C; | 전역 연산자 함수와 프렌드 |
C++이 클래스를 완전한 타입으로 취급하므로 클래스로부터 유도형 타입(기본형 타입으로 부터 만들어지는 타입. 예: 배열, 구조체, 공용체, 포인터, 함수형 포인터)을 만들 수 있다. 그러므로 클래스의 배열이나 클래스형 변수를 가리키는 포인터도 만들 수 있다.
클래스는 타입일 뿐 그 자체가 정보를 저장하는 변수는 아니다. 클래스를 선언한다고 해서 실제로 값을 기억할 수 있는 메모리가 할당되지 않는다. 클래스형의 변수를 선언해야 실제 메모리가 할당된다.
Position Here;
Complex C;
클래스 변수 선언문에 의해 생성된 변수를 인스턴스(Instance)라고 한다. 인스턴스는 클래스가 메모리에 구현된 실체이며 우리가 지금까지 변수라고 불러왔던 개념과 동일하다.
프로그래밍 대상은 클래스가 아니라 인스턴스이고 한 클래스에 대해 여러 개의 인스턴스를 동시에 생성할 수 있다.
Position A, B, C;
위 선언에 의해 Position 형의 인스턴스 A, B, C가 메모리에 각각 생성된다. int i, j, k; 선언에 의해 세 개의 정수형 변수가 동시에 생성되는 것과 같다.
개별 인스턴스가 독립적인 정보를 저장할 수 있어야 하기 때문에 각 인스턴스들은 클래스에 선언된 멤버 변수를 각각 따로 가진다. 그런 이유 인스턴스의 실제 크기는 클래스에 선언된 모든 멤버 변수의 총 크기와 같다.
인스턴스의 상태(멤버 변수)는 달라질 수 있지만 동작(멤버 함수)은 모두 동일하기 때문에 멤버 함수는 클래스에 속한 모든 인스턴스들이 공유한다.
인스턴스의 다른 표현은 오브젝트(Object)이다.
| 영어 | 번역 | 의미 |
|---|---|---|
| 인스턴스(Instance) | 실체 | 메모리에 구현되어있다. |
| 오브젝트(Object) | 객체 | 독립성을 가진 부품이다. |
http://soen.kr/lecture/ccpp/cpp3/25-4-1.htm
http://soen.kr/lecture/ccpp/cpp3/25-4-2.htm
http://soen.kr/lecture/ccpp/cpp3/25-4-3.htm