본문 바로가기

프로그래밍이야기/기타 등등

객체지향의 핵심원리 - 추상화/캡슐화/상속성/다형성

반응형

추상화

 

간단하게 표현하면 공통분모를 뽑아 내는것이다.

프로그래밍으로 따지면 공통된 객체를 모아 클래스로 만드는 것이라고 생각하면 될듯하다.

  

현실세계의 사실을 그대로 객체로 표현하기 보다는 문제의 중요한 측면을 주목하여 상세내역을 없애나가는 과정을 추상화(abstraction)라 한다. 객체지향에서는 클래스를 통해서 추상화를 지원하고 있으며, 이것은 다른 전통적 프로그래밍보다 강력한 추상화의 방법이다.

 

추상화의 가장 기본적인 형태는 "프로세스 추상화(process abstraction)"이다. 프로그램에서 자주 나오는 상세한 부분을 함수로 묶어 호출하게 함으로써 이해하기 쉽고 간단한 모양으로 만들어 준다.

 

다음의 Java 구문에서

 

public static void printMessage() {

System.out.println("Hellow, World!");

}

 

System.out.println("Hellow, World!"); 의 경우는 함수로 추상화된 가장 기본적인 예이다. println이라는 함수(메소드)는 문자열의 끝에 \n을 넣어 출력하는 동작을 수행하지만, 개발자는 내부적으로 그것이 어떻게 작동되는 것인지 상세 내역을 알 필요없고 단지 println에 출력하고자 하는 문자열을 괄호안에 넣어주면 그만이다.

 

추상화의 또다른 축은 "데이터 추상화(data abstraction)"인데, 데이터 추상화의 가장 기본적인 형태는 integer, real, date 같은 데이터 타입이다. 개발자는 정수 연산의 값의 범위나 진법, 보수 형태의 치환 등을 일일이 프로그램해 넣을 필요없이 그저 선언만 해주면 된다. 또한 C에서는 typedef struct 같은 추상 데이터 타입, 사용자 정의 데이터 타입을 통해 데이터 구조를 원하는 데로 추상화하여 쓸 수 있다.

 

그러나 이렇게 전통적 언어에서의 추상화 방식은 데이터와 프로세스를 별도로 추상화함으로써 추가적인 작업의 가능성이 많고 내부 메커니즘이 철저하게 숨겨지지 못하여 진정한 추상화라고 볼 수 없다.

 

객체지향 언어에서는 클래스를 이용함으로써 데이터와 프로세스를 함께 추상화의 구조에 넣어 보다 완벽한 추상화를 실현한다.

 

캡슐화

 

객체의 상세한 내용을 객체 외부에 철저히 숨기고 단순히 메시지만으로 객체와의 상호작용을 하게 하는 것을 캡슐화(encapsulation)라고 하고 다른 말로 정보 은닉(information hiding)이라고 한다. , 캡슐화는 추상화와 거의 같은 개념이지만 추상화를 지원하며 보다 구체적이고 제한적이다.

 

예를 들면, 클래스를 선언하고 그 클래스를 구성하는 객체에 대하여 "public" 또는 "private" 등으로 정의해준다. 이렇게 되면 "public"으로 정의된 함수 또는 데이터는 외부에서 사용이 가능하며, "private"으로 선언된 경우는 외부에서 제어할 수 없고 내부에서만 사용된다.

 

이것은 클래스 외부에는 제한된 접근 권한을 제공하며 원하지 않는 외부의 접근에 대해 내부를 보호하는 작용을 한다. 이렇게 함으로써 이들 부분이 프로그램의 다른 부분들에 영향을 미치지 않고 변경될 수 있다.

 

상속성

 

추상화는 복잡한 프로그램을 간단하게 해주고 분석의 초점을 명확히 할 수 있다. 캡슐화는 객체의 내부구조와 실체를 분리함으로써 내부의 변경이 소스 프로그램에 미치는 영향을 최소화한다. 따라서 유지보수도 용이해진다.

 

상속성(inheritance)는 객체기술의 가장 핵심이 되는 개념으로 프로그램을 쉽게 확장할 수 있도록 해주는 강력한 수단이 된다. 앞의 두 개념은 객체지향이 아닌 개발 방법에서도 흉내를 낼 수 있으나 이것은 객체지향 언어와 개발 방법만의 특성이다.

 

예를 들어, 어떤 회사에 근무하는 사원이 정규직 사원, 계약직 사원으로 구분된다고 하자. 이때 사원이라는 정보는 사원의 이름과 주소, 사원번호, 성별 등의 공통된 속성을 가지고 있다. 정규직 사원은 호봉과 연봉을, 계약직 사원은 계약기간과 시간급 같은 고유의 속성들을 가지게 된다. 물론 정규직 사원과 계약직 사원은 모두 사원이라는 클래스의 속성을 그대로 물려받는다. 여기에 추가하여 고유의 속성을 정의하게 되는 것이다. 사원은 클래스 계층에서보면 수퍼클래스(super class)가 되고 정규직과 계약직은 서브클래스(sub class)가 된다. 이렇게 수퍼클래스와 서브클래스간의 관계가 객체지향의 상속성의 개념이다.

 

상속의 효과는 클래스를 체계화할 수 있으며, 기존의 클래스로부터 확장이 용이하다는 것이다. 함수와 변수를 서브클래스에서는 따로 정의하지 않고 상위의 클래스의 내용에다 추가적인 특성을 덧붙이기만 하면 되므로 매우 효율적이다. 또한 공통의 특성을 서브클래스마다 반복적으로 기술하지 않고 한번만 기술하기 때문에 중복을 줄여 준다.

 

다형성

다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나 오버로딩(같은 이름의 메소드가 인자의 갯수나 자료형에 따라서 다른 기능을 하는 것)을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다. 

 

 

반응형