I. 재사용성과 객체 표현 기법, 객체지향의 개요
가. 객체지향 프로그래밍(OOP, Object-Oriented Programming)의 정의
- 실세계의 개체(Entity)를 속성(Attribute)과 메소드(Method)가 결합된 형태의 객체(Object)로 표현하는 개념으로 실세계의 문제 영역에 대한 표현을 소프트웨어 해결영역으로 매핑
- 구현대상을 하나의 객체로 보고, 그 객체를 객체와 객체들 간의 관계로 모델링하는 방법
나. 객체지향 프로그래밍의 등장배경
개발측면 |
- 소프트웨어 위기 해결을 위한 대안 - 생산성 저하에 따른 재사용성, 확장성 필요 |
사용측면 |
- 기능성, 단순성, 사용자편의성 요구 증대 |
다. 객체지향 프로그래밍의 특징
구분 |
설명 |
모형의 적합성 |
- 객체 중심의 모형은 인간의 사고방식과 유사 |
재사용성 |
- 개방성과 폐쇄성을 모두 갖춘 객체가 재사용 단위로 활용 |
Time-to-Market |
- 클래스의 재사용과 확장성으로 빠른 개발 가능 |
II. 객체지향 프로그래밍의 구성도 및 구성요소
가. 객체지향 프로그래밍의 구성도
![]() |
- Class 간의 Relation, Object 간 상호작용은 메시지를 통해 이루어짐
나. 객체지향의 구성요소
구성요소 |
설 명 |
클래스 (Class) |
- 객체의 타입을 정의하는 템플릿 - 같은 부류(개념, 문제해결 등)에 속하는 속성(Attribute)과 행위(Method)를 정의 - 재사용 가능하며, 외부 클래스와 독립적으로 설계 |
객체 (Object) |
- 클래스를 실제 사용하기 위해 생성한 인스턴스 (실제 메모리상에 할당) - 자신의 고유 속성(Attribute)를 갖고 있으며, 클래스에 정의된 행위(Method) 수행 |
속성 (Attribute) |
- 클래스에 속한 객체들이 갖고 있는 데이터 값을 단위 별 정의 - 성질, 분류, 분류, 식별, 수량, 상태 등 |
메소드 (Method) |
- 클래스로부터 생성된 객체를 사용하는 방법 - 메소드를 통해 객체의 속성을 조작 |
메시지 (Message) |
- 객체 간 상호작용하기 위한 방법으로, 객체에 특정 행위를 요청하는 신호 - 객체명 / 메소드명 / 매개변수로 구성 |
다. 클래스, 객체, 인스턴스
항목 |
클래스 |
객 체 |
인스턴스 |
개념 |
객체를 만들기 위한 설계도 |
S/W 세계의 구현 대상 |
S/W 세계에서 구현된 구체적 실체 |
특징 |
연관된 변수 및 메소드 집합 |
- 인스턴스를 대표하는 포괄적 의미 - 클래스의 인스턴스라 부름 |
- 인스턴스는 객체에 포함 - 실체화된 인스턴스는 메모리에 할당 |
II. 객체지향의 특징(기법)의 개요
가. 객체지향 기법의 구성도
나. 객체지향 기법의 구성요소별 요약
III. 객체지향 프로그래밍의 특성 (캡추다정상)
특 성 |
설 명 |
|
캡슐화 (Encapsulation) |
개 념 |
- 관련 있는 속성(Attribute)과 메소드(Method)를 하나로 묶어 객체로 구성 - 내부정보 은닉, 추상화 용이, 유지보수 용이 - 객체 독립성 보장, 사용성 및 재사용성 증가 등 |
개념도 |
![]() |
|
추상화 (Abstraction) |
개 념 |
- 복잡한 현실세계를 객체 중심의 안정된 모델로 표현 - 하위 클래스로부터 공통의 성질을 추출해 상위 클래스로 구성 - 기능 추상화(메소드), 데이터 추상화(속성), 제어 추상화(연산) |
개념도 |
![]() |
|
다형성 (Polymorphism) |
개 념 |
- 동일한 이름의 메소드(Method)를 여러 형태의 다른 동작방식으로 재정의 가능 - 오버로딩(Overloading) : 매개변수의 수/타입을 달리하여 동작방식 재정의 - 오버라이딩(Overriding) : 상위 클래스의 메소드를 상속받아 동작방식 재정의 |
개념도 |
![]() |
|
정보은닉 (Information Hiding) |
개 념 |
- 캡슐화된 정보를 외부로부터 은닉 - 객체의 메소드(Method)를 통해서만 정보에 대한 접근 가능 |
개념도 |
![]() |
|
상 속 (Inheritance) |
개 념 |
- 클래스 간 관계를 계층화 - 상위 클래스의 속성과 메소드를 하위 클래스가 상속받아 사용 - 상위 클래스는 추상적(일반화), 하위 클래스는 구체적(특수화) |
개념도 |
![]() |
IV. 객체지향 설계의 특징 상세설명
가. 캡슐화(Encapsulation)
구분 |
내용 |
개념 |
- 관련 있는 속성(Attribute)과 메소드(Method)를 하나로 묶어서 객체로 구성하여 처리하는 객체지향의 특성 - 사용자에게는 객체의 기능과 사용법만 제공하고 내부처리과정은 은닉 |
개념도 |
![]() ![]() ![]() |
역할 |
- 객체의 내부 구조와 실체의 분리 객체간 인터페이스를 이용, 종속성 최소화 -> 객체 내 구조변화로 인한 영향 최소화, 객체간 독립성보장, 유지보수 용이 - 데이터보호, 추상화 용이, 사용성 증가, 변경용이, 재사용성 증가 - 정보은닉으로 내부자료 일관성 유지 |
구현 |
- 클래스를 선언하고, 그 클래스를 구성하는 객체에 대해서, “public” 선언 시 외부에서 사용 가능, “private” 선언 시 외부에서 접근 불가 |
예제 코드 |
![]() |
나. 추상화(Abstraction)
구분 |
내용 |
개념 |
- 현실세계의 사실(물체 등)을 객체로 공통적인 속성과 기능을 묶어 이름을 부여하는 기법 - 공통 성질을 추출하여 슈퍼클래스로 설정 - 몇 가지 공통 속성을 가지지만 서로 다른 속성도 가지는 객체를 집단화하는 과정 |
개념도 |
![]() |
역할 |
- 상호작용 최소화 (독립성), 범용성 모듈 설계(재사용성) |
구현 |
- 복잡한 것을 단순화/간결화, 공통 데이터/기능 도출 - 클래스를 이용 데이터와 프로세스를 함께 추상화 - 명사에 데이터 추상화(type부여) - 동사에 기능의 추상화(method부여) |
유형 |
![]() |
예제 코드 |
abstract class GraphicObject { //Super Class int x, y; void moveTo(int newX, int newY) { … } abstract void draw(); } class Circle extends GraphicObject { void draw() { … } } class Rectangle extends GraphicObject { void draw() { … } } -공통성질(draw)을 추출하여 추상화 |
다. 다형성(Polymorphism)
- 동일한 이름의 메소드(Method)를 여러 형태의 다른 동작방식으로 재정의 가능
→ 현재 코드를 변경하지 않고 새로운 기능 추가 용이
- 2가지 유형
1) 오버로딩(Overloading) : 매개변수의 수/타입을 달리하여 동작방식 재정의
2) 오버라이딩(Overriding) : 상위 클래스의 메소드를 상속받아 동작방식 재정의
구분 |
Overloading |
Overriding |
개념 |
- 메소드 중복 정의 (수평적) - 하나의 클래스 내에서 비슷한 일을 하는 메소드를 같은 이름의 메소드로 여러 개 정의하여 사용하는 기법 . 인자의 타입 및 개수가 다른 경우 |
- 메소드 재정의 (수직적) - 상속관계에 있는 두 클래스 중 하위클래스에서 상위클래스의 메소드를 재정의하여 사용하는 기법 |
개념도 |
![]() |
![]() |
목적 |
Improved Usability |
Redefine / Change |
특징 |
- 인자 타입, 개수가 다르므로, 메소드 호출은 컴파일 타임에 결정됨. (Static or compile-time polymorphism) |
- 메서드 호출은 런타임 시에 결정됨 (Dynamic polymorphism) |
예제 코드 |
![]() |
![]() |
- Java에서는 가상(virtual)을 따로 선언하지 않아도 되나 C++에서는 다형성을 구현하기 위해서는 상위 클래스에 멤버 메소드를 가상(virtual)으로 선언해야 함.
라. 정보은닉(Information Hiding)
구분 |
내용 |
개념 |
- 캡슐화 방법으로 class 내부 정보를 은닉하고, 접근 제한의 단계를 두어 보안적인 구현 가능 - 클래스 내부에서 사용되는 변수(필드) 들을 private 이나 protected 등으로 선언해 줌으로, 자기 클래스, 혹은 자식 클래스 외에는 직접적으로 제어를 불가능하게 해주는 성질 - 복잡하거나 변경가능 한 부분을 캡슐 내부에 감추고 외부에는 추상화되고 변경가능성이 낮은 인터페이스만을 제공하는 객체지향의 원리 |
개념도 |
![]() ![]() |
역할 |
- 내부 자료구조 변경용이, 독립성 및 확장성 증가 - 제어접근자 사용 이유 1) 복잡성 제거 : 외부에는 불필요한, 내붝으로만 사용되는 부분을 감춰서 복잡성 제거 2) Data 보호 : 외부로부터 데이터를 보호하기 위함 |
제어 접근자 |
![]() |
예제 코드 |
![]() |
마. 상속(Inheritance)
구분 |
내용 |
|
개념 |
- 미리 만들어 둔 클래스를 다시 이용하는 방법 (클래스에서만 통용되는 개념) . 클래스 간 관계를 계층화 : 부모와 자식 클래스 간의 관계가 수퍼클래스와 서브클래스로 유지 . 상위 클래스의 속성과 메소드를 하위 클래스가 상속받아 사용 . 상위 클래스는 추상적(일반화), 하위 클래스는 구체적(특수화) 성질을 가짐 |
|
개념도 |
![]() |
|
역할 |
클래스 체계화, 기존 클래스로부터 확장 용이, 유지보수용이, 재사용성 증대, 추상화 가능 |
|
특징 |
- 하위클래스가 상위클래스를 상속받았을 때, 하위 클래스는 상위 클래스의 모든 권한 소유 - 상속을 받는 순간 현재의 클래스는 곧 상위 클래스에서 출발 |
|
종류 |
단일 |
부모와 자식 클래스 간의 관계가 슈퍼클래스와 서브클래스로 유지 |
다중 |
하나의 클래스가 두개 이상의 클래스로부터 상속받음 |
|
반복 |
같은 조부모 클래스로부터 상속받은 두 부모 클래스로부터 상속받는 것 |
|
예제 코드 |
class Animal{ public void move(){… } } class Dog extends Animal{ public void bark(){… } } - Dog는 Animal을 상속받았기 때문에 move 와 bark 메소드 호출 가능 ![]() - C++에서는 콜론(:)을 상속의 키워드로 사용하며, 자바에서는 extends라는 키워드를 사용 |
※ 추상클래스와 인터페이스 비교
항목 |
추상클래스 |
인터페이스 |
공통점 |
- 객체생성 불가, 선언부만 있는 메소드는 이를 상속하는 하위 클래스에서 반드시 구현 필수 |
|
차이점 |
- 일반 클래스에 추상메소드가 추가된 형태 |
- 모든 메소드가 추상 메소드 |
- 속성을 가질 수 있음 |
- 일부 속성(상속)만 가질 수 있음 |
|
- 단일상속 가능 |
- 다중구현 가능 |
IIV. 객체지향 프로그래밍의 설계원칙
구분 |
설명 |
단일 책임의 원칙 (SRP) |
- Single Responsibility Principle - 하나의 객체는 하나의 책임만을 수행하는데 집중 - 높은 응집도(High Cohesion), 느슨한 결합도(Loose Coupling) |
개방 폐쇄의 원칙 (OCP) |
- Open-Closed Principle - 확장에 열림(Open) : 객체의 수직관계(Is-a)에서는 열림 - 변경에 닫힘(Closed) : 객체의 수평관계(Has-a)에서는 유연 |
리스코프 치환의 원칙 (LSP) |
- Liskov Substitution Principle - 상위 클래스 타입이 사용되는 곳에 하위 클래스 타입으로 대체 가능 - 메소드의 매개변수를 추상 클래스 또는 인터페이스로 사용 |
인터페이스 분리의 원칙 (ISP) |
- Interface Segregation Principle - 하나의 일반적인 인터페이스 보다, 여러 개의 구체적인 인터페이스가 좋음 - 외부에서 꼭 필요한 메소드들만 이용할 수 있는 환경 마련 |
의존관계 역전의 원칙 (DIP) |
- Dependency Inversion Principle - 파생 클래스 대신 추상 클래스에 대한 의존관계를 생성 - 파생 클래스 또는 추상 클래스는 오직 추상 클래스만 참조 |
[참고] 오버라이딩과 오버로딩 비교
구분 |
오버라이딩(Overriding) |
오버로딩(Overloading) |
메소드 이름 |
같아야 함 |
같아야 함 |
파라미터 개수 자료형 |
같아야 함 |
달라야 함 |
같을 경우 자료형이 달라야 함 |
||
리턴 타입 |
같아야 함 |
상관없음 |
기타 |
상위 클래스에 메소드 존재 |
상위 클래스에 같은 이름의 메소드가 없어야 함 |
[참고] 재사용성 향상을 위한 객체지향 프로그래밍 기법
요약 |
내용 |
Refactoring 사용 |
코드의 가독성 및 올바른 객체지향 설계 원칙을 위한 코드수정 기법 관계 구현, 클래스 및 메소드 재사용성 향상, 구현의존도를 낮추어 상속 재검토 |
Design pattern 사용 |
상속은 수직적 재사용 가능, 상황적으로 다른 접근방식 필요 동일한 비즈니스로직 등은 Design pattern 을 사용하여 재사용성 향상 |
CBD, Product Line, SOA 사용 |
Component 사용 및 Product Line 을 이용한 Core asset 의 재사용 고려 재사용 단위를 service Level 까지 고려한 architecture 측면에서 접근 |
'정보관리기술사&컴퓨터응용시스템기술사 > SW공학과 프로젝트관리' 카테고리의 다른 글
[린(Lean) 프로세스], 낭비요소 제거를 통한 프로세스 향상 (0) | 2021.01.12 |
---|---|
[CI/CD 지속적통합/지속적배포], Devops 의 핵심 구성요소 (0) | 2021.01.10 |
[객체지향 설계 5원칙] 유지보수와 확장에 용이한 시스템을 위한 원칙 (0) | 2021.01.06 |
[Agile 방법론] 작동하는 SW 중심 (0) | 2021.01.06 |
나선형 모델(Spiral Model), 위험 최소화를 위한 진화적 프로토타이핑 (0) | 2020.12.30 |
댓글