2022년 03월 22일 TIL

OOP 이야기

1. 객체지향 프로그래밍

  • 프로그램이 거대화 하면서 이를 해결하기 위해 등장하였다.
  • 거대화된 프로그램의 동작을 객체들에게 나눠서 수행

객체

  • 개념적인 용어 : 객체

  • 기술적인 용어 : class, instance

  • 객체는 작은 기능을 수행하며 서로 협력한다.

  • 객체는 type으로 구분한다. type은 class로 만들 수 있다.

  • implements Runnable

    • 스레드를 생성한다.
    class MyObject extends Object implements Runnable {
    }

2. 객체지향의 특성

캡슐화

객체는 스스로 동작할 수 있어야 한다. 외부에 의존하거나 외부의 침략을 제한해야한다.

  • 완성도
    기능을 수행하는 단위로써 완전함을 가진다.

  • 정보 은닉
    밖에서 객체 내의 저옵를 접근하지 못하도록 한다.

  • 접근지정자

    • private
      객체 소유

    • protected
      상속된 객체에서도 접근 가능

    • (friendly)
      같은 패키지 내에서 접근 가능(패키지 가능성, 패키지 내에서만 특정 객체의 접근을 허용하는 경우)

    • public
      누구든지 접근 가능

상속

  • 상위, 부모, super, [추상]
  • 하위, 자식, (this), [구체]
  • 기능으로 접근하지 마라! 추상과 구체의 관계로 접근하라!

추상화된 객체

  • 추상화된 객체 : 추상체
  • 구체적인 객체 : 구상체
  • 객체간의 관계에서 상위에 있는 것이 항상 하위보다 추상적이어야 한다.
  • 다형성을 위해 추상체를 사용한다.

다형성

  • type을 여러가지로 표현할 수 있도록 한다.
  • 필터링된 기능을 제공할 수 있다.
class NaverLogin implements Login, Portal {...}

Login login = new NaverLogin();
login.login();

Portal portal = new NaverLogin();
portal.portal();

Login → login() O, portal() X
Portal → login() X, protal() O

3. 객체지향 설계

UML: Class Diagram

객체지향 설계를 설명하기 위한 도구

  • 일반화(extends)
    • B -> A, B가 A를 상속하였다.
  • 실체화(implements)
    • B -> A, B가 A를 구현하였다.
  • 의존
    • A -> B, A가 B를 의존한다.
    • A가 동작할 때 B가 있어야한다.
    • DI를 생각해라!
  • 연관
    • 관련은 있는데 정확한 관계를 모른다.
  • 직접연관
    • A -> B, A(주체)가 B(대상)를 사용한다.
  • 집합연관
    • A -> B, A가 B를 소유한다.
    • 하지만 B가 없더라도 A가 존재하는데 문제가 되지 않는다.
  • 복합연관
    • A -> B, A가 B를 소유한다.
    • A가 존재하기 위해서 B가 반드시 있어야 한다.

어떻게 하면 객체를 잘 나누고 연관지을 수 있느냐?

  • 객체지향 5가지 원칙
  1. SRP: 수정이될 때 수정되는 이유는 하나 때문이어야 한다.
  2. OCP: 수정에는 닫히고 확장에는 열려 있어야 한다.
  3. LSP: 추상객체로 사용되는 부분에 구상객체가 들어가도 아무 문제가 없어야 한다.
  4. ISP: 필요 없는 구현하지 않도록 인터페이스를 분리한다.
  5. DIP: 변화하기 쉬운 것 또는 자주 변화하는 것보다 거의 변화가 없는 것에 의존해야 한다.

원칙에 따라 설계하니 공통점이 보이내 → 23가지 디자인 패턴

좋은 웹페이지 즐겨찾기