객체지향 프로그래밍(OOP)이란?

객체지향 프로그래밍(OOP)이란?


기존의 절차지향 프로그래밍 방식에서 발견된 문제점을 보완하기 위해 로직을 상태와 행동으로 이루어진 객체로 만드는 프로그래밍 방식이다. 유지보수가 쉬워 대형 프로젝트에 적합하다는 장점이 있지만, 실행속도가 절차 지향에 비해 느리고, 설계에 많은 시간이 투자된다는 단점이 있다.

절차 지향 프로그래밍이란?

순차적으로 처리되는 프로그래밍 기법. 실행속도가 빠르고 구현이 쉽지만, 기능을 구현하는 데 제한적이다.

클래스란?


클래스는 객체지향 프로그래밍에서 가장 핵심부분이다. 클래스는 간단히 말해서 구조체의 개념이 확장된 것이다.  멤버 변수 뿐만 아니라 멤버 함수, 즉 메소드도 포함될 수 있으며, 객체지향 프로그래밍의 주요 특징들이 포함되어 있다.

인스턴스란?


인스턴스는 객체로 구현된 클래스를 의미한다. 인스턴스와 클래스의  관계를 간단히 말하면, 클래스는 청사진, 인스턴스는 그 청사진으로 만든 것이라고 할 수 있다.

예시 코드

struct ExA // This is struct. default access modifier is private.
{
    int intNumber;
    double doubleNumber;
    // void Print(); struct can’t contain functions.
}
class ExB // This is class. default access modifier is public.
{
    int intNumber;
    double doubleNumber;
    void Print(); // class can contain functions.
}
int main()
{
    ExB example = new ExB();
    // In this case, variable example is an instance.
    return 0;
}
cs

객체 지향의 특징 3가지


  1. 캡슐화(Encapsulation)

    관련 이미지
    캡슐화는 캡슐 알약처럼 프로그램의 세부적인 내용물이 겉으로 드러나지 않게 클래스로 감추는 것을 말한다. 대부분의 언어에서도 사용되는 개념이지만, 객체 지향 프로그래밍에서는 특히나 더 중요하게 쓰이는 개념이다. 객체 지향에서는 기본적으로 public, protected, private로 접근 제한의 범위를 설정 가능하다.

    • public: 모든 외부 클래스에서 사용 가능하다.
    • protected: 다른 외부클래스에서는 접근이 불가능하지만, 상속받은 클래스에서는 접근할 수 있다.
    • private: 해당 클래스에서만 접근 가능하다.
  2. 상속(Inheritance)

    상속은 우리가 생각하는 재산 상속과 같은 개념과 비슷하다. 상속받은 클래스를 보통 서브 클래스 또는 자식 클래스라고 부르고, 상속하는 클래스는 슈퍼 클래스 또는 부모 클래스라고 부르는데, 이 자식 클래스가 부모 클래스의 기능을 그대로 물려받는 것을 말한다. 부모 클래스에서 정의한 기능을 수정해서 다시 정의하기도 한다. 이 작업을 오버라이딩(Overriding)이라고 부른다.
    상속은 캡슐화를 유지하면서도 클래스의 재사용을 용이하게 한다는 장점이 있지만, 다중 상속이라는 골치아픈 문제를 일으키기도 한다.

    다중 상속이란?

    2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다. 어떻게 보면 편리해 보이지만,  사실 여기에는 엄청난 문제가 생길 수 있다. 흔히 말해 ‘다이아몬드 상속 문제’ 라고 불리는 이것은 다중 상속의 치명적인 문제점이다.

    예를 들어 아래의 그림처럼 클래스 B와 클래스 C는 클래스 A의 자식 클래스이고, 클래스 B와 C로부터 상속받는 클래스 D가 있다고 하자. 그렇다면 클래스 D에는 클래스 A의 요소가 두 번들어가게 되어서 이 경우 객체 지향 언어는 처리할 수 없다. 따라서 상속의 기능을 사용하지 못하고 부모 클래스의 기능을 하나씩 모두 구현해주어야 한다. 이 문제 때문에 객체 지향 언어에서는 다중 상속을 지원하지 않게 되었다. (ex. JAVA)

    다중상속 다이아몬드에 대한 이미지 검색결과

  3. 다형성(Polymorphism)

    하나의 함수 또는 변수명이 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다. 이것을 오버로딩(Overloading)이라고 한다. JAVA는 함수명 오버로딩까지만 되는데, C++, C#에서는 연산자(ex. +, -, ==, -> )도 오버로딩이 가능하다.

객체 지향 프로그래밍 5대 원칙(SOLID)


  1. SRP(Single Responsibility Principle) : 단일 책임 원칙

    모든 클래스는 단 하나의 기능만을 책임져야 한다. 다르게 말하면, 한 클래스 내의 기능이 여러 개면 안 된다는 뜻이다. 계산기로 예를 들면, 화면을 출력하는 기능과 계산하는 기능은 다른 클래스에 각각 있어야 한다는 것이다.

  2. OCP(Open Closed Principle) : 개방-폐쇄 원칙

    모든 구성 요소는 확장에 대해서는 개방되어 있지만, 수정에 대해서는 폐쇄되어 있다. 추상 메소드, 인터페이스에 관한 원칙이며, 구성 요소를 확장하여 객체의 특성을 나타내는 것에 대해서는 개방되어 있지만, 원래의 구성 요소 자체를 수정하여 객체의 특성을 나타내는 것에 대해서는 폐쇄되어 있다는 뜻이다.

  3. LSP(Liskov Substitusion Principle) : 리스코프 치환 원칙

    자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있어야 한다. 위에서 말했듯 자식 클래스는 부모 클래스의 모든 요소를 가지고 있기 때문에 원래 부모 클래스가 있어야 할 자리에 자식 클래스가 들어가도 정상적으로 작동해야 한다는 뜻이다.

  4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙

    클라이언트에서 사용하지 않는 메소드는 사용하지 않는다. 어떻게 보면 단일 책임 원칙과 비슷하다고 볼 수 있지만, 다른 개념이다. 예를 들어, A 클라이언트는 충돌만을 담당하고, B클라이언트는 이펙트만을 담당한다고 했을 때, C라는 인터페이스 안에 이 정보들을 모두 넣는다고 하자. 그렇다면 A 클라이언트는 필요없는 이펙트 인터페이스를 받게 되고, B 클라이언트는 필요없는 충돌 인터페이스를 받게 된다. 따라서 인터페이스 C는 충돌 인터페이스와 이펙트 인터페이스 두 개로 분리해야 한다는 것이다.

  5. DIP(Dependency Inversion Principle) : 의존성 역전 원칙

    상위 클래스는 하위 클래스에 의존해서는 안 된다. 부모 클래스의 요소가 자식 클래스의 요소를 참조하면 안 된다는 뜻이다. 어떻게 보면 당연하다고 생각할 수 있지만, 의외로 가장 많이 어겨지는 원칙이다.

글쓴이: BakJH

Student of Daedeok SW Meister Highschool, in Korea.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중