00. Object Oriented Programming
11363 단어 Design PatternJavaDesign Pattern
객체 지향 프로그래밍
추상화 (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
에 의존하고 있다.
Author And Source
이 문제에 관하여(00. Object Oriented Programming), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jimin3263/00.-Object-Oriented-Programming저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)