티스토리 뷰

캡슐화

객체지향 기술 이전에는 수 많은 소프트웨어 개발자들이 일반적으로 프로그램을 만들 때 이미 비슷하거나 동일한 기능을 하는 알고리즘을 매번 처음부터 개발하여야 했다. 따라서 이전의 코드들을 재사용할 수 있는 방법이 필요하다는 것을 인식하게 되었는데 다른 사람이 작성한 코드를 쓰기 위해서는 코드 자체가 잘 정리되어 있어야만 할 것이다. 


즉 관련된 데이터와 알고리즘이 하나의 묶음으로 정리되어 있어야 한다. 객체 지향 프로그래밍에서는 이것을 캡슐화(encapsulation)라고 부른다. 캡슐화는 용어 그대로 서로 관련된 데이터와 알고리즘을 캡슐에 넣어서 포장하는 것을 의미한다.

캡슐화는 데이터와 알고리즘을 하나로 묶는 것입니다.

JAVA에서는 클래스에 의해 생성된 객체(인스턴스)가 바로 하나의 캡슐임을 알수 있다.  객체는 필드와 메소드를 가지는데 필드는 데이터에 해당하고 메소드는 알고리즘에 해당한다.


캡슐화의 첫 번째 목적은 서로 관련되어 있는 데이터와 알고리즘을 묶는 것이다. 자바는 그래픽, 네트워크, 데이터베이스 등이 많은 기능들을 객체 형태로 제공한다. 따라서 개발자들은 이들 객체를 이용하여 자신이 원하는 애플리케이션을 쉽게 제작할 수 있다.

캡슐화의 두 번째 목적은 객체를 캡슐에 싸서 객체의 내부를 보호하는 것이다. 즉 객체의 실제 구현 내용을 외부에 감추는 것이다. 이것을 정보 은닉(information hiding)이라고 한다. 텔레비전의 채널 등 버튼이나 리모컨 등 사용자 UI를 제외한 내부의 장치들을 외부에 노출할 필요는 없다. 마찬가지로 자바에서는 보통 필드(데이터)는 공개되지 않고 몇 개의 메소드만이 외부로 공개된다.


상속

상속은 기존의 코드를 재활용하기 위한 기법으로 이미 작성된 클래스(부모 클래스)를 이어 받아서 새로운 클래스(자식 클래스)를 생성하는 기법이다. 자식 클래스는 부모 클래스의 모든 속성과 동작을 물려 받는다. 추가로 만약 자식 클래스에만 필요한 기능이 있다면 추가 또는 변경할 수 있다. 상속은 기존의 코드를 재사용하는 강력한 기법이다.


다형성

다형성이란 객체가 취하는 동작이 상황에 따라서 달라지는 것을 의미한다. 자바에서는 서로 다른 타입에 속하는 객체들이 같은 이름의 멤버 함수에 응답하여서 서로 다른 동작을 보여주는 것이 가능하다. 개발자는 객체의 타입을 미리 알 필요가 없고 객체의 정확한 동작은 실행 시간에야 결정된다. 다형성을 사용하게 되면 실제 동작은 다르더라도 개념적으로 동일한 작업을 하는 멤버 함수들에 똑같은 이름을 부여할 수 있으므로 코드가 더 간결해진다.

 

추상화

추상화(abstraction)는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로서 프로그램을 간단히 만드는 기법이다. 객체지향에서 추상화라는 개념은 ‘객체에서 공통된 속성과 행위를 추출하는 것’을 의미한다.


예를 들어 홍길동 교수, 이순신 교수, 강감찬 교수가 있다고 하자. 이 교수들을 객체로 보고 공통된 속성과 오퍼레이션으로 ‘교수’라는 클래스를 정의한다고 해보자. 공통된 속성으로 이름, 주민등록번호, 강의 분야, 주소, 전화번호를 추출하고, 공통된 행위로써 ‘강의하다’,’채점하다’,’과정 등록하다’를 추출했다고 하면, 그를 포함한 클래스가 생성된다.


[객체기술사전]에 따르면, 추상화란 ‘중요하지 않거나, 주 관심 대상이 아닌 자세한 부분은 감추거나 무시하고, 가장 중요하고, 근간이 되고, 다른 대상들과 구분될 수 있는 면만을 포함하고 있는 모델이며, 공통점을 강조하기 위해 차이점을 제거한 결과물’이라고 정의하고 있다. 실제로 객체의 속성과 행위 중에서 관심 대상이 아닌 부분은 드러낼 필요가 없는 것이 추상화이다.

그러니까 추상화는 다른 객체들과 구분되는 핵심적인 특징들에만 집중함으로써, 복잡도를 관리할 수 있도록 한다. 주의할 점은 추상화는 문제 영역과 관점에 의존적이라는 것이다. 따라서, 하나의 대상에 대하여 목적이나 원하는 기능에 따라 여러 추상화 모델이 생성될 수 있다.

 


'Java' 카테고리의 다른 글

[Java] super 키워드  (0) 2018.10.27
[Java] 고급 배열  (0) 2018.10.27
[Java] 내장 클래스  (0) 2018.10.27
[Java] 자료형(data type)의 종류  (0) 2018.10.27
[Java] 접근 제어 지정자  (0) 2018.10.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크