정의: 여러 독립적인 객체들의 유기적인 협력과 결합으로 이루어지는 프로그래밍 방법론
장점:
-> 코드의 변경을 최소화하고 유지보수 하는 데 유리함
객체의 공통적인 속성과 기능을 추출하여 정의
Java나 C# 등 다른 OOP 언어에서는 인터페이스 형식을 제공하지만, C++ 언어에서는 인터페이스 형식을 제공하지 않음.
대신 순수 가상 함수를 이용하여 정의
virtual 멤버함수의원형=0;
순수 가상 메서드를 가진 클래스들
추상 클래스: 순수 가상 함수를 하나 이상 포함하고 있음. 때문에 자식 클래스들이 이를 오버라이딩할 것을 강제한다.
인터페이스: 모든 함수가 순수 가상 함수인 클래스. 본인만의 멤버 변수는 가지지 않음.
추상 클래스/인터페이스 모두 추상화를 위해 쓰이며, 객체로 만들어질 수 없다. (new 연산자 불가)
하위 클래스는 상위 클래스를 상속함으로써 코드를 재사용할 수 있다.
class 클래스명 : 접근제한자 클래스명
상속 관계의 경우, 인터페이스보다 추상화의 정도가 낮음. 인터페이스는 하위 클래스에서 구체적인 구현을 강제하지만, 상속은 상위 클래스의 코드를 재사용해도 상관없기 때문에.
객체지향의 꽃
어떤 객체의 속성이나 기능이 상황에 따라 여러 형태를 가짐.
메서드 오버라이딩 & 메서드 오버로딩으로 이를 구현할 수 있지만, 더 핵심적인 것은
상위 클래스 타입의 참조 변수로, 그것과 관계있는 하위 클래스들을 참조할 수 있는 능력임
Vehicle car = new Car();
즉 하위 클래스의 객체를 생성하여 상위 클래스 타입의 참조변수에 할당해 줄 수 있으며,
이를 하나의 타입만으로 여러 가지 타입의 객체를 참조할 수 있다는 것이다. (아래 코드 참조)
Vehicle vehicles[] = new Vehicle[2];
vehicles[0] = new Car();
vehicles[1] = new MotorBike();
또한, 새로운 Driver라는 클래스가 Car와 MotorBike 타입의 매개변수에 직접 접근하는 경우(Driver가 Car와 MotorBike에 의존함), 즉 객체들 간 결합도가 높은 경우, 객체 지향적인 설계를 하는 데 매우 불리함
=> Driver 클래스가 Vehicle 인터페이스를 통해 접근하도록 함
=> Driver 클래스는, 각각의 클래스 내부가 변경되거나 다른 객체가 새롭게 교체되더라도 신경 쓰지 않아도 됨. 오직 인터페이스에만 의존
외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한 부분만 외부로 노출되게 함.
=> 객체 고유의 독립성과 책임 영역 보호
이를 구현하는 방법 두 가지
C++에는 세 가지의 접근 제어자가 존재
1) public: 누구나 접근 가능
2) private: 외부에서 접근 X, 해당 객체의 public 멤버 함수를 통해서만 접근 가능
3) protected: public 또는 protected로 파생된 하위 클래스들만 접근 가능
Friend: 두 클래스가 기능상 밀접한 관계에 있고, 상대방의 private 멤버에 접근해야 할 때 사용
Friend class도 있고, Friend 함수도 있음.
참고