첫번째, 책 고급 프로그래밍 요점 및 정의 정리
해당 포스트는 고급 객체지향 프로그램의 내용을 요약, 재구성한 포스트입니다.
'고급 객체지향 프로그래밍' 이 책 상당히 재밌고, 객체지향에 대해 입문용으로 좋은 책이라 추천드립니다.
내용 중 모호한 부분이나 틀린 부분이 있다면 메일 또는 댓글을 남겨주세요! 같이 고민해 보아요!
객체의 정의
실세계 관점의 정의
객체는 개발자가 인위적으로 만들어 내는 것이 아니라, 개발하려는 시스템의 문제 영역에 실제로 존재하는
어떤 사물이나 개념을 나타낸다.
따라서 개발자의 시각이 아니라 그 문제 영역의 업무 프로세스와 요구사항을 잘 이해하고 있는 도메인 전문가의 시각에서 객체를 식별해야 한다.
Person : 인사관리 시스템에 사용되며, 조직의 직원을 나타내는 객체
Book : 서점의 도서판매 시스템에 적용되며, 판매할 책을 나타내는 객체
예제에서 보여준대로, 실제로 존재하는 사물, 개체 또는 개념이 객체가 된다.
공학적인 기술보다는 도메인 지식이 요구된다.
프로그램 구조 관점의 정의
각 객체는 관령성이 높은 속성들과 오퍼레이션으로 구성된다.
프로그램 = 객체 + 객체
객체 = 속성 + 오퍼레이션
객체의 조건
- 상태 유지
객체는 현재 상태정보를 유지하여야 하며, 이를 위해서는 속성을 가져야 한다.
프로그래밍 언어에서는 변수로 구현된다.
객체는 하나 이상의 속성을 가지며, 오퍼레이션만 정의되어 있다면, 객체로 볼수 없다.
-
기능성 객체는 하나 이상의 오퍼레이션을 가지며, 속성만 가질 경우 C언어의 구조체(Struct)에 불과하다.
객체의 특정 기능성을 객체 내부의 오퍼레이션들을 통해 제공한다.
객체가 제공하는 기능성은 객체의 프로토콜, 객체의 책임 또는 서비스라고도 표현한다.
대부분의 객체 속성들이 외부 객체로부터의 직접적인 접근을 허용하지 않고, 객체 내부의 오퍼레이션들의 의해
처리되며, 이는 캡슐화의 원칙이다. -
고유 식별자 ex) 동일 모델 여러 펜이 있어도 각 일련번호를 통해 식별(구분)할 수 있다.
캡슐화
객체의 캡슐화 원칙
객체지향 패러다임의 캡슐화는 연관된 속성들과 연관된 오퍼레이션들을 하나의 단위인 객체로 묶어서 정의하는 원칙이다.
객체 안의 관련성 종류
1.속성들 간의 관련성
-
상태유지 완전성 관점의 관련성 객체의 상태를 유지하기 위한 정보 저장소를 구성하는 관계를 가진다.
예를 들어 원이란 도형의 객체 상태를 유지하기 위해선 x,y 중심점 좌표, radius라는 반지름, color라는 선 색상이 필요하다.
이 객체는 원이라는 상태 유지를 위해 하나의 완전한 집합을 구성하는 역할과 관계를 가진다. -
속성들 간 의존성 관점의 관련성 한 객체안에 속한 속성끼리 서로 관계가 있는 경우이다.
위의 예로, x나 y 둘중 하나만으로 원의 중앙점을 나타낼 수 없다.
서로 의존하고 관련이 있으므로 같은 객체에 포함되어야 한다.
2.오퍼레이션들 간의 관련성
- 기능 유지 완전성 관점의 관련성
객체 내 정의된 모든 오퍼레이션들의 집합은 그 객체의 전체 기능성을 나타내어야 한다.
전체 기능성 중에서 어떤 부분의 기능을 수행하는 오퍼레이션이 없다면 이는 객체라 볼 수 없다.
예를 들어, 객체내 오퍼레이션들이 원의 생성-삭제-이동-크기 확대-크기 축소-색상 변경으로 이루어져 있으면 이 각각 오퍼레이션들이
모두 식별되고 객체에 포함되어 있어야 한다. - 기능간 의존성 관점의 관련성 원 객체의 경우 생성-삭제의 오퍼레이션은 원 객체의 수명을 다루는 기능 측면과 관련이 있고, 원 확대-축소 오퍼레이션은 원의 크기 조절과 관련 있다.
3.속성과 오퍼레이션 간의 관련성
- 속성별 처리해야 할 오퍼레이션의 관점 어떤 속성이 선언되었으나, 이를 처리하는 오퍼레이션이 없다면 불필요한 속성을 선언하였거나 이를 처리하는 오퍼레이션을 누락한 것이다.
- 오퍼레이션이 사용하는 속성 및 데이터 관점 동일한 객체 내에 있는 속성들만 처리하도록 설계해야 객체의 모듈성이 높아진다. 오퍼레이션 실행에 필요한 데이터는 매개변수, 사용자 입력, 데이터베이스, 네트워크를 통해 전달 받을 수 있다.
객체 안의 항목들 간의 세 가지 관련성을 이해하면, 객체를 식별하고 객체의 속성들과 오퍼레이션들을 효과적으로 식별할 수 있다.
캡슐화의 장점
-
프로그램의 추상화 수단 제공 프로그램 안에 어떤 속성들과 오퍼레이션들이 있는지 구체적으로 이해할 필요 없이, 캡슐화된 객체의 단위로
목표 프로그램을 분석 및 설계 할 수 있게 한다.
이는 전산학의 추상 데이터 타입의 장점과 동일하다.
대형 프로그램일 경우 많은 숫자의 속성들과 오퍼레이션들을 이해하고 도출하는 것은 어렵다.
이때, 객체 단위로 요구사항을 분석하고, 이후 각 속성 및 오퍼레이션을 정의하면 보다 효율적으로 목표 시스템을 개발할 수 있다. -
높은 재사용성 제공 한 객체내에 속성 및 오퍼레이션이 모두 캡슐화 형태로 정의되어 있으므로, 객체의 모듈성과 응집도가 높아진다.
이를 통해 재사용성이 높아지며, 이는 절차적 프로그램의 근본적인 문제를 해결하는 장치이다. -
유지보수 효율성 향상 수정되는 특정 객체만 수정하면 된다.
그에 반해 절차적 프로그램은 스파게티 코드 구조로 인해 유지보수의 노력과 비용이 높다.
정보 은닉
목표
- 객체의 정보 은닉 원칙을 이해하고, 이를 지원하는 가시성 장치에 대해 살펴본다.
- 정보 은닉을 이용하여 객체의 무결성을 보장할 수 있는 설계 원칙들을 학습한다.
- 캡슐화와 정보 은닉은 별도의 원칙인데, 객체 설계에 두 가지 원칙이 적용되어야 하는 이유에 대해 알아본다.
정보 은닉의 개념
객체가 가지고 있는 속성과 오퍼레이션의 일부를 감추어, 객체의 외부에서는 접근이 불가능하게 하는 원칙이다.
캡슐화는 관련된 속성과 오퍼레이션을 한 객체안에 그룹화하는 원칙이다. 그러나 캡슐화 원칙만으로는
외부에 노출되지 않는 것을 의미하진 않는다.
따라서 좋은 객체를 설계하기 위해서는 캡슐화와 정보 은닉 두가지 원칙이 모두 적용되어야 한다.
가시성 명시자
본 챕터에서는 정보 은닉과 관련이 있는 public, private, package를 살펴보며, protected는 상속 챕터에서 살펴봅니다.
- public
- 객체 외부에서 직접적인 접근이 가능하다.
- 절차적 프로그래밍 언어의 전역 변수가 가지는 문제를 가지게 된다.
- 외부 접근이 필요한 오퍼레이션에 적용된다.(객체 인터페이스)
- private
- 객체 외부에서 직접적인 접근이 불가능하며, 동일 객체 내부에서만 접근 및 처리가 가능하다.
- 주로 오퍼레이션 보다는 속성에 적용된다.
- package
- 같은 패키지 안에 있는 모든 객체들의 접근을 허용하고 다른 패키지에 있는 객체들의 접근은 허용하지 않는다.
- public과 private 가시성의 중간 형태에 해당된다.
객체 인터페이스
- 외부에서 접근할 수 있는 정보나 실행시킬 수 있는 오퍼레이션들의 집합이다.
- public으로 선언된 속성들과 오퍼레이션들이 그 객체의 외부 인터페이스를 구성한다.
정보 은닉을 통한 무결성 보장
- 원칙
- 유효성이 지켜져야 하는 속성을 private으로 선언한다.
- 이 속성의 값을 변경시키는 오퍼레이션을 public으로 선언한다.
- 모든 public 오퍼레이션 안에서 if 조건문을 이용하여 입력 매개변수 값의 유효성을 확인한 후 해당 속성의 값을 변경하도록 한다. 만일 입력매개변수의 값이 유효하지 않을 경우, 해당 속성의 값을 변경하지 않는다.
- 정보 은닉을 이용한 무결성 보장 예제 코드
Class Circle {
int xPosition, yPosition;
int radius;
colorType color;
public:
boolean move(int x, y);
boolean resize(int x);
colorType getColor();
void setColor(colorType c);
}
boolean move(int x, int y) {
if (...) { // x, y 유효성 확인
xPosition += x; // 속성 변경
yPosition += y;
return true;
} else {
return false;
}
}
캡슐화와 정보 은닉의 관계
- 캡슐화는 관련된 구성요소를 한 객채내에 묶는 원칙이며, 정보 은닉은 객체 안의 속성 값을 외부로의 접근으로부터 감추고 이를 처리하는 오퍼레이션(객체 인터페이스)을 공개한 후 오퍼레이션을 통해 숨겨진 속성을 접근하는 원칙이다.
- 이 두개의 원칙은 별개의 원칙이다.
- 캡슐화 원칙이 잘 지켜져도 정보 은닉의 원칙이 지켜지지 않으면 잘못된 객체 설계이다.
- 모듈성, 재사용성, 유지보수성, 무결성을 제공하는 좋은 객체를 설계하기 위해서는 두 원칙이 모두 적용되어야 한다.
정보 은닉의 장점 및 단점
- 장점
-
객체 무결성 보장 public 오퍼레이션에서 입력 매개변수의 유효성 검사를 통해 객체 무결성을 보장한다.
-
높은 재사용성 제공 객체를 재사용할 때 객체의 내부정보를 알 필요 없이 노출된 인터페이스 정보만을 통해 원하는 기능을 실행한다.
-
유지보수 효율성 향상
- 어떤 속성이 private로 정보 은닉이 되었다면 그 속성의 이름이나 타입을 변경할 경우, 어떤 외부객체에도 영향을 끼치지 않는다.
- 이 수정된 속성을 사용하는 오퍼레이션들만 수정된 이름이나 데이터타입을 사용하도록 변경하면 된다.
-
- 단점 간접 접근에 따른 실행 효율성 저하 : 외부에서 객체 속성에 직접 접근하는 런타임에 비해 오퍼레이션을 통한 간접 접근이 더 긴 런타임을 갖는다.