객체지향? 추상화?

2014. 11. 9. 17:16Basic/etc

반응형
1. 객체지향프로그래밍(OOP : Object-Oriented Programming)
 
1970년에 Brian Kernighan(브라이언 커니언)과 Dennis Ritchie (데니스 리치)는 운영체제를 만들 목적으로 C 언어를 만들었다.
이렇게 탄생한 C 언어는 아주 단순하고 유연하여 여러가지 프로그램들에 사용되게 되었고 지금(2011년)까지 가장 인기있는 언어들중 하나가 되었다.
 
하지만 C언어는 프로시저(함수)기반의 언어라는 특징 때문에 프로그래머들이 C언어로 프로그램을 설계할 때 먼저 데이터를 기술하고 나서 그 데이터를 사용하고 조작하는 프로시저(함수)를 만들어야만 했다.
 
C언어를 사용하는 프로그래머들은 데이터와 그 데이터를 조작하는 프로시저(함수)를 하나로 묶어서 설계하면 프로그램을 더욱 명확하고 쉽게 만들 수 있다는 것을 알게 되었다. 이로부터 데이터와 프로시저(함수)를 하나로 묶는 클래스(or 객체)의 개념이 나오게 되었으며, 이렇게 프로그램을 클래스로 설계하는 것을 객체지향설계(OOD : object-oriented design)라 하였다.
 
그리하여 1980년에 Bjarne Stroustrup(브얀 스트로스럽 --?)은 클래스가 있는 C언어를 만들기 시작하였으며, 이로써 C를 개선하여 클래스와 여러가지기능(상속,캡술화,다형성...)을 추가하는 C++이라는 언어가 탄생하게 되었다.
 
그후로 1991년 썬 마이크로시스템즈 사에서 자바의 아버지로 불리우는 James Gosling(제임스 고슬링)을 비롯하여 Patrick Naughton(패트릭 녹턴), Chris Warth(크리스 와스), Ed Frank(Ed 프랭크) , Mike Sheridan(마이크 셰리든)등은 이러한 객체중심의 패러다임 설계, 스트림라인 기반의 예외 처리, 언어 차원에 내장된 멀티스레딩 모델, 바이트 코드 개념을 이용한 멀티 플랫폼 지원, 언어차원의 인터넷 지원등의 혁신적인 개념을 도입한 새로운 언어를 개발을 시작하여, 초장기 'Oak'라는 이름에서 1995년에 'Java'라는 이름으로 변경되어 현재 가장 인기있는 언어로 자리잡았다.
 
 
2. 객체지향?, 객체?, 클래스?
 
클래스와 객체에 대해서는 이전단락에서 설명했는데 이것들과 객체지향은 어떤관계가 있는가?
현실세계에서 자동차를 움직이고 싶다면 먼저 자동차를 만들고 사람이 운전석에 앉아서 자동차에게 키를 이용하여 시동이 걸리도록 명령하고 엑셀을 통해 움직이도록 명령하고 핸들을 통해 움직이고 싶은 방향을 명령하고 브레이크를 통해 멈추기를 명령한다.
 
그럼 컴퓨터라는 공간에서 프로그램은 어떨까? 현실과 마찬가지다 컴퓨터라는 가상의 공간에서 자동차를 만들고 현실과 동일하게 사용자가 자동차에게 명령을 하면된다.
 
 현실에서 자동차를 만들려면 자동차를 만들어 낼 하나의 틀(설계도, 정의) 같은것이 필요하고 그 틀을 통하여 자동차1, 자동차2..., 를 만들어 낼수 있다.
객체지향 언어에서 이 틀에 해당하는 것이 클래스이고 이 틀을 통해 만들어지는 자동차가 객체(instance)에 해당된다.
 
 우리가 자바 프로그램을 만든다는 것은 컴퓨터 메모리에 현실의 자동차와 같은 가상의 실체를 올려서 그 실체가 실행되도록 그 실체의 정의(틀)에 해당하는 클래스를 만드는 것이다.
객체지향 이전의 C같은 함수지향 언어는 명령과 데이터를 올려서 명령에 의해 실체가 실행가능하도록 하였지만, 자바같은 객체지향언어는 "데이터+명령"을 포함하고 있는 가상의실체(객체)를 올려서 실행한다.

 
3. 추상화
 
현실세계에서 자동차, 사람 등 실제로 만져볼 수 있는 형태도 객체이지만, 은행구좌, 주문 등의 인간의 관념속에 존재하는 것들도 객체이다. 이렇게 실세계에 존재하는 객체들을 프로그램으로 변환하기 위해서 객체들의 공통된 특성들을 파악하고, 불필요한 특성들은 제거하는 과정을 거치게 되는데 이러한 과정을 추상화(abstraction)라고 한다. 추상화 과정을 통해서 객체들의 공통된 특성들을 모아놓은 것을 클래스라고 한다. 
 
 
※ 우리는 흔히 클래스를 설계할 때 속성에 다소 집중해서 설계를 하는 경향이 있다. 클래스를 정의할 때 중요한 건 '속성'이 아니라 '동작'이다. '동작을 먼저 정하고, 그 동작에 필요한 속성을 고려한다'는 식으로 접근하는 편이 불필요한 속성이 크래스 내에 섞여 들어가는 걸 줄여준다. 불필요한거나 자리를 잘못 잡은 속성이 클래스에 포함되면 그 결과 또 다른 불필요한 동작이 클래스에 추가되어 클래스의 정체성이나 모듈성을 훼손시킨다. - 테스트 주도 개발 TDD실천법과 도구 : 한빛미디어 - 
 
 
4. 객체지향 프로그램
 
객체지향 기술의 가장 기본적인 원칙은 정보를 클래스라 불리는 추상화된 자료형태로 표현할 수 있다는 것이다. 여기서 클래스는 단순한 데이터의 기능뿐만 아니라 그 데이터를 처리할 수 있는 함수기능(메서드)들도 포함한다.
 
객체지향 프로그램은 이러한 클래스들로 만들어진 객체들의 집합이다. 객체지향 프로그램은 어떠한 작업을 수행하기 위해서 각 객체들간에 의사소통을 하면서 협력해야만 하는데, 객체지향 프로그래밍에서 객체들간의 의사소통은 메세지패싱(message passing)을 사용하는데 대부분의 언어가 메세지패싱 구현방법으로 함수호출(메서드호출)방법을 사용한다.
 
자동차를 운전하기 위해서 자동차라는 객체를 만들고 사람이라는 객체를 만들고 두 객체들 간에 메세지를 전달하여 협력해서 자동차가 움직이는 작업을 수행 할 수 있다.
 
 
5. 객체지향의 장점
 

- 객체 중심적이므로 코드를 이해하기 쉽다

- 실세계를 소프트웨어로 그대로 반영할 수 있다

- 코드의 재사용이 용이하다

- 유지/보수가 용이하다

- 보안에 효율적이다

반응형

'Basic > etc' 카테고리의 다른 글

추상클래스와 인터페이스  (0) 2014.11.09
접근제어자와 캡슐화  (0) 2014.11.09
다형성  (0) 2014.11.09
포함? 상속?  (0) 2014.11.09
오버로드? 오버라이딩?  (0) 2014.11.06