객체지향 설계: Difference between revisions

From CS Wiki
No edit summary
No edit summary
Line 1: Line 1:
[[분류:소프트웨어 공학]]
[[분류:소프트웨어 공학]]
;Object Oriented Designing; Object Oriented Architecting
;Object Oriented Designing; Object Oriented Architecting


== 5원칙 ==
== 특징 ==
; 줄여서 SOLID라고 부른다.
 
=== 단일 책임 원칙 ===
* 객체지향 설계에서 중요한 것은 시스템을 구성하는 객체와 속성, 연산을 정의하는 것이다.
* 객체지향 설계에서는 주어진 객체의 특성을 분석하여 공통된 특징을 갖는 슈퍼클래스를 생성하는 추상화 기법을 통해 객체의 설계 비용과 시간을 줄일 수 있다.
* 객체지향 설계에서는 캡슐화를 통해 객체의 세부내용 변경에 의해 발생될 수 있는 오류의 파급을 줄일 수 있다.
 
==5원칙==
 
;줄여서 SOLID라고 부른다.
 
===단일 책임 원칙===
 
;Single Responsiblity Principle; SRP
;Single Responsiblity Principle; SRP
* 소프트웨어의 컴포넌트는 단 하나의 책임만을 가져야 한다.
==== 예시 ====
; AS-IS
* 복합기 Class
** copy()
** scan()
; TO-BE
* 복사기 Class { copy() }
* 스캐너 Class { scan() }


=== 개방 폐쇄 원칙 ===
*소프트웨어의 컴포넌트는 단 하나의 책임만을 가져야 한다.
 
====예시====
 
;AS-IS
 
*복합기 Class
**copy()
**scan()
 
;TO-BE
 
*복사기 Class { copy() }
*스캐너 Class { scan() }
 
===개방 폐쇄 원칙===
 
;Open Close Principles; OCP
;Open Close Principles; OCP
* 확장에 대해선 열려 있어야 하고 수정에 대해선 닫겨 있어야 한다.
* 기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 해야 한다.
==== 예시 ====
* Class Car { drive() }
* 확장은 허용'''(O)''': Class SUV() extends Car
** override drive();
** new method stop();
* 변경엔 폐쇄'''(X)''': Class Plane extends Car
** change drive() to fly();


=== 리츠코프 치환 원칙 ===
*확장에 대해선 열려 있어야 하고 수정에 대해선 닫겨 있어야 한다.
*기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 해야 한다.
 
====예시====
 
*Class Car { drive() }
*확장은 허용'''(O)''': Class SUV() extends Car
**override drive();
**new method stop();
*변경엔 폐쇄'''(X)''': Class Plane extends Car
**change drive() to fly();
 
===리츠코프 치환 원칙===
 
;Liskov Substitution Principle; LSP
;Liskov Substitution Principle; LSP
* 자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.
==== 예시 ====
* Class SUV extends Class CAR { run() }
* SUV suv = new SUV();
* CAR car = (CAR)suv;
* car.run();


=== [[인터페이스 분리의 원칙]] ===
*자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.
 
====예시====
 
*Class SUV extends Class CAR { run() }
*SUV suv = new SUV();
*CAR car = (CAR)suv;
*car.run();
 
===[[인터페이스 분리의 원칙]]===
 
;Interface Segregation Principle; ISP
;Interface Segregation Principle; ISP
* 자신이 사용하지 않는 메서드는 구현하지 않도록 해야 한다.
 
** 이런 경우 인터페이스는 쪼개져야 한다.
*자신이 사용하지 않는 메서드는 구현하지 않도록 해야 한다.
* 하나의 일반적인 인터페이스 보단 여러 개의 구체적인 인터페이스가 낫다.
**이런 경우 인터페이스는 쪼개져야 한다.
==== 예시 ====
*하나의 일반적인 인터페이스 보단 여러 개의 구체적인 인터페이스가 낫다.
 
====예시====
 
;AS-IS
;AS-IS
* Interface 이동체  
 
** drive();
*Interface 이동체  
** fly();
**drive();
** sail();
**fly();
** stop();
**sail();
**stop();
 
;TO-BE
;TO-BE
* Interface 자동차 { drive(); stop(); }
* Interface 비행기 { fly(); stop(); }
* Interface 배 { sail(); stop(); }


=== [[의존관계 역전 원칙]] ===
*Interface 자동차 { drive(); stop(); }
*Interface 비행기 { fly(); stop(); }
*Interface 배 { sail(); stop(); }
 
===[[의존관계 역전 원칙]]===
 
;Dependency Inversion Principle; DIP
;Dependency Inversion Principle; DIP
* 의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다.
 
* 고차원의 모듈은 저차원의 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존 해야 한다.
*의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다.
* DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미
*고차원의 모듈은 저차원의 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존 해야 한다.
==== 예시 ====
*DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미
 
====예시====
 
;아래와 같이 하면 Car 클래스는 '겨울 타이어'라는 하위 클래스에 의존성을 가지게 된다. (의존성 역전)
;아래와 같이 하면 Car 클래스는 '겨울 타이어'라는 하위 클래스에 의존성을 가지게 된다. (의존성 역전)
* Class Car {  
 
** WinterTire wt = new WinterTire();  
*Class Car {  
** setTireModel(String model) {
**WinterTire wt = new WinterTire();
*** wt.model = model;
**setTireModel(String model) {
** }
***wt.model = model;
* }
**}
*}
 
;아래와 같이 하면 타이어에 대한 의존성이 줄어든다.
;아래와 같이 하면 타이어에 대한 의존성이 줄어든다.
* Class Car {  
 
** Tire wt = null;
*Class Car {  
** setTire(Tire t) {
**Tire wt = null;
*** wt = t;
**setTire(Tire t) {
** }
***wt = t;
* }
**}
*}

Revision as of 02:27, 4 February 2022


Object Oriented Designing; Object Oriented Architecting

특징

  • 객체지향 설계에서 중요한 것은 시스템을 구성하는 객체와 속성, 연산을 정의하는 것이다.
  • 객체지향 설계에서는 주어진 객체의 특성을 분석하여 공통된 특징을 갖는 슈퍼클래스를 생성하는 추상화 기법을 통해 객체의 설계 비용과 시간을 줄일 수 있다.
  • 객체지향 설계에서는 캡슐화를 통해 객체의 세부내용 변경에 의해 발생될 수 있는 오류의 파급을 줄일 수 있다.

5원칙

줄여서 SOLID라고 부른다.

단일 책임 원칙

Single Responsiblity Principle; SRP
  • 소프트웨어의 컴포넌트는 단 하나의 책임만을 가져야 한다.

예시

AS-IS
  • 복합기 Class
    • copy()
    • scan()
TO-BE
  • 복사기 Class { copy() }
  • 스캐너 Class { scan() }

개방 폐쇄 원칙

Open Close Principles; OCP
  • 확장에 대해선 열려 있어야 하고 수정에 대해선 닫겨 있어야 한다.
  • 기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 해야 한다.

예시

  • Class Car { drive() }
  • 확장은 허용(O): Class SUV() extends Car
    • override drive();
    • new method stop();
  • 변경엔 폐쇄(X): Class Plane extends Car
    • change drive() to fly();

리츠코프 치환 원칙

Liskov Substitution Principle; LSP
  • 자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.

예시

  • Class SUV extends Class CAR { run() }
  • SUV suv = new SUV();
  • CAR car = (CAR)suv;
  • car.run();

인터페이스 분리의 원칙

Interface Segregation Principle; ISP
  • 자신이 사용하지 않는 메서드는 구현하지 않도록 해야 한다.
    • 이런 경우 인터페이스는 쪼개져야 한다.
  • 하나의 일반적인 인터페이스 보단 여러 개의 구체적인 인터페이스가 낫다.

예시

AS-IS
  • Interface 이동체
    • drive();
    • fly();
    • sail();
    • stop();
TO-BE
  • Interface 자동차 { drive(); stop(); }
  • Interface 비행기 { fly(); stop(); }
  • Interface 배 { sail(); stop(); }

의존관계 역전 원칙

Dependency Inversion Principle; DIP
  • 의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다.
  • 고차원의 모듈은 저차원의 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존 해야 한다.
  • DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미

예시

아래와 같이 하면 Car 클래스는 '겨울 타이어'라는 하위 클래스에 의존성을 가지게 된다. (의존성 역전)
  • Class Car {
    • WinterTire wt = new WinterTire();
    • setTireModel(String model) {
      • wt.model = model;
    • }
  • }
아래와 같이 하면 타이어에 대한 의존성이 줄어든다.
  • Class Car {
    • Tire wt = null;
    • setTire(Tire t) {
      • wt = t;
    • }
  • }