[ java ] in KIDS 글 쓴 이(By): hell (나누구야) 날 짜 (Date): 1997년10월09일(목) 22시12분33초 ROK 제 목(Title): 자바의 데이터형과 변수 (5) ------------------------------------------------------------------------------ 뉴스제공시각 : 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은 객체 지향에 대한 개념을 잡을 수 있도록 아주 쉽게 쓰여져 있다. 더불어 참고자료⑤, ⑥ 의 앞쪽 몇 장도 읽어둘 만하다. ------------------------------------------------------------------------------ |