티스토리 뷰

추상화를 통한 복잡성 극복

  • 복잡성의 총체인 현실을 그대로 수용하기에 인간의 인지 능력과 저장 공간이 제한적임
  • 본능적으로 이해하기 쉽고 예측 가능한 수준으로 분해하고 단순화하는 전략을 따름

추상화란?

  • 불필요한 부분을 도려내면서 사물의 본질을 드러나게 하는 과정
  • 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성 제거를 목적으로함

추상화의 두가지 차원

  1. 구체적인 사물들간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만듦
  2. 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거하여 단순하게 만듦

객체지향과 추상화

앨리스 이야기

 🏰 앨리스 두번째 이야기 요약
아름다운 정원에 들어선 앨리스는 정원사들과 마주쳤다. 정원사들은 트럼프처럼 생겼고 스페이드 무늬가 그려져 있었다 ….
하트 여왕의 행렬이 정원에 들어섰다. ….
행렬의 맨앞에서 클로버를 든 병사들이 행진해 들어왔다. 그뒤로 다이아몬드로 치장한 신하들이 열을 지어 들어왔다.
…. 그속에는 하얀 토끼도 섞여있었다.
…. 앨리스는 여왕을 쳐다보며 마음속으로 이렇게 속삭였다. ’기껏해야 트럼프에 불과해. 무서워할 필요 없어’

위 이야기에서 수많은 객체들(정원사, 병사, 여왕…)이 등장하나 앨리스는 각 객체의 차이점은 무시한채 공통점만 취해 트럼프라는 하나의 개념으로 단순화 함 (추상화)

그룹 나누어 단순화 하기

  • 객체지향에서는 명확한 경계를 가지고 구별할수 있는 사람이나 사물을 객체라고 함
  • 이야기에서 앨리스는 전체 객체를 ‘트럼프’와 ‘토끼’ 두 개념으로 나누어 단순화 시킴

개념

  • 인간은 본능적으로 공통적인 특성을 기준으로 그룹으로 묶어 단순화하려고 노력함
  • 공통점을 기반으로 객체들을 묶기위한 그릇을 개념이라고 함
  • 개념을 이용한면 객체를 여러 그룹으로 분류할 수 있음
  • 객체에 어떤 개념을 적용해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스라고 함.

개념의 세가지 관점

  • 심볼: 개념을 가리키는 간략한 이름이나 명칭 (ex. 트럼프)
  • 내연: 개념의 완전한 정의를 나타내며 객체가 개념에 속하는지 여부 확인 가능 (ex. 몸이 납작하고 두손과 두발은 네모 귀퉁이에 달려있는 등장인물)
  • 외연: 개념에 속하는 모든 객체의 집합 (ex. 정원사, 병사, 신하, 여왕..)

객체를 분류하기 위한 틀

  • 분류란 특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 시키지 않는 작업을 의미
  • 객체를 적절한 개념에 분류한 애플리케이션은 유지보수가 용이하고 변경에 유연함
  • 적절한 분류체계는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 지도를 제공함

타입

  • 타입의 정의는 개념의 정의와 동일함
  • 타입은 공통점을 기반으로 객체들을 묶기 위한 틀임

객체와 타입

  • 어떤 객체가 어떤 타입에 속하는지 결정하는것은 객체가 수행하는 행동임
  • 객체의 내부적인 표현은 외부로부터 철저하게 감춰야함

행동이 우선이다

  • 동일한 책임(행동)을 수행하는 일련의 객체는 동일한 타입에 속함
  • 객체의 타입을 결정하는것은 객체의 행동일 뿐 데이터(상태)는 아무런 영향도 미치지 않는다
  • 동일한 타입에 속한 객체는 내부 표현 방식이 다르더라도 동일한 메시지를 수신하고 처리 할 수있음 (다형성)
    • 다만, 처리하는 방식은 서로 다를 수밖에 없음
  • 행동만이 고려 대상이며 데이터는 감춰야함 (캡슐화)
    • 객체를 행동에 따라 분류하기 위해 지켜야 하는 기본 원칙임

타입의 계층

일반화와 특수화

  • 일반화/특수화 관계를 결정하는 것은 객체의 행동
  • 일반적인 타입이란 특수한 타입이 가진 모든 행동들 중 일부 행동만 가지는 타입
  • 특수한 타입이란 일반적인 타입이 가진 모든 행동과 자신만의 행동을 추가한 타입

슈퍼타입과 서브타입

  • 일반적입 타입 = 슈퍼타입, 특수한 타입 = 서브타입
  • 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성이 만족되야함
  • 서브타입은 슈퍼타입의 행위와 호환되기 때문에 서브타입은 슈퍼타입을 대체 가능해야함
// 슈퍼타입: 동물을 나타내는 추상 클래스
abstract class Animal {
    abstract void makeSound();
}

// 서브타입 1: 강아지 클래스, 동물을 확장하여 특화된 행위를 추가
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("멍멍!");
    }

    void wagTail() {
        System.out.println("꼬리를 흔들다.");
    }
}

// 서브타입 2: 고양이 클래스, 동물을 확장하여 특화된 행위를 추가
class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("야옹!");
    }

    void scratch() {
        System.out.println("할퀴다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // 슈퍼타입 참조 변수로 서브타입 객체를 다루기
				// 서브타입이 슈퍼타입을 대체
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        // 슈퍼타입의 메서드 호출 (다형성)
        myDog.makeSound();  // "멍멍!"
        myCat.makeSound();  // "야옹!"

        // 서브타입 고유의 메서드 호출
        ((Dog) myDog).wagTail();  // 꼬리를 흔들다.
        ((Cat) myCat).scratch();   // 할퀴다.
    }
}

UML 표기 방법

타입의 목적

  • 타입을 사용하는 이유는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기 어렵기 때문
  • 객체가 가질수 있는 모든 경우를 나열하는 대신 임의의 값을 가질 수 있다는 사실만 고려함으로써 단순화 시킴

결국 타입은 추상화다

  • 타입을 이용하면 객체의 동적인 특성을 추상화 할 수 있음
  • 타입을 이용하면 시간에 따른 객체의 상태변경이라는 복잡성을 단순화할 수 있음

클래스

  • 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것임
  • 클래스는 타입 구현 이외에도 코드 재사용 용도로 사용됨
  • 객체를 분류하는 기준은 타입이며 타입을 나누는 기준은 객체가 수행하는 행동(책임)임
  • 객체를 분류하기 위해 타입을 결정한 후 언어를 통해 타입을 구현하는 한가지 방법이 클래스
객체지향에서 중요한 것은 동적으로 변하는 객체의 ‘상태’와 상태를 변경하는 ‘행위’임.
클래스는 타입을 구현하기 위해 언어에서 제공하는 구현 메커니즘일 뿐!

 

댓글