본문 바로가기

소프트웨어

[소프트웨어] 객체지향의 기본원리 정리

OOP

객체 지향 프로그래밍(Object Oriented Programming), 객체라는 기본단위로 나누고 객체의 상호작용을 서술하는 방식, 쉽게 현실 세계를 프로그램 언어로 서술한 것

추상화

  • 어떤 영역에서 필요로하는 하는 속성이나 행동을 추출하는 작업
  • 여러 개체들의 집합을 클래스라고 부름 (일반화하다)

캡슐화

정보 은닉

  • 알 필요가 없는 정보에 대해서 외부에서 접근하지 못하도록 제한하는 것
  • 내부 속성의 타입이나 로직이 변경되었다고 해서, 메서드의 반환 타입을 기존과 같이 유지한다면 참조하고 있는 다른 코드를 변경할 필요가 없음
  • 변경이 필요하다면, 추 후에 deprecated 등의 신택스를 사용해 서서히 옳바른 코드로 변경해나가면 됨

일반화 관계

  • 정보, 기능의 재사용도 가능함 (슈퍼클래스의 메서드를 오버라이드하지 않은 이상 그대로 사용 가능)
  • 클래스 자체를 캡슐화 (클래스를 자식클래스에서 상속받아 기존 메서드를 오버라이드 함으로써 메서드가 아닌 클래스 수준의 캡슐화가 가능하다.)
  • 일반화 관계는 A is kind of B 가 성립해야한다.
    • 성립이 되지 않는 경우에는 위임(delegate)한다.
    • 위임은 대상의 B를 내부 속성으로 두고 위임메서드를 생성해 기능을 동일하게 호출하면 된다.

다형성

서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력

  • 예를 들어 새, 강아지, 고양이들의 talk()라고 했을 때 서로 다른 소리를 냄
  • 하지만 위 예는 모두 동물이라는 하나의 집합으로 표현할 수 있음

피터 코드의 상속 규칙

  • 자식 클래스와 부모 클래스 사이는 역할 수행(is role played by) 관계가 아니여야 한다.
  • 한 클래스의 인스턴스는 다른 클래스의 인스턴스로 변환할 필요가 절대 없어야한다. (애초에 불가능)
  • 자식 클래스는 부모의 클래스의 책임을 무시하거나 재정의 하지 않고 확장만 수행해야한다.
  • 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않아야한다.
  • 자식 클래스가 역할, 트랜잭션, 디바이스 등을 특수화(specialization, 명확하게 하다)해야한다.