객체 지향 프로그래밍
현실 세계에서 자동차를 만든다고 생각하면 타이어, 핸들, 엔진 등 부품을 먼저 만들고, 이를 하나씩 조립하여 완성된 제품을 만들 것이다.
이처럼 소프트웨어를 개발할 때에도 부품에 해당하는 객체를 먼저 만들고, 이를 하나씩 조립하여 완성된 프로그램을 만든다.
이러한 기법을 객체 지향 프로그래밍 (OOP : Object Oriented Programming)이라 한다.
객체란?
객체(Object) : 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다.
객체는 속성과 동작으로 구성되어 있다.
예를 들면, 사람은 이름, 나이 등의 속성과 웃다, 걷다 등의 동작이 있다.
자동차는 색상, 모델명 등의 속성과 달린다. 멈춘다 등의 동작이 있다.
자바에서는 속성과 동작을 각각 필드(field)와 메소드(method)라고 부른다.
객체에 속하는 속성과 메소드를 부르거나 사용할 땐 도트(.) 연산자를 사용한다.
person = Calculator.add(10,20); // 메소드 add 호출
객체 간의 관계
객체는 개별적으로 이루어지지만, 대부분 다른 객체와 관계를 맺고 있다.
- 집합 관계 : 객체 하나는 부품, 하나는 완성품에 해당
ex) 자동차와 엔진, 타이어, 핸들
- 사용 관계 : 객체는 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄
ex) 사람은 자동차를 사용할 때 달린다. 멈춘다 등의 메소드를 호출해 원하는 결과를 얻어냄.
- 상속 관계 : 상위(부모)(종류) 객체를 기반으로 하위(자식)(구체적인 사물) 객체를 생성
ex) 기계(상위) - 자동차(하위)
OOP 특징
객체 지향 프로그램의 특징으로는 캡슐화, 상속, 다향성을 들 수 있다.
- 캡슐화 (Encapsulation)
객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것
외부 객체는 객체 내부의 구조를 알지 못하며, 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
(읽기/쓰기/호출 불가능)
필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위해서다.
자바는 캡슐화된 멤버를 노출시킬 것인지, 숨길 것인지를 결정하기 위해 접근 제한자(Access Modifier)를 사용한다.
접근 제한자는 객체의 필드와 메소드의 사용 범위를 제한함으로써 외부로부터 보호한다.
- 상속 (Inheritance)
부모가 가지고 있는 재산을 자식에게 물려주는 것과 같다.
상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해준다.
상속은 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와주고, 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에 반복된 코드의 중복을 줄여준다.
상속은 상위 개체의 수정으로 모든 하위 객체들의 수정 효과를 가져오므로 유지 보수 시간을 최소화시켜주기도 한다.
- 다형성 (Polymorphism)
같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
자바는 다형성을 위해 부모 클래스 또는 인터페이스의 타입 변환을 허용한다.
부모 타입에는 모든 자식 객체가 대입될 수 있고, 인터페이스 타입에는 모든 구현 객체가 대입될 수 있다.
다형성의 효과로 객체는 부품화가 가능하다.
객체와 클래스
사람은 자동차를 이용하기 위해선 우선 공장에서 설계도를 바탕으로 자동차를 만들어야 한다.
여기서 설계도가 클래스(class)에 해당한다.
클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다.
객체 지향 프로그래밍 개발의 단계
1. 클래스 설계
2. 설계된 클래스를 바탕으로 객체 생성
3. 생성된 객체 이용