객체 지향 프로그래밍의 4가지 특징

오늘 날씨는 야옹·2024년 1월 22일
0

C++

목록 보기
1/8

객체 지향 프로그래밍 (Object-Oriented Programming, OOP)

  • 정의: 여러 독립적인 객체들의 유기적인 협력과 결합으로 이루어지는 프로그래밍 방법론

  • 장점:

  1. 반복적인 코드 최소화 (코드를 간결하게 표현)
  2. 인간 친화적이고 직관적인 코드 (실제 우리가 보고 경험하는 세계를 반영하였기 때문에)
  3. 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있음.

-> 코드의 변경을 최소화하고 유지보수 하는 데 유리함


객체 지향 프로그래밍의 4가지 특징

1. 추상화 (Abstration)

객체의 공통적인 속성과 기능을 추출하여 정의

  • sub-class들의 공통적인 기능(메서드)/속성(변수)를 추출하여, super class에 정의
  • 보통 인터페이스를 이용
  • 인터페이스: 모든 멤버가 추상 메소드인 타입
    멤버 필드나, 구체적으로 구현한 메서드를 갖지 않음.
    그저 특정 기능을 약속한 메서드만 가짐.
    또한 모든 멤버는 public으로 접근 지정 (사용하는 개발자끼리의 약속)

Java나 C# 등 다른 OOP 언어에서는 인터페이스 형식을 제공하지만, C++ 언어에서는 인터페이스 형식을 제공하지 않음.
대신 순수 가상 함수를 이용하여 정의

  • 가상 함수(virtual function): 파생 클래스에서 재정의할 것으로 기대하는 멤버 함수
    반드시 재정의해야 하진 않음. 그저 재정의가 가능할 뿐!
  • 순수 가상 함수(pure virtual function): 파생 클래스에서 반드시 재정의해야 하는 멤버 함수
    => 문법

    virtual 멤버함수의원형=0;

순수 가상 메서드를 가진 클래스들

  • 추상 클래스: 순수 가상 함수를 하나 이상 포함하고 있음. 때문에 자식 클래스들이 이를 오버라이딩할 것을 강제한다.

  • 인터페이스: 모든 함수가 순수 가상 함수인 클래스. 본인만의 멤버 변수는 가지지 않음.

추상 클래스/인터페이스 모두 추상화를 위해 쓰이며, 객체로 만들어질 수 없다. (new 연산자 불가)

2. 상속


하위 클래스는 상위 클래스를 상속함으로써 코드를 재사용할 수 있다.

  • C++에서의 문법

    class 클래스명 : 접근제한자 클래스명

  • 하위 클래스의 생성
  • 하위 클래스의 메서드 오버라이딩:
    상위 클래스의 기능을 그대로 사용하지 않고, 재정의함.

상속 관계의 경우, 인터페이스보다 추상화의 정도가 낮음. 인터페이스는 하위 클래스에서 구체적인 구현을 강제하지만, 상속은 상위 클래스의 코드를 재사용해도 상관없기 때문에.

3. 다형성

객체지향의 꽃
어떤 객체의 속성이나 기능이 상황에 따라 여러 형태를 가짐.
메서드 오버라이딩 & 메서드 오버로딩으로 이를 구현할 수 있지만, 더 핵심적인 것은
상위 클래스 타입의 참조 변수로, 그것과 관계있는 하위 클래스들을 참조할 수 있는 능력

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 클래스는, 각각의 클래스 내부가 변경되거나 다른 객체가 새롭게 교체되더라도 신경 쓰지 않아도 됨. 오직 인터페이스에만 의존

4. 캡슐화

외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한 부분만 외부로 노출되게 함.
=> 객체 고유의 독립성과 책임 영역 보호

이를 구현하는 방법 두 가지

  • 접근 제어자
  • getter/setter
  • friend

C++에는 세 가지의 접근 제어자가 존재
1) public: 누구나 접근 가능
2) private: 외부에서 접근 X, 해당 객체의 public 멤버 함수를 통해서만 접근 가능
3) protected: public 또는 protected로 파생된 하위 클래스들만 접근 가능

Friend: 두 클래스가 기능상 밀접한 관계에 있고, 상대방의 private 멤버에 접근해야 할 때 사용
Friend class도 있고, Friend 함수도 있음.


참고

0개의 댓글