00. Object Oriented Programming

Jimin Lim·2021년 12월 21일
0

Design Pattern

목록 보기
1/12
post-thumbnail

객체 지향 프로그래밍

추상화 (abstraction)

: 추상적인 것으로 만듦

  • 불필요한 정보 외 중요한 정보만 표현
  • 문제로부터 해결 방법을 설계하는 것
  • 클래스의 속성, 절차 결정

캡슐화 (encapsulation)

: 데이터와 함수들을 클래스 내에 댐고 사용자가 사용할 수 있는 부분만 보이도록 함, 나머지는 내부에 감춤

상속 (inheritance)

: 확장, 특수화 → 부모는 자식을 품을 수 있지만 자식은 안된다..

Child는 Parent의 내용을 가짐

오버 로딩

  • 함수의 매개 변수의 개수나 종류 다름, 반환의 종류는 의미 없음
  • 같은 클래스 또는 상속 관계의 클래스에서 유효함

오버 라이딩

  • 상속 관계에서만 의미 있음
    • 상위 클래스의 메서드를 하위 클래스가 재정의
  • 함수의 시그니처 같음

특징

  • 다중 상속 불가 → override toString → 다중 상속한 경우, 어느 부모 클래스에서 정의한 클래스를 가져와야 할 지 결정하기 힘들다. → 다이아몬드 문제

→ 인터페이스 이용

인터페이스

  • 구현할 클래스의 함수 시그니처만 정해 놓음
  • 디폴트 메소드(미리 구현된 함수) 추가 가능 → 함수 일부 미리 구현
  • 디폴트 메소드를 가지고 있는 클래스는 따로 구현하지 않아도 됨, override도 가능
  • 인터페이스의 모든 함수는 public

추상 클래스

  • 멤버 변수 포함 가능 → 가장 큰 차이
  • 미리 구현된 함수 포함 가능 → 인터페이스에서 default method로 구현가능하다.
  • 한 개 이상의 abstract 함수 포함

다형성 (Polymorphism)

  • 동적 함수 호출
  • 컴파일 시점에 선언된 클래스와 다른 객체를 런타임 시 사용하는 것
  • 부모 클래스로 선언된 변수에서 자식 클래스에서 오버라이딩 된 함수 호출 가능
  • 부모에게서 오버라이딩한 자식의 함수를 실질적으로 출력한다.

SRP (Single Responsibility Principle) - 단일 책임 원칙

  • 클래스가 변경되어야 하는 이유는 한 가지로만 구성한다.

Book class의 경우, Book에 관한 속성을 정의하는 책임을 가져야 하는데 load(), show() 등 메소드를 포함해 load, show에 대한 책임도 가지고 있는다.

따라서 BookManager(동작)와 Book(데이터 모델)을 분리하도록 한다. 이때 loader와 viewer가 변경될 수 있으므로 setter를 두어 변경 가능하도록 한다.

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

  • 확장에 대해서는 열려 있어야 하고, 변경에 관련해서는 닫혀 있어야 한다.

loader와 viewer는 수정될 수 있으므로 loader.load()/ viewer.show()함수는 그대로 두고, 다형성을 이용해 상속받은 자식 클래스로 재정의 하도록 한다.

LSP (Liskov Substitution Principle) - 리스코프 치환 원칙

  • 자식 클래스는 부모 클래스를 대체 할 수 있어야 한다.
 class Rectangle {
    private int width;
    private int height;
    public Rectangle(int w, int h) {
        width = w;
        height = h; 
    }
    
    public int getPerimeter() {
        return 2 * (width + height);
    }
    public void setWidth(int w) { 
        width = w; 
    } 
    public void setHeight(int h) { 
        height = h; 
    }
}
 class Square extends Rectangle {
    public Square(int w) {
        super(w, w);
    }
    public void setWidth(int w) { 
        super.setWidth(w); 
        super.setHeight(w);
    }
    public void setHeight(int h) {
        super.setWidth(h);
        super.setHeight(h);
    }
}
 class Main {
    public static void main(String[] args) {
        Rectangle r = new Rectangle(3, 5);
        System.out.println(r.getPerimeter());
        Square s = new Square(3);
        System.out.println(s.getPerimeter()); 
        r = s; 
        r.setWidth(3);
        r.setHeight(5);
        System.out.println(r.getPerimeter()); #16을 기대하지만 20이 나온다.
    }
}

Rectangle을 상속받은 Square는 부모를 대체하지 못하고 있다.

ISP (Interface Segregation Principle) - 인터페이스 분리 원칙

  • 여러 개 클라이언트에 필요한 기능을 가지고 있는 일반화된 인터페이스보다는 각 클라이언트에 특화되어 있는 인터페이스를 사용한다.

DIP (Depenency Inversion Principle) - 의존 역전 원칙

  • 기능을 직접 구현한 구체 클래스보다 추상 클래스나 인터페이스에 의존하는 것이 좋다

BookManager는 추상 클래스인 BookDataViewer, BookDataLoader에 의존하고 있다.

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

0개의 댓글