6. 객체지향 설계 - 15. 객체지향 설계
15. 객체지향 설계
1. 객체지향 분석
2. 객체지향 구성 요소
3. 객체지향의 특성
4. 객체지향 관계성
SW 설계 기법
전통적인 설계 방법
1. 구조적 프로그래밍 (Structured Programming)
- 프로그램의 이해가 쉽고 디버깅 작업이 쉽다.
- 한 개의 입구(입력)와 한 개의 출구(출력) 구조를 갖도록 한다.
- GOTO(분기) 문은 사용하지 않는다.
구조적 프로그래밍의 기본 구조
순차(Sequence) 구조, 선택(Selection) 구조, 반복(Iteration) 구조
2. 절차적 프로그래밍 (Procedural Programming)
- 순서대로 일련의 명령어를 나열하여 프로그래밍한다.
- Function 기반의 프로그래밍이며, 프로시저로써 Function 외에도 Subroutine이 문법적으로 구현되어 있다.
함수(Function) 문제점
- 절차형 언어의 경우 규모가 커지면 커질수록 함수가 기하급수적으로 늘어난다. 유지보수가 어려워짐
- 함수가 타 프로그램과 문제를 일으킬 수 있는 문제점을 가지고 있다.
- 프로그램과 별개로 함수는 데이터 취급이 되므로 완전하지 않고 현실 세계 문제를 프로그램으로 표현하는데 제약이 있다.
1. 객체지향 (Object Oriented) 분석 ☆
현실 세계의 대상체인 개체(Entity)를 속성(Attribute)과 메소드(Method)로 결합하여 객체(Object)로 표현(모델링)한다.
- 소프트웨어 개발 대상을 기능이 아닌 개체를 대상으로 하며 개체 간의 상호 관계를 모델링하는 방식이다.
- 구조적 소프트웨어 위기를 해결하기 위한 생산성, 재사용성, 확장성, 사용 편의성, 유지보수성 요구로 인하여 등장하였다.
- 현실 세계를 객체라는 모형으로 향상화 하므로 사용자와 개발자의 상호 이해도가 높다.
예) 사람의 눈은 '본다' 기능이 있다.
오브젝트 : 눈
속성 : 망막, 시신경, 홍채 등 눈을 구성하는 항목들
메소드 : 속성이 갖는 행위 '본다'
예) 오브젝트 : 자동차
속성 : 바퀴, 엔진, 핸들, 등 자동차를 구성하는 특성, 항목들
메소드 : 바퀴는 구른다, 엔진은 돈다, 핸들은 돌린다. 등 각각의 속성들이 갖는 행위들
객체지향 프로그래밍 (Object Oriented Programming)
컴퓨터 소프트웨어를 구조적인 코드 단위로 보는 것이 아니라 Object 단위로 구분하고 Object 간의 모음으로 설계하는 것이다.
- 처리 요구를 받은 객체가 자기 자신 안에 있는 내용을 가지고 처리하는 방식이다.
프로그램이 단순화되고 생산성, 신뢰성이 높아져 대규모 개발에 많이 사용된다.
한번 만들어 놓으면 조립식으로 갖다 넣을 수 있으므로
신호 방식
소프트웨어 내의 Object는 서로 Message를 주고받는다.
절차지향형 프로그래밍에서는
1. 멍멍이에 대한 행위를 모두 다 함수로 만든다. (네발로 걷는다, 멍멍 짖는다, 꼬리를 흔든다)
2. 필요할 때마다 똑같이 코드를 복사해서 똑같이 넣어줘야 한다.
객체지향 프로그래밍에서는
1. 상위에 공통속성을 선언한다.
2. 하위 모듈에서 참고해서 사용하면 된다.
Class 멍멍이의 공통 특성
- 다리가 4개
- 멍멍 짖는다
- 꼬리를 흔든다.
- 킁킁거린다.
- 영역 표시를 위해 오줌을 싼다.
Object 우리 집 멍멍이
- 다리가 4개
- 멍멍 짖는다
- 꼬리를 흔든다.
- 킁킁거린다
- 영역 표시를 위해 오줌을 싼다.
- 날 보면 달려온다.
- 밥을 많이 먹는다.
공통특성은 우리 집 멍멍이가 갖고 있는 특성들인데 다시 코딩할 필요가 있겠는가.
그럴 필요가 없다. 그외의 속성들만 바꿔 선언해주면 된다.. (날 보면 달려온다, 밥을 많이 먹는다.)
2. 객체지향 구성 요소 ☆
1. Class
- 유사한 객체를 정의한 집합으로 속성 + 행위를 정의한 것으로 일반적인 Type을 의미한다.
- 기본적인 사용자 정의 데이터형이며, 데이터를 추상화하는 단위이다.
- 구조적 기법에서의 단위 테스트(Unit Test)와 같은 개념이다.
상위 클래스
부모 클래스, Super Class
하위 클래스
자식 클래스, Sub Class
2. Object
- 데이터와 함수를 묶어 캡슐화하는 대상이 된다.
- Class에 속한 Instance를 Object라고 한다.
- 하나의 소프트웨어 모듈로서 목적, 대상을 표현한다.
- 같은 클래스에 속한 각각의 객체를 Instance라고 한다.
Attribute
Object가 가지고 있는 데이터 값
Method
Object의 행위인 함수
캡슐화 예) 감기약
감기를 낫게 할 다양한 약재들이 캡슐 안에 모여있다.
열을 낮추는 약재, 목의 붓기를 내려주는 약재, 등등 얘네들을
3. Message
Object 간에 서로 주고받는 통신을 의미한다.
3. 객체지향의 5가지 특징 ☆
1. 캡슐화 (Encapsulation)
- 서로 관련성이 높은 데이터(속성)와 그와 관련된 기능(메서드, 함수)을 묶는 기법이다.
- 결합도가 낮아져 소프트웨어 개발에 있어 재사용성이 높아진다.
- 정보은닉을 통하여 타 객체와 메시지 교환 시 인터페이스가 단순해진다.
(절차지향 때에는 각 함수를 다 연결해야 했으므로 복잡했다.)
- 변경 발생 시 오류의 파급 효과가 적다.
2. 정보은닉 (Information Hiding)
- 객체 내부의 속성과 메서드를 숨기고 공개된 인터페이스를 통해서만 메시지를 주고받을 수 있도록 하는 것을 의미한다.
- 예기치 못한 Side Effect를 줄이기 위해서 사용한다.
JAVA에서는 정보은닉을 표기할 때
private는 외부에서 클래스 내부 정보에 접근하지 못하도록 하는 '접근금지' 의미를 갖는다.
3. 추상화 (Abstraction)
- 시스템 내의 공통 성질을 추출한 뒤 추상 클래스를 설정하는 기법이다.
- 현실 세계를 컴퓨터 시스템에 자연스럽게 표현할 수 있다.
종류
기능 추상화, 제어 추상화, 자료 추상화
추상화는 일본식 한자이다.
1. 미국이 만든 객체지향을 일본 교수들이 가장 많이 공부했다.
2. 그리고 한국 교수들이 일제강점기 때 일본 가서 공부를 했다. 즉, 추상화는 일본식 한자이다.
3. 컴퓨터 쪽에서의 쓸데없는 일본식 한자어를 쫌 없애놓자라고 이야기했지만 꼰대들이 변경 안 시켜줬다.
4. 그렇기 때문에 요즘에는 아예 Abstraction으로 보는 게 맞다.
4. 상속성 (Inheritance)
- 상위 클래스의 모든 속성, 연산을 하위 클래스가 재정의 없이 물려받아 사용하는 것이다.
- 상위 클래스는 추상적 성질을, 자식 클래스는 구체적 성질을 가진다.
- 하위 클래스는 상속받은 속성과 연산에 새로운 속성과 연산을 추가하여 사용할 수 있다.
다중 상속
다수 상위 클래스에서 속성과 연산을 물려받는 것이다.
5. 다형성 (Polymorphism)
현재 코드를 변경하지 않고 새로운 클래스를 쉽게 추가할 수 있음.
상위에서 Dog Class를 선언을 했어, 예를 들면 다리, 걷는다 등 각각의 속성과 해당하는 Value 값들이 있는데,
이 Value 값들을 변경할 수 있다.
- 객체가 다양한 모양을 가지는 성질을 뜻한다.
- 오퍼레이션이나 속성의 이름이 하나 이상의 클래스에서 정의되고 각 클래스에서 다른 형태로 구현될 수 있는 개념이다.
- 속성이나 변수가 서로 다른 클래스에 속하는 객체를 지칭할 수 있는 성질이다.
(다리가 Dog Class에서는 개의 다리가 될 수 있지만, Cow Class에서는 소의 다리가 될 수 있다.)
- 오버로딩(같은 이름순서 재사용)과 오버라이딩(재정의)이 있다.
오버로딩은 활 하나에 다양한 화살을 사용할 수 있다.
오버라이딩은 활 하나에 기존에 있던 화살을 변경해서 사용할 수 있다.
오버로딩 VS 오버라이딩
구분 | 오버로딩 (Overloading) |
오버라이딩 (Overriding) |
메소드 이름 | 한 클래스 내에서 같다. | 상속 관계의 두 클래스 간 같다 |
매개 변수개수 / 매개 변수 타입 |
매개 변수 타입 또는 개수가 달라야 한다. | 반드시 같아야 한다. |
접근 제한 | 무관하다 | 범위는 같거나 커야한다. |
사용 | 같은 이름으로 메소드 중복 정의 | 자식 클래스에서 부모 클래스의 메소드 재정의 |
오버로딩 (Overloading) ☆
사전적 의미
과적, 과부하
한 클래스 내에서 같은 이름의 메서드를 사용하는 것이다.
- 같은 이름의 메소드를 여러 개 정의하면서 매개 변수의 유형과 개수가 달라지도록 하는 기술이다.
- 오버로딩은 한 클래스 내에서 일어나는 것이다.
오버라이딩 (Overriding)
사전적 의미
가장 우선되는, 최우선으로 되는, 다른 것보다 우선인 상속 관계의 두 클래스의 상위 클래스에서 정의한 메소드를 하위 클래스에서 변경(재정의)하는 것이다.
오바라이딩의 경우 하위 객체의 매개 변수 개수와 타입은 상위 객체와 같아야 한다.
오버라이딩은 상속관계에서 일어나는 것이다.
예) 상위 매개 변수 개수가 한 개이면 하위 매개 변수 개수도 한 개 여야 된다.
상위 매개 변수가 타입이 숫자이면, 하위 매개 변수 타입도 숫자여야된다.
예) 상위 Class에서 다리 4개라고 되어있는데, 가져와서
다리가 2개이다라고 변경할 수 있다. 즉, 속성을 변경하는 것이 아닌 메소드를 변경할 수 있는 것이다.
예) 상위 Class에서 다리 걷는다이면, 가져와서
뛴다라고 바꿀 수 있다.
JAVA 언어에서는 Static 메소드의 오버라이딩을 허용하지 않는다.
4. 객체지향 기법에서의 관계성 ☆
is member of ; ~의 멤버
연관성(Association), 참조 및 이용 관계
예) 1학년 1반 애냐?
놉 나는 1학년 2반이야 우리 달리기 시합할 때 우리가 이길 거임
우리 반만의 끈끈한 우정 연관성이 있다.
is part of
집단화(Aggregation), 객체 간의 구조적인 집약 관계
예) 남초등학교, 북초등학교
멤버보다 더 큰 개념
is a
일반화(Generalization), 특수화(Specialzation), 클래스 간의 개념적인 포함 관계
객체지향 설계 원칙(SOLID) ☆
1. 단일 책임의 원칙 (SRP : Single Responsibility Principle)
모든 클래스는 단일 목적으로 생성되고, 하나의 책임만 가져야 한다.
2. 개방 - 폐쇄의 원칙 (OCP : Open Closed Principle)
소프트웨어 구성 요소는 확장에 대해서는 개방되어야 하나 수정에 대해서는 폐쇄적이어야 한다.
3. 리스코프치환 원칙 (LSP : Liskov Substituion Principle)
부모 클래스가 들어갈 자리에 자식 클래스를 대체하여도 계획대로 작동해야 한다.
(동일 속성으로 같기 때문에 그렇게 작동해야 한다.)
4. 인터페이스 분리 원칙 (ISP : Interface Segregation Principle)
- 클라이언트는 자신이 사용하지 않는 메소드와 의존 관계를 맺으면 안 된다.
- 클라이언트가 사용하지 않는 인터페이스 때문에 영향을 받아서는 안 된다.
5. 의존 역전 원칙 (DIP : Dependency Inversion Principle)
의존 관계를 맺으면 변하기 쉽고 변화 빈도가 높은 것보다 변하기 어렵고 변화 빈도가 낮은 것에 의존한다.
객체지향 개발 방법론 ☆
종류 1. OMT : Object Modeling Technology (Rumbaugh)
객체지향 분석, 시스템 설계, Object 설계/구현 4단계로 구성된다.
객체 모델링
객체도를 이용하여 시스템의 정적 구조를 표현한다.
동적 모델링
상태도를 이용하여 객체의 제어 흐름/상호 반응을 표현한다.
기능 모델링
자료 흐름도를 이용하여 데이터값의 변화 과정을 표현한다.
특징
1. 복잡한 대형 개발 프로젝트에 유용하다.
2. 기업 업무의 모델링에 있어 편리하고 사용자와 의사소통이 원활하다.
3. CASE와 연동이 충실하다.
종류 2. Coad와 Yourdon 방법
객체지향 분석 방법론에서 E-R 다이어그램을 사용하여 객체의 행위를 모델링한다.
특징
객체 식별, 구조 식별, 주체 정의, 속성 및 관계 정의, 서비스 정의 등의 과정으로 구성된다.
종류 3. Booch
설계 부분만 존재하며 문서화를 강조하여 다이어그램 기반으로 개발되었다.
특징
1. 분석과 설계가 분리되지 않는다.
2. 정적 모델과 동적 모델로 표현된다.
종류 4. OOSE : Object Oriented SW Engineering
Use Case의 한 접근 방법이다.
Use Case를 모든 모델의 근간으로 활용된다.
특징
1. 분석, 설계 및 구현으로 구성된다.
2. 기능적 요구사항 중심이다.
3. 시스템 변화에 유연하다.
클래스 설계
- 분석 단계 중 아직 확정되지 않은 클래스 내부 부분 중 구현에 필요한 중요한 사항을 결정하는 작업을 의미한다.
- 클래스의 서비스 인터페이스에 대한 정확한 정의, 메소드 내부의 로직 등 객체의 상태 변화와 오퍼레이션의 관계를 상세히 설계해야 하며, 클래스가 가지는 속성값에 따라 오퍼레이션 구현이 달라진다.
- 객체의 상태 변화 모델링은 필수이다.
클래스 인터페이스
- 관점에 따라 관심이 다르므로, 클래스 인터페이스가 중요하다.
- 관점에 다른 개발자들이 클래스 명세의 어떤 부분에 관심이 있는가?
클래스 구현
실제 설계로부터 클래스를 구현하려는 개발자
클래스 사용
구현된 클래스를 이용하여 다른 클래스를 개발하려는 개발자
클래스 확장
구현된 클래스를 확장하여 다른 클래스로 만들고자 하는 개발자
협약에 의한 설계(Design by Contract) 3가지 타입 ☆
1. 선행조건 (Precondition)
오퍼레이션이 호출되기 전에 참이 되어야 할 조건
2. 결과조건 (Postcondition)
오퍼레이션이 수행된 후 만족 해야 하는 조건
3. 불변조건(Invariant)
클래스 내부가 실행되는 동안 항상 만족하여야 하는 조건
문제 풀이
1. 객체지향 기법에서 객체가 메시지를 받아 실행해야 할 객체의 구체적인 연산을 정의한 것은?
Method
2. 객체지향 기법에서 클래스들 사이의 '부분-전체(Part-whole)' 관계 또는 '부분(is-a-part-of)'의 관계로 설명되는 연관성을 나타내는 용어는?
집단화
3. 구조적 프로그램 외 기본 구조가 아닌 것은?
① 순차 구조
② 반복 구조
③ 일괄 구조
④ 선택 구조
3번
4. 객체지향 기법의 캡슐화(Encapsulation)에 대한 설명으로 틀린 것은?
① 인터페이스가 단순화된다.
② 소프트웨어 재사용성이 높아진다.
③ 변경 발생 시 오류의 파급 효과가 적다.
④ 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려받는 것을 의미한다.
4번
상속성이다.
5. 객체에 대한 설명으로 틀린 것은?
① 객체는 상태, 동작, 고유 식별자를 가진 모든 것이라 할 수 있다.
② 객체는 공통 속성을 공유하는 클래스들의 집합이다.
③ 객체는 필요한 자료 구조와 이에 수행되는 함수들을 가진 하나의 독립된 존재이다.
④ 객체의 상태는 속성값에 의해 정의된다.
2번
클래스는 공통 속성을 공유하는 객체들의 집합이다.
6. 객체지향 기법에서 상위 클래스의 메소드와 속성을 하위 클래스가 물려받는 것을 의미하는 것은?
① Abstraction
② Polymorphism
③ Encapsulation
④ Inheritance
4번
1. 객체지향 기법에서 한 클래스 내에서 같은 이름의 메소드를 사용하는 것으로 같은 이름의 메소드를 여러 개 정의하면서 매개 변수의 유형과 개수가 달라지도록 하는 기술은?
오버로딩
2. 객체지향 분석 방법론 중 E-R 다이어그램을 사용하여 객체의 행위를 모델링하며, 객체 식별, 구조 식별, 주체 정의, 속성 및 관계 정의, 서비스 정의 등의 과정으로 구성되는 것은?
Coad와 Yourdon 방법
3. 다음 내용이 설명하는 객체지향 설계 원칙은?
- 클라이언트는 자신이 사용하지 않는 메소드와 의존 관계를 맺으면 안 된다.
- 클라이언트가 사용하지 않는 인터페이스 때문에 영향을 받아서는 안 된다.
① 인터페이스 분리 원칙
② 단일 책임 원칙
③ 개방 폐쇄의 원칙
④ 리스코프 교체의 원칙
1번
4. 객체지향 설계 원칙 중, 서브 타입(상속받은 하위 클래스)은 어디에서나 자신의 기반 타입(상위 클래스)으로 교체할 수 있어야 함을 의미하는 원칙은?
① ISP (Interface Segregation Principle)
② DIP (Dependency Inversion Principle)
③ LSP (Liskov Substitution Principle)
④ SRP (Single Responsibility Principle)
3번