OOP - 객체 지향 프로그래밍


1. 객체 지향 프로그래밍 (Object Oriented Programming)

1) 객체

객체란 말 그대로 대상을 나타내는 단어이다.

사람 한 명 한명이나, 책 한 권 한 권 모두 객체가 될 수 있다.

사람이 생김새가 모두 다르고 책이 내용이 다르듯이, 객체는 모두 다를 수 있다.

2) 클래스

사람 한 명 한 명은 모두 다르지만, 공통적인 속성을 가지고 있다.

눈, 코, 입, 손, 발 등이 이 속성에 속할 것이다. 책도 마찬가지로 제목, 작가, 출판사와 같은 공통된 속성을 가지고 있다고 할 수 있다.

이렇게 객체들이 갖는 공통적인 속성들을 모아 정의내린 것을 클래스라고 한다.(이를 추상화라고 한다)

흔히 수업시간에 객체와 클래스는 붕어빵과 붕어빵을 찍는 기계로 많이 빗대어 표현한다.

붕어빵을 찍는 기계는 클래스로, 붕어빵이라는 객체들을 생성하기 위한 틀을 제공한다.

3) 객체 지향 프로그래밍(OOP)

OOP는 객체의 관점에서 프로그래밍을 하는 것이다.

C언어는 절차 지향 프로그래밍 언어라 하는데, 절차 지향 프로그래밍은 프로세스가 함수 단위로 순서대로 진행되는 것을 말한다.

하지만 OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다. 즉 한 애플리케이션을 구성하는 요소들을 객체로 보고, 이것들을 유기적으로 연결하여 프로그래밍 하는 것을 말한다.

2. OOP의 특징

1) 추상화

추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념이다.

객체들은 사람으로 따지자면 실제 그 모습, 눈은 고양이 눈매에 입술은 두껍고 등 이런 모습들을 가지고 있지만, 클래스는 객체들이 눈, 코 등 이런 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.

정리해서, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이다.

좋은 예시가 있다.

지도에는 위성지도와 등고선지도 등 여러가지가 있는데, 각 지도마다 목적이 다르다.

  • 위성지도
    • 그 지형의 정확한 실제 모습을 담기 위한 목적의 지도
  • 등고선 지도
    • 지형의 높낮이를 표현하기 위한 목적의 지도

등고선 지도를 그릴 때, 목적에 맞지 않는 부분을 제외하고 필요한 부분(지형의 높낮이)만 표현한다.

2) 캡슐화

자바에는 접근 제어가(public, protected,,)가 존재한다.

private로 정의된 속성은 외부에 노출 시키지 않고 자신의 클래스에서만 사용하기 위해 정의한다.

즉, private으로 정의된 속성은 알약의 실제 내용물이라고 생각하면 되는데, 이런 내용물과 같은 속성들은 외부에 알려줄 필요가 없다. 정보은닉을 할 수 있다는 소리다.

캡슐화와 정보은닉은 같은 개념이 아니다. 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다는 것이다.

여기도 좋은 예시가 있다.

TV의 리모콘을 사용하는데 리모콘의 내부 회로(private으로 정의된 속성)를 알 필요는 없다. 사용자 입장에서는 리모콘의 조작 기능, 즉 public으로 정의된 속성만 알면 되는 것이다.

3) 상속

자식 클래스는 부모 클래스를 상속할 수 있다.

상속이 필요한 이유는 코드의 중복을 없애기 위해서이다.

코드의 중보이 많아지면 개발 단계 뿐만 아니라 유지 보수에도 많은 비용이 들게 된다. (코드의 이원화 문제) 그래서 개발을 할 때는 코드의 중복을 반드시 피해야 한다

OOP에서는 상속을 통해 코드의 중복 문제를 해결할 수 있다.

부모 클래스에 여러 속성들을 정의해 놓고, 자식 클래스가 이를 상속하여 상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 크래스에서 또 정의할 필요가 없다.

4) 다형성

다형성은 형태가 같은데 다른 기능을 하는 것을 의미한다.

부모 클래스로부터 상속을 받은 속성에 대해, 자식 클래스에서 물려받은 속성을 재정의 할 수 있다.

이를 오버라이딩이라고 한다.

다형성을 사용하면 좋은 점이 뭘까?

같은 이름의 속성을 유지함으로써, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다는 것이다.

예를 들어, 고양이 클래스에는 “roar”이라는 속성이 정의되어 있다고 해보자. 사자는 고양이과이므로 고양이 클래스를 상속 받는다고 하면, 사자 클래스에도 “roar” 속성이 자동으로 추가되는 것이다. 하지만 고양이는 “애옹”, 사자는 “으와앙”하고 운다. 같은 “roar”이어도 실제 울음소리는 다르다는 것이다. 하지만 고양이와 사자의 울음소리를 호출하기 위해서는 각 개체에 “roar()”메서드를 호출하면 된다.

API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하다.

정리

  • OOP
    • 객체들이 서로 유기적으로 동작하는 프로그래밍 이론
    • 코드의 재사용성과 중복제거가 큰 목적
  • 추상화
    • 목적과 관련이 없는 부분을 제외해서 필요한 부분을 포착하는 기법
    • 객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법
  • 캡슐화
    • 외부에 노출할 필요가 없는 정보들은 은닉(정보은닉)
  • 상속
    • 상속 관계에 있는 두 클래스에 대해, 부모 클래스가 자식 클래스에게 속성을 물려주는 것
    • 코드의 재사용이 목적
  • 다형성
    • 같은 형태이지만 다른 기능을 하는 것
    • 오버라이딩은 이와 관련된 기능

추가로 다형성과 추상화의 구분에 대해 많이 고민한 글이 있어서 달아논다(https://wlaxhrl.tistory.com/78)