객체 지향 프로그램이란 객체들을 먼저 정의하여 객체들 간의 상호작용을 완성된 프로그램을 만드는 것이다. 객체 지향 프로그래밍을 이해하기 위해선 객체부터 알아봐야한다.
객체(Object)
란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성
을 가지고 있고 다른 것과 식별 가능한
것을 말한다. 예를 들어 물리적으로 존재하는 모니터, 마우스, 키보드, 사람 등이 있고 추상적으로 존재하는 것은 학과, 공부, 주문 등이 있는데 이를 모두 객체
가 될 수 있다.
객체
는 속성
과 동작
으로 구성된다. 예를 들어 사람은 이름, 나이와 같은 속성이 있고 먹다, 뛰다 등의 동작이 있다. 자바에서는 이 속성
과 동작
을 각각 필드(field)
와 메소드(method)
라고 부른다.
객체들은 독립적으로 존재하고, 다른 객체와 상호작용한다. 객체들 사이의 상호작용 수단은 메소드이다. 다른 객체의 기능을 이용하려면 메소드를 호출하면 된다. 현실 세계로 예를 들어 보면 사람이 정수기에서 물을 받는 다고 생각해보자. 사람이라는 객체
가 컵을 가지고 정수기라는 객체
의 물 배출이라는 메소드
를 사용한다고 생각하면 된다. 그러면 사람은 그 결과로 컵에 물을 받을 수 있게 된다.
객체들은 관계를 가질 수 있다. 관계의 종류에는 집합 관계
, 사용 관계
, 상속 관계
가 있다. 예를 들어 설명해보면 자동차는 엔진, 타이어, 핸들 등으로 구성되어 있으므로 자동차와 부품들은 집합 관계
에 있다고 할 수 있다. 사용 관계
는 객체 간의 상호작용
을 말하는데 자동차와 사람의 관계가 그렇다고 할 수 있다. 마지막으로 상속 관계
는 상위(부모) 객체
를 기반으로 하위(자식) 객체
를 생성하는 관계를 말한다. 자동차는 기계의 한 종류이므로 기계와 자동차가 그렇다고 할 수 있다.
객체에 대해 좀 알게 되었으니 다시 객체 지향 프로그래밍의 특징을 알아보도록 하자.
객체 지향 프로그래밍은 4가지 특징을 가진다. 캡슐화
, 추상화
, 상속
, 다형성
이며 이 4가지 특징에 대해 하나하나 알아보도록 한다.
캡슐화 (Encapsulation)
캡슐화란 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것을 말한다. 캡슐화를 하면 외부의 잘못된 사용으로 인해 객체가 손상되지 않게 되며 정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있게 해준다. 결합도란 어떤 기능을 실행할 때 다른 클래스나 모듈에 얼마나 의존적인지를 나타내는 지표를 말한다. 자바 언어는 캡슐화된 멤버를 노출시킬 것인지, 숨길 것인지를 결정하기 위해 접근 제한자
를 사용한다.
추상화 (Abstraction)
객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 것이다. 객체 지향적 관점에서 클래스를 정의하는 것이 추상화라고 할 수 있다.
상속 (Inheritance)
상위(부모) 객체
는 자기가 가지고 있는 필드와 메소드를 하위(자식) 객체
에게 물려 주어 하위 객체가 사용할 수 있도록 해준다. 반복된 코드의 중복을 없애주는 효과가 있고 하위 객체를 쉽고 빠르게 설계할 수 있도록 해준다. 상속은 상위 객체의 수정으로 모든 하위 객체들의 수정 효과를 가져오므로 유지 보수 시간을 최소화 시켜준다. 그러나 상속을 통해 코드를 재사용 할 경우 상위 객체의 변경이 불편해질 수 있다. 그러므로 재사용의 관점에서 상속을 하면 안되고 일반적인 개념을 구체화하는 상황에서 상속을 사용해야 한다.
다형성 (Polymorphism)
같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 뜻한다. 자바는 다형성을 위해 부모 클래스 또는 인터페이스의 타입 변환을 허용한다. 쉽게 이해하기 위해 다형성에 대해 예를 들면, 마우스에 AA 건전지를 넣어야 한다고 할 때, AA 건전지란 규격이 존재하므로 에너자이저 건전지나 듀라셀 건전지를 사용할 수 있지만, 그 성능이 다르게 나오는 것이 다형성
이다.
자바에서 객체를 사용하려면 만드는 작업을 해야하는데, 클래스
에 객체를 생성하기 위한 필드
와 메소드
가 정의되어 있다. 클래스를 통해 만들어진 객체를 해당 클래스의 인스턴스(instance)
라고 한다. 하나의 클래스에서 여러 개의 인스턴스를 생성하는 것은 현실 세계에서 어떤 설계도를 통해 여러 개의 어떤 물건을 만들어내는 것과 같다.
이 포스팅은
신용권, ⌜이것이 자바다-신용권의 Java 프로그래밍 정복⌟, 한빛미디어(주), 2015, 1,224
책을 참고했습니다.