------------------------------------------------------------------------------
뉴스제공시각 : 02/01 00:00 출처 : 마이크로
제목 : 자바프로그래밍[2]/자바의 데이터형과 변수 (5)
-----------------------------------------------------------------------------
객체지향 프로그래밍
객체지향 프로그래밍이란 문제를 해결하는 데 있어서 "필요한 객체를 찾아 그 종류
와 특성에 따라 체계적으로 분류하고, 그 객체가 반응해야 할 메시지를 정의한
뒤, 객체에 보내는 메시지의 순서를 기술"하는 프로그래밍 방법이다. 황당한 정의
인지는 모르겠지만 이 문장은 객체지향 프로그래밍을 행하는 순서를 간략히 설명한
것이다.
객체지향 언어에서의 객체는 행위(behavior)와 상태(state)를 가지는 대상으로
실제
우리 주변에서 보는 컴퓨터, 자전거, 사람 등등의 사물들이나 날짜, 시간 등 여타 추
상적인 개념을 컴퓨터 내부에서 표현한 것이다. 객체지향 언어에서 객체는 행위를
나타내기 위해 메쏘드를 가지고 있고, 상태를 나타내기 위해 필드(변수)를 가지고 있
다. 즉, 메쏘드와 필드를 묶어놓은 꾸러미같은 것이다.
이 객체는 내부적으로 어떻게 만들어졌든지 간에 객체에 주어지는 메시지를 반응함
으로써 어떠한 일을 행한다. 객체 외부에서 객체에게 무엇인가를 하라고 지시 혹은
요청하는 것으로 볼 수 있다. 이에 대해 객체는 자신의 상태를 바꾸거나 하여 일을
하고 때때로 결과로 객체를 돌려준다. 예를 들어 보자.
만약 "자동차"라는 객체가 있다고 해 보자. 이 객체는 현재의 속도, 기어가 몇 단인
가 등의 상태를 가질 수 있다. 다음으로 "가속하라", "현재 속도는 얼마인가?",
"기어
를 x 단으로 하라" 등등의 지시를 받을 수 있다. 이러한 것들은 객체에 보내는
"메시
지"로 볼 수 있다. 두번째 질문의 경우 속도를 결과로 알려준다. 객체를 돌려주는
것
에 비유될 수 있다. 이 자동차를 자바 클래스로 나타내어 보자.
class 자동차 {
private int 속도;
private int 기어 = 1;
public void 가속하라() {
속도 = 속도 + 기어 * 5;
}
public int 현재속도() {
return 속도;
}
public void 기어변경(int x) {
기어 = x;
}
}
class Test {
public static void main(String args[]) {
자동차 티뷰론 = new 자동차();
티뷰론.가속하라();
System.out.println("속도 : " + 티뷰론.현재속도());
}
}
이와 같이 내부의 속도, 기어 등의 상태, 즉 데이터는 잘 정의된 메시지에 의해
숨겨
진다. 메쏘드는 이 메시지에 어떻게 반응할 것인가를 나타낸 것과 같다. 이와
같이
객체는 어떤 개념이나 대상을 추상화(abstraction)할 수 있고, 객체 내부의 구현과
데
이터를 묶어 그 외부와 격리시키는 캡슐화(encapsulation)을 하는 수단이
된다(위의
그림을 참고하라). 그리고 클래스 Test의 main() 메쏘드에서 보듯이 해결해야 할 문
제는 객체에 일련의 메시지를 보내는 것으로 풀어간다.
하지만 우리 주변을 살필 때 단순히 주변의 대상을 객체로 나타낼 수 있는 것만으로
는 뭔가 불편하다는 것을 느낄 수 있다. 자동차에는 승용차, 화물차 등이 있고
승용
차에는 소형, 중형, 화물차에는 적재량에 따라 다양한 종류의 화물차가 존재한다.
각
각은 틀리지만 공통된 특징들을 가지고 있다. 예를 들면 위에서 언급한 변속과
가속,
현재의 속도 등은 어느 자동차나 가지는 특징이다. 그렇다면 공통된 특징은 두고 각
각이 틀린 부분만을 새로이 추가하면 되지 않을까? 이것을 지원하기 위해 도입된 개
념이 상속(inheritance) 개념이다. 마치 생물을 분류하듯이 객체를 종류별로
분류하는
것이다.
마지막으로 객체지향 프로그래밍에서 중요시 되는 개념으로 또 한 가지 다형성
(polymorphism)이 있다. 예를 들어 보자. 수동 변속 장치와 자동 변속 장치가
각각
달린 자동차가 있다고 하자. 만약 이 들의 기어를 변경할 필요가 있을 때,
전자보고
는 "수동 변속하라", 후자보고는 "자동 변속하라"라고 구분해 이야기하지는 않을
것이
다. 그냥 단순히 자동차이기 때문에 "변속하라"라고 이야기할 것이다. 하지만
변속하
는 방법은 틀리다. 이 같이 서로 다른 객체에게 동일한 메시지를 보낼 수 있는
것은
다형성 때문이다.
지금까지 간단히 객체지향 프로그래밍에 대해 알아보았다. 실제 위의 개념을 용이하
게 사용하게 하기 위해 자바에서 어떤 지원을 하는가는 차차 알아 보도록 하자. 이
런 객체지향 프로그래밍은 먼저 실제 세상의 객체를 프로그램에 그대로 옮겨올 수
있고, 인간의 사고 방식과 유사하여 문제 분석과 해결을 쉽게 한다. 다음으로 객
체의 구현을 객체 안에 한정시킴으로써 한 번 작성한 코드를 재사용하기 쉽게 해 주
고, 상속에 의해 쉽게 기존의 프로그램을 확장할 수 있게 해 준다. 또한, 객체
내부
를 수정해도 그 메시지만 변치 않으면 다른 객체가 영향 받지 않으므로, 쉽게 수정
할 수 있고 신뢰도 높은 프로그램을 작성할 수 있다.
하지만 자바 프로그래밍을 하면서 객체지향적으로 프로그래밍해야 한다는 강박 관념
에 빠져 너무 괴로워하지는 말자. 다른 프로그래밍 방법과 객체지향 방법에 대한 비
교는 참고자료②의 pp.14∼42를 참고하기 바라며, 참고자료⑨의 pp.31∼41은 객체
지향에 대한 개념을 잡을 수 있도록 아주 쉽게 쓰여져 있다. 더불어 참고자료⑤,
⑥
의 앞쪽 몇 장도 읽어둘 만하다.
------------------------------------------------------------------------------