객체 지향과 자바
1. 객체 지향 언어의 목적
객체 지향 언어 (Object Oriented Language)가 출현할 당시 가장 범용으로 사용되던 언어는 절차 지향 언어 (Structured Procedural Programming Language) 였다. 객체 지향 언어는 절차 지향 언어가 가진 단점을 보완하고 다음의 목적을 달성하기 위해 탄생하였다.
1) 소프트웨어의 생산성 향상
컴퓨터 산업이 발전함에 따라 소프트웨어의 생명 주기(life cycle)가 짧아졌는데, 이는 어떤 제품이 기획되면 짧은 시간 내에 소프트웨어를 만들어야만 했기 때문이다. 객체 지향 언어는 상속, 다형성, 객체, 캡슐화 등 소프트웨어의 재사용을 위한 여러 장치를 내장하고 있다. 객체 지향 소프트웨어를 새로 만드는 경우, 이미 만든 객체 지향 소프트웨어를 상속받거나 객체를 가져다 재사용할 수 있다는 장점이 있다. 이는 다시 말해, 부분 수정을 통해 소프트웨어의 전반적인 부분을 다시 만들어야 하는 프로그래머들의 부담감을 대폭 줄여 줄 수 있다는 장점을 가졌다는 것이다. 즉, 객체 지향적인 특징으로 인해서 소프트웨어의 생산성이 크게 향상되었다.
2) 실제 세계에 대한 쉬운 모델링
과거의 소프트웨어는 수학 계산이나 통계 처리를 하는 등 대체로 처리 과정이나 계산의 절차가 중요했다. 그렇기에 과거에는 절차 지향 언어가 매우 적합하였다. 그러나 요즈음에는 컴퓨터가 산업 전반에 활용됨에 따라 실제 세계에서 발생하는 일을 프로그래밍해야 할 일이 더욱 많아지게 되었다. 하지만, 실세계의 일을 일련의 절차로만 묘사하는 것이 그리 쉽지는 않았다. 실제 세계의 일은 절차나 과정보다는 일과 관련된 많은 물체(객체)들의 상호 작용으로 묘사하는 것이 더욱 이해하기 쉬울 것이라는 것은 너무나도 명확하다고 할 수 있다. 따라서 실세계의 일을 보다 쉽게 프로그래밍하기 위해 객체를 중심으로 하는 객체 지향 언어가 나타나게 되었다. 게임을 예로 들어보자. 게임은 하나의 흐름도에 의해 진행되지 않는다. 게임에 등장하는 각 요소인 인물, 무기, 배경 등이 각각 구성되며 사용자의 입력에 의해 이들이 상호 작용하면서 프로그램이 실행되어 간다. 객체 지향 언어는 이러한 게임에 등장하는 각 요소를 객체로 정의하고, 객체의 속성과 행위를 묘사하고 객체 사이의 상호 작용을 표현하는 방법으로 효과적인 프로그래밍을 할 수 있게 한다.
위에서 알 수 있듯이, 객체 지향 프로그래밍에서 프로그램 작동의 주체는 클래스가 아닌 객체들이다. 객체들이 모여서 서로 정보를 주고 받으면서 프로그램이 작동되는 것이 바로 객체 지향 프로그램이다.
이처럼 객체들이 서로 상호작용하기 위해서는 객체가 다른 객체에 접근을 해야 하는데, 이 장치를 메시지(Message)라고 한다.
i.e.
boolean exist = TV.searchProduct(productName); // 파란 부분이 바로 메시지 전달을 하는 부분
+a) 메시지의 개념
- 객체가 다른 객체에 접근하기 위한 장치이다.
- 한 객체가 다른 객체에 서비스를 요청하기 위한 장치이다.
- 객체.함수명(매개변수) 의 형태로 구성된다.
2. 절차 지향 프로그래밍과 객체 지향 프로그래밍
C 언어처럼 실행하고자 하는 절차대로 일련의 명령어를 나열하여 프로그래밍하는 방법을 절차 지향 프로그래밍이라고 부르며, 이런 방법론에 사용되는 언어를 절차 지향 언어라고 한다. 절차 지향 프로그래밍은 목적을 달성하기 위해 일의 절차를 표현하며, 명령들의 순서 또는 흐름에 중점을 둔다.
출처: <https://m.blog.naver.com/atalanta16/220249264429>
그러나 컴퓨터를 이용하여 문제를 해결하려는 실제 세상은 단순한 일련의 행위 뿐만이 아니라 각 물체 간의 관계, 상호 작용 등 훨씬 복잡하게 구성되어 있다. 절차 지향 언어로는 복잡한 실제 세상의 문제 해결 대상을 프로그래밍 언어로 표현하기에 한계가 있다. 절차 지향 언어로는 복잡한 실제 세상의 문제 해결 대상을 프로그래밍 언어로 표현하기에 한계가 있다. 이러한 단점을 극복하기 위해 나타난 객체 지향 개념은 컴퓨터 프로그램을 보다 실제 세상에 가깝게 모델링 (modeling) 하여 실제 세상의 물체를 객체로 표현한다. 그리고 이 객체들의 관계, 상호 작용을 프로그램으로 나타낸다.
위의 예제 이미지를 보도록 하자. 자판기를 구현하더라도, 절차 지향 언어의 경우, 단순한 논리적 흐름에 따라 구현을 하게 된다. 그에 반해, 객체 지향 언어로 개발을 하게 되면, 고객과 자판기의 상호작용이라는 더욱 현실적인 구조로 구현을 하는 것이 가능하게 된다.
3. 객체 지향 언어의 특성
프로그래밍 언어에서 객체가 다음과 같은 특성을 가질 때 객체 지향적이라고 한다.
1) 캡술화 (capsulisation)
캡슐화란 객체를 캡슐로 싸서 그 내부를 보호하고 볼 수 없게 하는 것을 말한다. 약국에서 흔히 볼 수 있는 캡슐 약을 생각하면 쉽게 이해할 수 있다. 가루약을 캡슐에 넣게 되면 어떤 색인지, 맛은 어떤지, 혹은 어떤 성분이 들어 있는지 등의 정보를 알 수가 없다.
자바에서 객체는 메소드(함수)와 필드(데이터 변수)로 구성된다. 클래스(class)라는 캡슐을 사용하여 객체를 표현하며 메소드(method)와 필드(field)를 클래스 내부에 구현한다. 이렇게 함으로써 객체 외부에서는 객체 내의 숨겨놓은 메소드나 필드를 직접 접근할 수 없으며 메소드의 구현 내용도 알 수 없다. 몇몇 메소드와 필드는 객체 외부와의 인터페이스를 위해 노출한다. (객체는 캡슐화가 기본 원칙이지만 외부와의 접속을 위해 몇 부분만을 공개 노출한다.)
캡슐화의 궁극적인 목적은 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한 등을 위한 것이다. 외부에서 클래스 내부의 데이터 접근을 금지하는 것을 정보 은닉화 (information hiding) 라고 한다.
2) 상속 (inheritance)
상속은 상위 개체의 속성이 하위 개체에 물려져서, 하위 개체가 상위 개체의 속성을 모두 가지고 있음을 의미하는 관계이다. 예를 들자면, '어류'는 '동물'의 속성과 '생물'의 속성을 가지고 있다. 비슷하게 '나무'는 '식물'의 속성과 '생물'의 속성을 가지고 있다. 여기서 상하관계를 정리해 보자면, '생물'이 최상위 개체가 될 것이며, '동물'과 '식물'은 '생물'의 속성을 가진 하위 개체가 된다. 또한, '어류'나 '포유류' 등은 '동물'의 속성을 가진 '동물'의 하위 개체가 될 것이며, '나무'는 '식물'의 하위 개체가 된다.
자바에서 상속은 부모 클래스(parent class)의 속성을 자식 클래스(child class)가 물려받는 개념이다. 자바에서 부모 클래스를 슈퍼 클래스(super class)라고도 부르며 이를 상속받는 클래스를 서브 클래스(sub class)라고 부른다. (super class = parent class, sub class = child class) 상속은 이미 만들어진 클래스의 필드와 메소드를 물려받게 함으로써 자바 코드의 중복 작성을 방지하여 코드 작성에 드는 시간과 비용을 줄일 수 있게 한다. 즉, 상속은 코드의 재사용을 가능케 한다.
3) 다형성 (polymorphism)
다형성은 같은 이름의 메소드 호출에 대해 객체에 따라 다른 동작을 할 수 있도록 구현되는 것을 의미한다. 이는 동일한 슈퍼클래스를 서로 다른 서브 클래스가 상속 받았을 때에 나타날 수 있는 현상이라고 할 수 있다. 예를 들자면, 강아지, 고양이, 닭은 모두 동물의 속성을 물려받았다. 동물은 소리를 내는 속성을 가지고 있다. 그러나, 강아지, 고양이, 닭은 모두 다른 소리를 낸다.
다형성은 나중에 다룰 오버로딩(overloading)과 오버라이딩(overriding)과 밀접한 관계가 있다.
'Java > Java 기본' 카테고리의 다른 글
객체 배열 (0) | 2018.06.22 |
---|---|
클래스 선언과 활용 (0) | 2018.06.22 |
예외 (Exception) (0) | 2018.06.21 |
main() 메소드의 인자 (0) | 2018.06.13 |
메소드에서 배열 리턴 (0) | 2018.06.12 |