Cpp module00 - 클래스(class)
클래스(class)
클래스의 탄생
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
Author And Source
이 문제에 관하여(Cpp module00 - 클래스(class)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@parksj3205/cppmodule00-클래스class저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)