객체 지향 프로그래밍의 주요 개념 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) 함수를 사용하여 오버라이딩을 할 수 있다.
- 다형성은 객체지향 프로그래밍의 핵심이다.
- 인터페이스를 사용하지 않더라도, 유지 보수를 할 수 있기 때문이다.
'객체 지향 프로그래밍' 카테고리의 다른 글
객체 지향 기초(OOP with C++)_객체 지향 프로그래밍이 나온 이유 : (22.05.30) (0) | 2022.05.30 |
---|