객체란 무엇인가?
객체(Objects) 는 객체지향(Oriented-Object) 기술을 이해하기 위한 핵심 개념이다. 주위를 둘러보면 실제 세계의 객체들을 많이 찾아 볼 수 있다. 주로 강아지, 책상, 텔레비전, 자전거 등과 같은 것 들이다.
이러한 실세계의 객체들은 두가지 특징을 가지고 있는데 바로 상태(State) 와 행동(Behavior) 을 가진다는 것이다. 예를 들어, 강아지는 이름, 색, 품종, 배고파함 등의 상태를 가지고 있으며, 짖다, 물어오다(Fetching), 꼬리를 흔들다 등의 행동들을 가지고 있다. 또 다른 예로 자전거라는 객체는 현재 기어, 현재 패달의 회전 속도, 바퀴 갯수, 기어의 단계수 등의 상태와 멈추다, 가속하다, 천천히 감속하다, 기어를 바꾸다 등의 행동을 가지고 있다.
소프트웨어 객체는 실세계 객체를 바탕으로 모델링되어 진다. 소프트웨어 객체는 상태를 나타내기 위해 한개나 그 이상의 변수(Variables)들을 사용하며 행동들은 메서드(Method)로 표현된다. 메서드들을 다른 말로 하면 객체와 관련된 함수(서브루틴)라고 할 수 있다.
(정의) 객체란 변수들과 그와 관련된 메서드들이 모여서 이룬 하나의 꾸러미이다.
실세계 객체들은 소프트웨어 객체를 통해 표현되어질 수 있다. 혹여 누군가는 실제 강아지를 애니매이션 프로그램에서 사용하기 위해 소프트웨어 객체로 표현하거나, 실제 자전거를 운동을 위한 전자식 자전거 시스템에서 사용할 소프트웨어 객체로 표현하고 싶어 할지도 모른다. 그리고 실제 존재하지 않는 추상적인 객체들도 소프트웨어 객체로 사용할 수 있다. 예를 들어 이벤트(Event)는 GUI(Graphic User Interface) 윈도우 시스템에서 사용자가 버튼을 누른다거나 키보드의 키를 누르는 행위를 하나의 액션(Action)으로 나타내기 위해 사용하는 일반적인 추상 객체이다.
다음의 그림은 소프트웨어 객체에 대해 표현하고 있다.
[ 그림 1-1 ]
소프트웨어 객체가 알고 있는 것들(상태)과 할 수 있는 것들(행동)은 각각 변수와 메서드로서 나타내어진다. 실제 자전거를 객체로 모델링한 소프트웨어 객체는 자전거의 현재 상태(속도는 18mph, 패달의 회전 속도는 90rpm, 그리고 현재의 기어는 5단)를 나타내기 위해 여러 변수들을 가질 것이다. 이러한 변수들은 인스턴스 변수(instance variables)라고 알려져 있다. 왜냐하면, 이 변수들은 어떤 특정한 자전거 객체를 위한 변수들이고, 객체지향에서 이러한 특정 객체를 인스턴스라고 부르기 때문이다. (인스턴스는 객체라는 틀에 의해 생성된 실제 객체의 형태이다. 흔히들 붕어빵에 비유하곤 하는데, 보통 붕어빵을 찍는 틀을 객체(Object), 그 틀로부터 만들어진 각각의 붕어빵을 인스턴스(Instance)라고 일컫는다:역자주)
다음 그림은 소프트웨어 객체로 모델링된 자전거를 나타낸다.
[ 그림 1-2 ]
객체의 변수들에 더해서, 소프트웨어 자전거는 멈추다, 패달의 회전 속도를 높이다, 기어를 바꾸다 와 같은 행동을 위한 메서드들을 가진다. (자전거는 특별히 속도를 변화 시키는 메서드를 가지지 않는다. 왜냐하면, 자전거의 속도는 패달의 회전 속도와 기어의 상태를 통해 나타나는 결과물일 뿐이기 때문이다.) 이러한 메서드들을 인스턴스 메서드라고 부른다. 왜냐하면, 이 메서드들이 어떤 특
정한 자전거 인스턴스의 상태를 변화시킬 수 있기 때문이다.
객체 도식(Diagram)에서 객체의 변수들은 중앙에 위치해 있는 것을 볼 수 있다. 그리고 메서드가 그 주위를 감싸고 있기 때문에 외부에서는 객체의 내부 즉, 변수들을 볼 수가 없다. 이처럼 메서드의 보호아래 객체의 변수들이 묶여있는 것을 캡슐화(Encapsulation) 이라고 한다. 메서드의 보호아래 객체의 중앙에서 변수들이 보호되고 있는 위와 같은 개념적인 그림은 객체를 표현하는 이상적인 모습이며, 객체지향 시스템을 설계하는 디자이너들이 추구하는 이상적인 모습이다. 그러나 이것이 전부가 아니며 종종 현실적인 이유로 인해 변수를 노출시키거나 메서드를 숨겨야 할 때도 있다. 자바 프로그래밍 언어에서 각각의 변수와 메서드는 네가지 접근레벨 중에서 하나의 레벨로 설정된다. 접근레벨은 어떤 객체와 클래스가 변수와 메서드에 접근할지를 판단한다.
캡슐화는 단순하지만 강력한 아이디어로써 소프트웨어 개발자에게 다음과 같은 두가지 이점을 제공한다.
1. 모듈성(Modularity)
하나의 객체를 위한 소스코드는 다른 객체를 위한 코드에서 독립적으로 사용되어 질 수 있다. 또한, 객체는 시스템 어디에서나 쉽게 적용될 수 있는데, 어떤 이에 의해 만들어진 자전거 객체는 다른 누군가가 아무 수정을 가하지 않고 자신의 시스템에 바로 적용시킬 수 있다.
2. 정보은닉(Information hiding)
객체는 다른 객체의 접근을 허용하기 위해 PUBLIC 이라는 접근단계를 가지고 있다. 객체는 그 객체를 참조하는 다른 객체에게는 아무 영향도 끼치지 않고, 자신의 PRIVATE 변수와 메서드를 언제든 수정할 수 있다. 실제로 자전거가 어떤 원리에 의해 움직이는지 자전거를 타는 사람은 알 필요가 없다는 말이다. (외부 객체에게는 인터페이스만을 제공하므로 private 로 묶인 변수나 메서드는 그 객체만이 접근할 수 있다. 즉, 이러한 private 변수나 메서드는 내부 구현을 위해 사용되는 것으로써, 외부 객체는 내부적으로 어떤 행동들이 발생하는지는 전혀 알 필요가 없다는 의미이다.)
[출처] Tong - sjhfeel님의 자바익히기 대작전!!통