Computing

[C++] C++에서 class 배우기

ysk1m 2025. 4. 10. 12:00

Class

클래스는 기존 C의 abstraction과 modularity가 부족한 것을 해결하기 위해 통합된 것으로 C++의 중심적인 기능으로 자리 잡았다.

class는 data information과 procedural information으로 구성된다.

data information을 attributes, data field라고 하며 Procedural information을 method, function이라 한다.

 

Object는 data attribute와 behavior를 포함하는 개념으로 class에서 구체적으로 실현하는 Runtime instance이다.

 

C에 class와 유사한 structure라는 구조가 있다.

 

structure는 단순히 데이터를 묶는 컨테이너로 함수(method, behavior)와는 결합되지 않았다.

 

SimpleVector Class

  • Attributes: array, size, capacity로 구성돼 있다
  • Methods: resize(), getSize(), addElement()로 구성돼 있다.

 

class가 선어 되고 초기화되면 memory block에 다음과 같이 할당된다.

Attributes와 Methods에 접근하는 법

class method 내에서는 namespace 또는 class name을 구체화할 필요 없다.

또한 python에서 self라 써서 선언하는 것처럼 안 해도 그냥 바로 써도 된다.(C++에서는 this이다.)

 

class밖에서는 dot operator를 통해 명시해야한다.

Constructors

Object가 생성될 때 자동으로 호출되는 함수이다.

python에서 __init__과 같은 함수로 객체를 유효한 초기 상태로 만드는 것이다.

다음과 같이 size(0), capacity()로 초기화해야 한다.(초기화 리스트 부분)

생성자 본문이 실행되기 전에 멤버 변수를 초기화한 것이다.

const, 참조형 member는 반드시 초기화 리스트를 통해 초기화해야한다.

여러 값을 중괄호{}로 전달받을 수 있게 해주는 초기화 작업이다.

 

생성자를 하나도 명시하지 않는다면 compiler가 자동으로 만드는데 만약 하나라도 명시적으로 정의한다면, 기본 생성자는 자동으로 만들어지지 않는다.

Deconstructors

deconstructors는 객체의 수명이 끝날 때 자동으로 호출되는 함수이다.

Other Methods

addElement(int element), resize(), getSize() 같은 method가 있다.

 

const Methods

member variable을 변경하지 않겠다고 약속하는 것이다.

Access Specifiers

member의 접근 수준을 제어하는 것으로 어디까지 제어할지 정할 수 있다.

  • Public: 어디서든 접근 가능하다.
  • Private: 클래스 내부에서만 접근 가능
  • Protected: 클래스 내부와 상속받은 class에서 접근 가능

외부 유저가 굳이 접근할 필요 없는 member에 대해서는 Private을 설정해 놓으면 내부속성이 예상치 않게 변경되는 것을 막아 오류를 줄일 수 있다.

 

또한 구현 세부사항을 숨김으로써 class의 interface를 단순하게 만들 수 있고 이것을 abstraction이라 한다.

 

Class template

현재 SimpleVector class는 오직 int만을 취급한다. 

그럼 다른 type에 데이터를 이용하려면 새로운 class를 만들어야 할까?

 

이럴 경우 유지보수의 어려움이 있고 비효율적이다.

 

Class template은 generic type에 대해 작동할 수 있도록 한다.

type T 파라미터로 다음과 같이 지정할 수 있다.

실제 사용은 다음과 같이 클래스 이름 뒤에 data type을 붙여서 사용한다.

compiler는 이때마다 instance화(실제코드로 변환)해준다.

class template을 이용할 경우 다음과 같은 장점이 있다.

  • Reusability: 한 번의 코드 작성으로 모든 타입 지원 가능하다.
  • Performance: copiler가 compile시 코드가 생성되므로 type에 최적화돼 생성된다. 따라서 훨씬 빠르고 안전하다.
  • Maintainability: 로직이 한 곳에만 있으므로 버그 수정 및 기능개선을 단 한 곳에서만 하면 된다.
  • Type safety

Out-of-Class Definition

class의 선언과 구현을 분리하는 방식이다.

SimpleVector class로 예시로 들어보면

왼쪽과 같이 각 함수를 선언만하고 구현은 하지 않는다.(헤더파일에)

Class 외부에서 선언만 한 함수를 직접 구현한다. 

Class Template를 외부 정의할 때 반드시 해야할 3가지는

  • template<typename T>를 구현하고자하는 함수 앞에 반드시 붙인다.
  • 함수 이름 앞에 classname<T>::를 붙인다.
  • 클래스 내부 멤버들은 this->같은 거 없이도 사용할 수 있다.

다음과 같이 분리해서 사용하면 class interface가 깔끔해진다.

구현은 cpp나 하단에 빼면 되므로 가독성이 올라간다.

 

또한 유지보수가 용이하고 컴파일 성능이 향상된다.

 

그러나 class template은 compile 시점에 인스턴스화되기 때문에 선언과 구현을 분리하면 안된다.