반응형

객체지향 원리

1. 추상화

어떤 영역에서 필요하는 속성이나 행동을 추출하는 작업(사물의 공통된 추상적 특징을 파악해 인식의 대상으로 삼는 행위)

ex: 아우디 자동차, 벤츠 자동차, 포르쉐 자동차, 현대 자동차 → 자동차(자동차는 아우디, 벤츠, 포르쉐, 현대차의 추상적 개념)

 

2. 캡슐화

요구사항 변경에 대처하는 고전적인 설계 원리

  • 응집도(cohesion): 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타내는 것
  • 결합도(coupling): 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타냄

→ 높은 응집도와 낮은 결합도를 유지할 수 있도록 설계해야 요구사항을 변경할 때 유연하게 대처 가능

캡슐화 → 낮은 결합도를 유지할 수 있또록 해주는 객체지향 설계 원리

  • 정보 은닉을 통해 높은 응집도와 낮은 결합도를 갖도록 한다.
    • 정보 은닉: 알 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것
      • 왜 필요할까? SW는 결합이 많을수록 문제가 많이 발생(e.g. 한 클래스가 변경이 발생하면 이 클래스에 의존하는 다른 클래스들도 변경해야 할 가능성이 커진다. 마치 서로 너무 밀접한 부부는 한 명의 기분이 타인의 기분에 큰 영향을 미치는 것과 같다. 서로 사이가 좋지 않은 부부라면 한 명의 기분이 상대방의 기분에 큰 영향을 미치지 않을 것이다.)

 

3. 일반화 관계

일반화는 또 다른 캡슐화

일반화 관계는 객체지향 프로그래밍 관점에서 상속 관계라고 하는 설명이 매우 많다. 즉, 슈퍼 클래스의 속성이나 기능의 재사용성(reusability)만 강조하는 경우가 많은데 이는 일반화 관계를 매우 제한적으로 바라보는 관점이다. 왜 상속 관계라고 하지 않고 일반화 관계라고 하는지 고민을 해보는 것도 좋을 것이다.

철학에서는 일반화(generalization)를 ‘여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정’이라 한다. 예를 들어, 원숭이, 고릴라, 돼지, 강아지, 고양이 등이 가진 공통된 하나의 개념이 무엇이냐고 묻는다면 대부분 동물이라고 답할 것이다. 다른 예를 들어보면, 사과, 바나나, 배, 감, 귤 등은 공통된 개념이 무엇이냐고 묻는다면 과일이라고 대답할 것이다. 즉, 동물과 과일은 앞에서 나열한 것들을 일반화한 개념이며 원송이, 고릴라, …, 감, 귤 등은 동물과 과일을 특수화(specialization)한 개념이다. 이와 같이 일반화를 하면 각각의 종류에 신경 쓰지 않고 전체를 다룰 수 있다는 장점이 있다. 쉽게 예를 들자면 아이와 동물원을 놀러 갔다고 가정해보자. 이때 일반화가 없다면 아이는 나에게 “원숭이는 몇 마리가 있고 고릴라는 몇 마리가 있고 돼지는 몇 마리가 있으며 강아지와 고양이는 몇 마리가 있어요?”와 같이 모든 동물들 종류에 대해서 물어볼 것이다. 하지만 일반화가 가능하다면 아이는 이렇게 말할 것이다. “이 동물원에는 총 동물이 몇 마리 있어요?”. 훨씬 간단하게 질문이 바뀌지 않았는가? 이것이 일반화의 힘이다.

  • 특수화(specialization): 일반화의 역관계, 슈퍼 클래스에서 서브 클래스를 추출하는 과정

 

4. 다형성

다형성은 ‘서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력’이다. 이때 메시지를 받는다는 것은 함수 호출을 의미하는데, 가령 동물의 울음 소리를 내는 cry()라는 함수가 있다고 하자. 앞서 살펴본 일반화를 통해 고양이, 강아지, 앵무새 등 동물마다 같은 함수를 쓰지만 다른 울음 소리를 출력하고 싶을 때 사용할 수 있는 것이 바로 다형성이다. 예를 들어 고양이 클래스에서는 cry() 함수를 다시 정의해서 ‘야옹’을 출력하도록 하고 강아지 클래스에서도 cry() 함수를 다시 정의해서 ‘멍멍’을 출력하도록 하듯이 말이다. 이 간단한 예시를 통해 알 수 있듯이 다형성은 상속과 연계되어 동작하면 매우 강력한 힘을 발휘한다.

 

개념을 제대로 이해했는지 확인하고 싶으면 아래의 문제를 풀어보길 바란다.

1. 다음 중 잘못 연결된 것은?

  1. 추상화: 시스템 모델링의 기반이다.
  2. 일반화: 객체지향 방법에서 기능을 재사용하는 유일한 방법이다.
  3. 캡슐화: 변경의 영향을 최소화한다.
  4. 다형성: 코드를 간결하게 하고 변경사항에 유연하게 대처할 수 있게 한다.

 

2. 다음 괄호에 알맞은 용어는 무엇인가?

  • 일반화 관계는 클래스들을 외부로부터 은닉하는 (    )로 간주할 수 있으며 클라이언트가 개별적인 클래스들과는 무관하게 프로그래밍할 수 있다.
  • (    )는 변경의 영향을 최소화한다.