-
고급 객체지향 프로그래밍(3)객체지향 2020. 1. 20. 21:33
3. 캡슐화
3.1. 객체의 캡슐화 원칙
객체지향 패러다임의 캡슐화는 연관된 속성들과 연관된 오퍼레이션들을 하나의 단위인 객체로 묶어서 정의하는 원칙이다. 객체가 특정 기능을 제공하는 데 필요한 속성 및 오퍼레이션을 한 캡슐에 모아서 정의해야 한다.
3.2. 객체안의 관련성 종류
객체는 관련된 속성들과 오퍼레이션들을 모아놓은 캡슐인데, 여기서 관련이 있다는 것이 구체적으로 무엇을 의미하는지 살펴보자
3.2.1 속성들 간의 관련성
객체는 관련이 있는 여러 속성들로 구성되어야 하는데, 이 속성들 간의 관련성은 두 가지 형태로 나타낸다.
* 유형 1 상태 유지 완전성 관점의 관련성
객체는 그 상태 유지를 위해 필요한 속성들의 완전한 집합을 가져야 한다.
예를 들면 원이란 도형 객체의 상태를 유지하기 위해서 x, y 라는 중심점 좌표, radius 라는 반지름, color 라는 선 색상이 필요하며, 이들은 원 객체의 정보 저장소를 구성한다. 이 중에서 radius 라는 속성이 누락되어 있다면 원의 상태를 기록 유지할 수 있는 저장소가 완전히 정의되지 못한 것이다.
class Circle { float x, y; // 원의 중심점 좌표 float radius; // 원의 반지름 ColorType color; // 선 색상 }
* 유형 2 상태 유지 완전성 관점의 관련성
한 객체 안에 속한 속성들끼리 서로 관계가 있는 경우
원의 예를 보면, x와 y는 둘이 모여야만 원의 중앙점을 나타낸다. x나 y 둘 중 하나만으로 원의 중앙점을 나타내기에 충분하지 않다. 따라서 x와 y의 속성들은 서로 관련이 있고 이 둘 모두 객체안에 포함되어야한다.
이렇게 여러 속성들 간의 관련성을 고려하면 객체 안에 들어갈 속성들을 보다 완전히 식별 할 수 있다.
3.2.2. 오퍼레이션들 간의 관련성
속성 외에 객체는 관련이 있는 여러 오퍼레이션들로 구성되어야 하는데, 한 객체 안에 있는 오퍼레이션들 간의 관계는 다음과 같이 두 가지 유형으로 나타난다.
* 유형 1 기능성 유지 완전성 관점의 관련성
객체의 기능성이 원의 생성, 원의 삭제, 원의 이동, 원 크기 확대, 원 크기 축소, 원의 선 색상 변경으로 이루어져 있으면, 이 각각의 기능을 수행시킬 수 있는 오퍼레이션들이 모두 식별되고 포함되어야 한다.
* 유형 2 기능 간 의존성 관점의 관련성
원의 경우를 보면, '생성' 오퍼레이션과 '삭제' 오퍼레이션은 원의 수명을 다루는 기능 측면과 관련이 있고,
'확대' 오퍼레이션과 '축소' 오포레이션은 원의 크기 조정과 관련이 있다. 이러한 관련된 오퍼레이션들 중에 일부를 누락해서 객체를 설계하면, 객체의 원래 기능성을 완전히 제공하지 못하게 된다.
이렇게 두 가지 형태의 오퍼레이션 간의 관련성을 고려하면 객체안에 포함될 모든 오퍼레이션을 보다 효과적으로 식별할 수 있다.
3.2.3 속성과 오퍼레이션 간의 관련성
속성들은 동일한 객체 안에 정의된 오퍼레이션들에 의해 처리되기 때문에 다음과 같은 유형의 관련성이 존재한다.
* 유형 1 속성 별 처리해야 할 오퍼레이션의 관점
어떤 속성이 선언되어 있으나 이를 처리하는 오퍼레이션이 없으면 불필요한 속성을 선언했거나 이를 처리하는 오퍼레이션을 누락한 것이다.
* 유형 2 오퍼레이션이 사용하는 속성 및 데이터의 관점
객체 안의 오퍼레이션은 동일한 객체 안의 속성들을 처리해야 하며, 다른 객체에 정의된 속성을 직접 처리하면 안 된다. 동일한 객체의 속성들만 처리하도록 설계해야 객채의 모듈성이 높아진다.
3.3. 캡슐화 언어 장치
Java 대부분의 객체지향 언어에서는 중괄호, 즉 '{' 부호와 '}' 부호 사이에 관련된 속성들과 오퍼레이션들을 캡슐화 시켜 정의한다.
public class Circle { // 캡슐의 시작 private int xPostion; private int yPostion; private int radius; private String color; public void setColor (String color){ this.color = color; } ... } // 캡슐의 끝
3.4. 오퍼레이션의 종류
객체 안에 포함된 오퍼레이션들은 그 용도에 따라서 다음과 같이 분류될 수 있다. 이 분류 체계를 이해하면, 객체가 필요로 하는 오퍼레이션들을 찾는 데 도움이 된다.
3.4.1. Getter, Setter 오퍼레이션
Getter와 Setter 오퍼레이션들은 이런 속성들을 객체의 외부에서 간접적으로 접근할 수 있게 하는 용도로 사용된다. 예를 들면, private int x; 라고 선언된 속성 'x'에 대해서 Getter 오퍼레이션은 'x'의 값을 외부로 전달해 주고, Setter 오퍼레이션은 입력 매개변수인 'x' 값이 유효하면 'x' 값을 저장하는 역할을 한다.
3.4.2. 데이터 처리의 CRUD 오퍼레이션
객체 내에 정의된 각 속성 별로 CRUD를 고려하면 필요한 오퍼레이션들을 효과적이며 체계적으로 찾을 수 있다.
CRUD 오퍼레이션들이 반드시 있어야 하는 것은 아니고, 요구사항에 따라 일부만 적용될 수 있다.
3.4.3. 비즈니스 고유의 오퍼레이션
비즈니스 고유 오퍼레이션이란 그 객체의 비지니스 고유 업무를 처리하는 목적으로 정의된다.
단순한 Getter, Setter가 아니라, 그 해당 객체가 비즈니스 도메인에서 반드시 수행해야 하는 그 객체 고유의 기능을 제공한다.
더보기- 자동차 대여 시스템의 객체
checkOutCat(); //차를 대여하다.
returnCar(); //차를 반납하다.
calculateFee(); //대여료를 계산하다.
좋은 객체는 비즈니스 고유의 오퍼레이션을 잘 정의하고 있어야 하며, 이런 오퍼레이션들은 대부분 그 객체의 상태를 변경시킨다. 즉, 객체의 속성 값을 변경하는 결과를 가진다.
3.4.4. 객체의 생명주기 처리의 오퍼레이션
객체의 생명주기란 객체가 생성되어 삭제되기 전까지의 전 기간을 의미한다. 객체의 생명주기를 다루는 오퍼레이션은 다음과 같이 나누어진다.
* 객체를 생성하는 오퍼레이션
* 객체를 삭제하는 오퍼레이션
* 객체 인스턴스를 관리하는 오퍼레이션
3.5. 캡슐화의 장점
3.5.1. 프로그램의 추상화 수단 제공
캡슐화는 대상 프로그램에 대한 추상화 수단을 제공한다. 객체 단위로 요구사항을 분석하고, 이후 각 객체 별로 속성 및 오퍼레이션을 정의하면 보다 효율적으로 목표 시스템을 개발할 수 있다.
3.5.2. 높은 재사용성 제공
객체지향 패러다임의 객체는 설계 및 코드 재사용하는 기본 단위가 된다. 한 객체에는 관련된 속성 및 오퍼레이션 모두 캡슐화 형태로 정의되어 있으므로, 객체의 모듈성과 응집도과 높아진다. 즉, 캡슐화 원칙을 준수하여 설계된 객체는 재사용성이 높아진다.
3.5.3. 유지보수 효율성 향상
객체지향 프로그램은 객체 단위로 설계 구현되며, 각 객체는 관련된 모든 속성들과 오퍼레이션들을 한 캡슐에 포함하고 있다. 그렇기 때문에, 객체지향 프로그램을 유지보수할 때, 수정 대상이 되는 특정 객체만 수정하면 된다.
'객체지향' 카테고리의 다른 글
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) 2021.01.19 1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) 2021.01.17 고급 객체지향 프로그래밍(2) (2) 2020.01.17 고급 객체지향 프로그래밍(1) (1) 2020.01.17