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

  • OOP 란 인간중심적 프로그래밍 패러다임이라고 할 수 있다.
  • OOP로 작성한 코드는 재사용성이 높다.
  • 소프트웨어의 가치는 변화이다.
  • 이전처럼 잘동작하게 하는 것이 유지보수가 아니다. 변화를 주어서 계속 유용하게 하는 작업이 유지보수이다. Jessica Kerr

1_1 객체지향과 절차지향 프로그래밍 비교

절차지향

  • 일단 쉽다. 하지만 시간이 갈수록 이런 데이터를 공유하는 방식은 변화가 필요할 때 수정을 복잡하게 만든다
  • 요구사항이 늘어갈수록 소스의 복잡도는 올라가고, 수정해야할 코드는 늘어간다.

객체지향

  • 객체는 데이터와 프로시저로 구성된다.
  • 절차지향에 비해서 처음 프로젝트를 시작할 때 어려울 수 있다.
  • 데이터와 프로시저를 알맞게 작성하고, 나누어야하는 부분에서 어려울 수 있다.
  • 객체의 핵심 == 기능 제공

2. 캡슐화

  • 데이터 + 관련 기능 묶기
  • 캡슐화를 통해 기능을 사용하는 코드에 영향을 주지 않고 내부구현을 변경할 수 있는 유연함.
  • 정보은닉 의미를 포함한다.
  • 객체가 기능을 어떻게 구현했는지 외부에 감추는 것
  • 외부에 영향없이 객체 내부 구현 변경가능
  • 기능에 대한 이해를 높인다.(의도를 파악하는데 도움을 준다.)

2_1 캡슐화를 위한 규칙

  • 1. Tell, Don't Ask =>
    • 데이터를 달라 하지말고 처리해서 결과만 줘!
  • 2. Demeter's Law =>
    • Method에서 생성한 객체의 Method만 호출
    • 파라미터로 받은 객체의 Method만 호출
    • 필드로 참조하는 객체의 Method만 호출

3. 다형성

  • 한 객체가 여러타입을 갖는 것
    • 즉 한 객체가 여러타입의 기능을 제공
    • 타입상속으로 다형성을 구현

4. 추상화

  • 데이터나 프로세스 등을 의미가 비슷한 개념이나 의미있는 표현으로 정의하는 과정
  • 아직 존재하지않는 기능에 대한 이른 추상화는 주의
  • 실제 변경, 확장이 발생할 때 추상화 시도하는 것이 좋다.
  • 구현을 한 이유가 무엇 때문인지 정확하게 알고, 생각해야함.
  • 타입 추상화
    • 여러구현 클래스를 대표하는 상위타입도출
    • 추상타입을 사용하면 코드의 유연함을 가져올 수 있다.

5. 객체 지향적 설계 5대 원칙(S.O.L.I.D)

5_1 SRP(Single Responsibility Principle) : 단일 책임 원칙

  • 클래스는 단 하나의 책임을 져야하며 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
  • 이 규칙만 잘지켜도 클래스 구성도가 깔끔하게 정리될 것.
  • Divergent Change, Shotgun Surgery (참고)

    지켜지지않은 예시

    • 변수레벨
    • 하나의 속성이 여러의미를 갖는 경우
    • 어떤 곳에서는 쓰고, 어떤곳에선 쓰지않은 속성이 있는 경우
    • Method 레벨
    • 분기처리를 위한 if문이 많을 경우

5_2 OCP(Open-Closed Principle) : 개방-폐쇄 원칙

  • 확장에는 열려 있어야하고, 변경에는 닫혀있어야한다.??
  • 자신을 확장시키는 것에는 열려있고, 주변의 변화에 대해서는 닫혀있어야한다.

5_3 LSP(Liskov Substitution Principle) : 리스코프 치환 원칙

  • 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램을 정상적으로 동작해야한다.??

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

  • 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야한다.??
  • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야한다.
    • SRP가 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조한다.

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

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.??

이 원칙들은 객체간의 응집도는 높이고, 결합도는 낮추자는 원칙을 재정립한 것이다.