객체지향 설계: 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() } | |||
===개방 폐쇄 원칙=== | |||
;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(); | |||
===리츠코프 치환 원칙=== | |||
;Liskov Substitution Principle; LSP | ;Liskov Substitution Principle; LSP | ||
=== [[인터페이스 분리의 원칙]] === | *자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다. | ||
====예시==== | |||
*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(); } | |||
===[[의존관계 역전 원칙]]=== | |||
;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;
- }
- }