본문 바로가기
객체 지향 프로그래밍

객체 지향 기초(OOP with C++)_객체 지향 프로그래밍의 주요 개념 4가지 : (22.05.30)

by Luden59 2022. 5. 30.

객체 지향 프로그래밍의 주요 개념 4가지

1. 캡슐화

2. 상속

3. 추상화

4. 다형성


1. 캡슐화

  • 데이터와 데이터를 다루는 함수를 같이 작성하는 것
//C 언어에서의 예시
struct Car
{
	const char* Name;
}

void Car_Create(Car* car, const char* name)
{
	car->Name = name;
}

void Car_MakeSound(cosnt Car* char)
{
	printf("The Car's Name is %s", car->Name);
}
  • 절차 지향 프로그래밍에서는 위와 같이 데이터와 데이터를 다루는 함수를 나눠서 정의했다.
//C++ 에서의 예시(캡슐화)
class Car
{
private:
	//데이터 영역
    const char* _name;
    
public:
	//데이터를 다루는 함수 영역
    Car(const char* name)
    {
    	_name = name;
    }
    
    void MakeSound() const
    {
    	printf("The Car's Name is %s", this->_name);
    }
};
  • 객체 지향 프로그래밍에서는 위와 같이 데이터와 데이터를 다루는 함수를 함께 정의 한다
  • Car(const char* name) : 생성자.
    • 어떤 객체를 생성하는 함수.
    • 위의 C에서의 절차지향 프로그래밍의 예시에서 Car_Create와 같은 역할을 한다.
    • 생성자 사용 방법의 예시
      • 다음과 같이 생성자를 통해 더 직관적인 초기화를 시킬 수 있다.
      • 객체를 이용하여 함수를 호출하는 것을 확인할 수 있다.
Car car("기아");
car.MakeSound();
  • MakeSound(): 더 이상 포인터 변수를 작성할 필요가 없어짐.
    • 이전에 인자를 통해 받았던 포인터 변수는 this 포인터라는 특수한 포인터로 대체 됨.

2. 상속

  • 코드를 물려받는 것. 
  • 즉, 코드를 재사용할 수 있게 된다.
Class Car
{
private:
	const char* _name;
public:
	Car(const char* name)
    {
    	_name = name;
    }
    
    void MakeSound()
    {
    	printf("This Car's Name is %s", _name);
    }
};


Class SportsCar : public Car
{
public:
	SportsCar(cosnt char* name)
    {
    	Car(name);
    }
};

Class Truck : public Car
{
public:
	Truck(const char* name)
    {
    	Car(name);
    }
};

SportsCar sports("포르셰 카이만");
Truck truck("덤프 트럭");

//두 객체 모두 상위 클래스의 MakeSound 함수를 사용할 수 있다.
sports.MakeSound();
truct.MakeSound();
  • 타입을 더 작은 단위로 모듈화 할 수 있게 된다.
    • 관심 부분을 줄일 수 있게 된다. 
      • 어떤 한 함수를 모두 사용하는 클래스들이라면 상위 클래스의 함수 내용만 변경하면 된다.
    • 재사용할 수 있는 단위로 만들 수 있다.

3. 추상화

  • 구현 세부 정보를 숨기는 일반적인 인터페이스를 정의하는 행위.
  • 인터페이스란?
    • 서로 다른 부분이 만나고 소통하거나 서로에게 영향을 미치는 영역을 의미한다.
    • 예를 들어 전등을 켜거나 끌 때 스위치로 조작을 하게 된다. 여기서 인터페이스는 스위치이다.
      • 우리는 스위치로 조작을 할 때 내부적인 배선이 어떻게 이루어지는지 알 수 없고, 알 필요도 없다.
      • 같은 의미로 모니터의 hdmi  포트 또한 인터페이스라고 할 수 있다.
  • 추상화를 잘하면
    • 추상화를 잘한것의 기준
      • 사용하기 편리한가
      • 즉 함수를 얼마나 잘 만들었는가
    • 데이터를 다루기 쉬워진다.
    • 프로그램을 더 빠르고 편리하고 안전하게 작성할 수 있다는 것을 의미한다.
    • 구현 세부 상항에 변화가 생기더라도 사용하는 입장에서는 달라지는 것이 없어진다.\
      • 확장성을 갖게 된다.

4. 다형성

  • 여러가지 형태를 갖는 것
  • 인터페이스는 같지만, 내부 동작은 다르게 할 수 있는 것.
Class Car
{
public:
	virtual void MakeSound()
    {
    	printf("나는 차다 히히"); //구현 세부 내용
    }
};

Class SportsCar : public Car
{
public:
	virtual void MakeSound() override
    {
    	printf("스포츠카는 빠르지");
    }
};

Class Truck : public Car
{
public:
	virtual void MakeSound() override
    {
    	printf("그냥 집에 가고 싶다");
    }
};

SportsCar sports;
Truck truck;

//가상 함수를 이용하려면 상위 타입의 포인터를 사용해야한다.
Car* car = &sports;
car->MakeSound();

car = &truck;
car->MakeSound();
  • 위와 같이 C++에서는 가상 함수(virtual) 함수를 사용하여 오버라이딩을 할 수 있다.
  • 다형성은 객체지향 프로그래밍의 핵심이다.
    • 인터페이스를 사용하지 않더라도, 유지 보수를 할 수 있기 때문이다.