본문 바로가기

Java SE Tutorials/Class & Object

Java Classes & Objects

Java 프로그래밍, 클래스와 오브젝트 ( Classes & Objects )


객체지향개념 ( Object-Oriented Programming Concepts )

객체지향 프로그래밍 개념을 잘 이해하고 활용하는데 중요한 것은 실물객체(Real-World Objects)의 속성(상태, state)과 행위(기능, behavior)에 대하여 인식하고 분석할 수 있는 시각이 필요하다.


객체 ( Objects ) : Real-World Objects

객체라는 말은 원래 컴퓨터에서 시작된 말은 아니다. 우리가 살고 있는 주변에서 접하는 모든 것들이 객체(real-world objects)이다. 객체는 공통적으로 속성(state)과 행위(behavior)를 포함하고 있다. 행위라는 말을 사람이 아닌 것에 적용하는 것은 자연스럽지 않으므로 행위를 기능이란 용어로 대체하는 것이 좋다. 모든 객체는 자신만의 독특한 속성과 기능을 가진 것은 분명하다. 예를 들어, '나무'는 객체이고 그 속성은 나무를 보는 사람의 관점에 따라서 큰 차이가 있겠지만 나무의 색깔, 크기, 나뭇잎의 모양, 원산지, 향기, 연령 등을 속성으로 들 수 있다. 그럼 나무의 기능은 무엇일까? 나무의 기능도 관점에 따라서 차이가 나겠지만, 경관을 자연스럽고 아름답게 한다든가, 바람이 불면 소리를 낸다든가, 향기를 풍긴다든가, 약재로 사용되어 건강에 기여한다는 점은 나무의 기능으로 들 수 있겠다. 

여기서 일부러 '나무'를 예로 들어 어렵게 객체를 설명한 것은 세상의 대부분의 실물객체가 나무와 같은 경우에 해당하고, 또 소프트웨어에 적용하기에 보다 자연스러운 점이 있기 때문이다. 나무가 아닌 다른 무생물이라 할지라도 이와 같이 속성(state)과 기능(behavior)은 모든 실물 객체에서 관찰할 수가 있다. 우리는 이제부터 실물객체(real-world objects)의 속성과 기능을 한눈에 인식할 수 있는 자세가 필요하다.


객체의 추상화(Object Abstraction)

실물객체(real-world objects)의 속성과 기능을 요약해서 정리하는 좋은 방법은 해당 실물객체의 특성(속성)을 나타내는 명사들을 나열해보면 되고, 해당 실물객체의 기능을 나타내는 동사를 나열해보면 된다. 강아지를 예로 들어 속성(state)과 행위(behavior)를 정리해보자. 실물객체는 그 속성과 기능이 셀 수 없이 많고 복잡하므로 우리가 관심을 두는 몇개의 속성과 기능만을 추출하여 정리할 수 밖에 없다. 이 과정을 객체의 추상화(Object Abstraction)라고 한다. 추상화는 구체화의 반대 의미이다.


강아지에 대한 객체의 추상화 작업의 예

강아지
 - 속성 : 이름, 털 색깔, 크기, 체중
 - 행위 : 짖는다, 꼬리치기, 달리기


객체지향 ( Object-Oriented )

'객체를 지향한다' 이 말은 객체가 아닌 상태에서 객체 상태로의 전환를 추구한다는 의미를 가지고 있다. 세상의 모든 물체는 완전한 객체라고 할 수 있으므로 객체지향이란 말은 실물세계에서 사용할 말은 아니다. 우리가 세상을 살면서 늘 주변의 객체와 접촉하고 그것을 다루며 살고 있기 때문에 객체는 우리에게 상식처럼 여겨진다. 소프트웨어를 작성할 때도 실물객체를 대하는 것처럼 객체단위의 상식적인 사고를 할 수 있다면 실물세계처럼 상식적이고 쉽고 자연스러운 환경에서 소프트웨어를 작성할 수 있을 것이다. 또한 규모가 큰 소프트웨어도 객체단위로 코드를 분리하여 다수의 개발자가 동시에 작업할 수도 있고, 유지보수도 쉽게 된다. 이러한 이유 때문에 객체로 구분되지 않은 소프트웨어 코드를 추상화된 객체로 표현하여 다루려는 경향이 객체지향 프로그래밍(Object Oriented Programming, OOP)이라고 할 수 있다


클래스 ( Class )

클래스(Class)의 사전적인 의미는 학급(반), 등급, 동기, 부류 등의 의미를 가진다. 이 중에서 프로그래밍과 관련한 클래스의 개념을 가장 잘 보여주는 뜻은 '부류'일 것이다. 다시 부류라는 말의 뜻을 한글사전에서 찾으면 다음과 같다

부류(部類) : 동일한 범주에 속하는 대상들을 일정한 기준에 따라 나누어 놓은 갈래

예를 들어, 고양이 클래스가 있다면 그 안에 포함될 수 있는 것은 상식적으로 고양이와 관련한 속성이나 행위(기능)이어야 한다는 것이다. 소프트웨어 개발시 작성하는 클래스는 실물객체를 모방하여로 표현하는 경우가 많기 때문에 해당 객체의 추상화(Object Abstraction)과정을 통하여 정리한 결과는 클래스라는 형식으로 정리된다

소프트웨어 차원에서의 클래스는 객체를 추상화하여 정리한 객체에 대한 텍스트 표현이며, 소프트웨에서 사용할 객체에 대한 설계도에 해당한다. 클래스라는 설계도를 이용하여 소프트웨어의 객체를 생성(instanciation)할 수 있는데, 생성된 객체를 인스턴스(instance) 혹은 그냥 객체라고 한다. 객체와 인스턴스는 같은 의미로 혼용되고 있지만 다음과 같이 관점에 따라서 약간의 어감의 차이는 존재한다


객체(Objects), 인스턴스(Instance), 객체화(Instaciation)

소프트웨어 영역에서 객체라는 말은 실물객체의 추상화를 통한 소프트웨어의 객체이므로 실물객체처럼 속성과 기능을 갖추고 있다는 의미에 중점을 두고 있는 말이고, 인스턴스는 클래스라는 설계도를 통하여 생성한 실체(Instance)라는 의미에 중점을 두고 있는 말이다. 소프트웨어가 실제 기능하려면 설계도인 클래스 단계외에 설계도를 통하여 메모리에 실체가 생성되어야 제대로 사용할 수 있는 객체가 되는 것이다. 


객체지향 프로그래밍의 장점

코드의 재사용성 향상
개발의 생산성
유지보수성 향상
개발비용 절감
고품질 소프트웨어 생산
상속성, 다형성, 은닉성, 캡슐화


Data Encapsulation

서로 관련이 있는 속성과 메소드를 한 클래스 안에 선언하여 다루기 쉽게 하는 것

Data Hiding

외부 클래스에서는 속성에 직접 접근하지 못하도록 설정하여 보안성과 안정성을 향상하는 것
private 변수 및 setter, getter 메소드 선언
Data Hiding 을 위해 Data Encapsulation 도 요구됨