본문 바로가기
정보관리기술사&컴퓨터응용시스템기술사/SW공학과 프로젝트관리

[객체지향 프로그래밍(OOP)], 재사용성과 객체 표현 기법

by 별프로 2021. 1. 9.
반응형

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 내부 정보를 은닉하고, 접근 제한의 단계를 두어 보안적인 구현 가능
캡슐화된 정보를 외부로부터 은닉, 객체의 메소드(Method)를 통해서만 정보에 대한 접근 가능

- 클래스 내부에서 사용되는 변수(필드) 들을 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 측면에서 접근

 

반응형

댓글