[C++] Class

Connected Brain·2025년 10월 18일

Class

객체 지향

  • Class란 객체 지향 프로그래밍 설계의 기본 단위가 되는 구조
  • 작은 모듈을 설계한 후 해당 모듈들을 합쳐 하나의 프로그램을 만듦
  • 객체는 데이터 필드와 함수들로 구성됨

Data field : 해당 객체의 상태 등의 정보를 담고 있음
Functions : 객체가 수행할 수 있는 행동을 정의

절차 지향 프로그래밍과의 차이점

  • 절차지향 프로그래밍에서는 데이터와 함수가 산개해 있음
  • 각각의 절차가 시행되면서 데이터를 변경하기 때문에 결합이 강하고, 각각의 절차가 끼치는 영향의 범위가 큼
  • 절차가 진행되는 순서를 통해 기능이 실행되므로 재사용이 어려움
  • 테스트하기 위해서는 모든 절차를 순서대로 실행해야해서 작은 단위로 테스트 할 수 없음

Class 와 Object

Class

  • Object(객체)를 생성하기 위한 청사진, 설계도
  • 프로그램 실행시 해당 클래스를 바탕으로 객체를 생성해 사용
  • Data Field와 Function를 가지고 있음

Object

  • 클래스를 통해 만들어지는 객체
  • 미리 선언된 클래스의 요소(Data Field와 Function)을 가지고 있음
  • 생성 후 실제 메모리 상에 존재
  • 하나의 클래스를 통해 서로 구분되는 여러 객체를 만들 수 있으며 각각의 객체들은 서로 다른 메모리 공간을 가지고 있는 독립적인 존재

Class를 사용할 때의 장점

일반적인 경우

  • 현실에서 무언가를 설계할 때의 경우와 더 유사해 자연스러움
  • 요구사항이 변할 때도 해당 기능이 동작하는 작은 범위만 수정하여 해결할 수 있음
  • 상속, 다형성을 통한 재사용에 용이
  • 모듈화된 구조와 테스트 용이성 등으로 유지보수에 유리

개발자의 경우

  • 설계에 보다 신경을 써야하지만 클래스를 잘 구성해 놓으면 사용에 유리하고 각각의 클래스 범위 한정되게 기능을 구현해 안전하게 구현할 수 있음
  • 캡슐화나 인터페이스 등의 기술을 활용해 외부로부터 숨기고 싶은 정보를 숨길 수 있음
  • 사용자의 실수를 방지할 수 있음

클래스의 사용자의 경우

  • 기능이 구분되어 있어 사용에 유리
  • 해당 클래스 내부의 복잡한 내용까지 알 필요가 없음
  • 해당 클래스가 어떻게 동작할지 파악하기 쉬움

핵심 개념

Abstraction(추상화)

  • 해당 클래스가 어떤 것을 하는지만 공개하고, 해당 기능을 수행하는 데에 필요한 정보는 숨김
  • 자세한 부분은 숨기고 필수적인 부분만 남기는 것이 핵심

Object to Class

실제 여러 객체들의 공통적인 특성을 포착해 클래스로 구성

Class to Parent Class

여러 관계된 클래스들의 공통점을 포함하는 부모 클래스를 구성

  • 해당 과정을 통해 보다 구조를 단순화하고 이후 다형성을 구현하는 것이 쉬워짐

Encapsulation(캡슐화)

  • 상태와 행동을 하나로 묶어 관리
  • 내부적인 부분을 숨기고 외부로 부터의 변경에서 보호
  • PrivatePublic 한정자를 통해 구현
  • 외부에 공개하지 않을 요소들은 Private 필드에, 외부에 공개될 요소들은 Public 필드에 포함시킴
class Stock{  

    private:
        int value;

    public:
        Stock(int v) : value(v) {}

        int getValue() {
            return value;
        }
};
  • 주식을 클래스로 구성할 때 외부에서 값을 그대로 가져와 변경할 수 있으면 문제가 발생할 수 있으므로 생성자를 통해 값을 입력하고 외부에서 해당 값을 필요로 할 때는 getValue() 함수를 통해 값을 가져와 사용

Inheritance(상속)

  • 상속을 통해 이미 작성한 내용을 재사용하거나 기능을 확장할 수 있음
  • C++은 C#과 달리 다중 상속이 가능 (다이아몬드 문제를 발생시킬 수 있음)
  • 상속 관계에 있는 하위 클래스는 상위 클래스의 요소를 포함하고 있음
class Animal{
    private:
        int age; 
};
class Dog : Animal{};

class Cat : Animal{};
  • 위와 같은 구조로 클래스를 선언할 경우 Animal 클래스는 Dog, Cat 클래스의 부모 클래스로, 두 클래스 모두 age라는 필드를 가지고 있음

Polymorphism(다형성)

  • 하나의 인터페이스를 다르게 구현해 사용할 수 있음(by Override)
  • 실행 중에 여러 함수 중 하나를 선택해 호출(by Overloading)
  • 상위 부모 클래스에는 virtual 함수를 포함하고, 이를 하위 클래스에서 구체적으로 구현하는 override를 통해 서로 다른 기능을 수행하도록 할 수 있음
class Animal{
    public:
        virtual void Sound(){};
};
class Dog : Animal{
    public:
        void Sound() override
        {
            printf("Woof Woof\n");
        }
};

class Cat : Animal{
    public:
        void Sound() override 
        {
            printf("Meow Meow\n");
        }
};

int main()
{
    Dog dog;
    dog.Sound();
    Cat cat;
    cat.Sound();
    return 0;
}

출력

Woof Woof
Meow Meow
  • 같은 Sound()라는 함수를 호출했지만 각각의 클래스에서 구현하고 있는 형태가 다르기 때문에 각기 다른 출력 값을 보여줌

Struct와의 차이점

  • 서로 타입이 다른 데이터를 하나에 모아서 사용한다는 점은 기존 C언어의 Struct와 유사하며, 실제로 이를 바탕으로 발전시킨 것이 Class
  • 필드에 접근하기 위해 .을 통해 접근하는 것도 동일함
class Stock{  

    public:
        Stock(int v) : value(v) {}

        int value;

        int getValue() {
            return value;
        }
};

struct Cash
{
    int amount;
    Cash(int a) : amount(a) {}
};

int main()
{
    Stock stock(100);
    printf("%d\n",stock.value);
    Cash cash(10);
    printf("%d\n",cash.amount);
    return 0;
}

출력

100
10
  • 위와 같이 생성자와 파괴자, 함수, 연산자, 상속, 접근제한자 등 많은 부분이 유사하지만
    struct는 기본 필드의 접근 레벨이 public이며 classprivate 이라는 차이점이 있음
  • 이러한 유사점에도 불구하고 struct 구조를 유지시킨 이유는 C언어로 작성된 코드를 C++에서도 사용하기 유리하도록 하기 위해 이를 유지함

접근제한자

Private

  • Class의 기본 접근제한자
  • 따로 명시하지 않은 요소는 기본적으로 외부로부터 숨겨짐

Public

  • 외부에서 접근할 수 있는 요소
  • 주로 값을 보여주거나, 생성자 등 데이터를 입력하는 함수에 사용

Protected

  • 상속관계에 있는 클래스에서만 접근 가능하도록 함

0개의 댓글