프로그래밍언어 자바

4. 객체지향 개념과 자바


이번 강좌에서는 객체지향 프로그래밍의 주요 개념과 자바 객체지향 프로그래밍을 하기 위한 기본적인 내용을 배우게 됩니다.

이 강의를 통해 객체지향이 무엇인지 이해하고 자바 프로그램 설계에 객체지향 개념을 적용할 수 있습니다.




01: 객체, 클래스, 인스턴스

객체지향

객체지향이란 현실 세계의 객체 모델을 바탕으로 프로그램을 구조화하고 개발하는 프로그래밍 기법을 말합니다. 전통적인 프로그래밍 언어는 크게 객체지향 프로그래밍 언어(Object-Oriented Programming Language)와 절차지향 프로그래밍 언어(Procedure-Oriented Programming Language)로 구분 되었습니다.

이는 과거 프로그래밍 언어의 구조적 특징에 따른 분류이며 최근에 널리 쓰이고 있는 프로그램 언어들은 기본적으로 객체지향에 기반을 두고 있습니다. 또한 과거 세대 프로그래밍 언어 중 하나인 LISP에 적용되었던 함수형 언어(Functional Programming Language)의 개념이 보편적으로 확대되고 있으며 자바의 경우에도 JDK8 에서 부터 이러한 최신 경향을 반영하기 시작했습니다.

객체(Object)

객체는 영어로 Object 가 됩니다. 사전적인 의미로는 오감을 통해 알수 있는 물건, 물체가 됩니다. 즉, 우리눈에 보이는 모든 것들이 객체 입니다.

일반적으로 객체는 해당 객체가 가지고 있는 속성과 객체가 할 수 있는 동작으로 설명할 수 있습니다.

# 속성
- 색상: 빨간색
- 제조사: 현대
- 모델명: 소나타
- 출력: 180 마력
- 타이어: 17인치
...

# 동작
- 시동: 엔진을 동작 시킴
- 전진: 차를 앞으로 움직이게 함
- 후진: 차를 뒤로 움직이게 함
- 브레이크: 속도를 감소 시킴
...

이처럼 객체는 실제 우리눈에 보이는 대상이며 구체적인 값을 가지고 있습니다. 그런데 앞에서 정의한 빨간색 소나타 뿐만 아니고 파란색 소나타도 있고 검은색 제네시스도 있고 흰색 BMW 도 있습니다. 즉 공통적인 성질을 가지고 있지만 구체적인 값들이 다른 여러 객체가 있을 수 있기 때문에 공통적인 속성과 동작을 가지는 상위 개념을 정의할 수 있는데 그것이 바로 클래스 입니다.

클래스(Class)

클래스는 객체를 정의하기 위한 틀로써 표현하고자 하는 객체들의 속성과 동작을 정의하고 있습니다. 앞의 소나타 예에서 소나타는 Car 라고 하는 클래스로 정의할 수 있는 것입니다.

실제 프로그램 안에서 속성은 필드(멤버변수)의 형태로 동작은 메서드의 형태로 표현되게 됩니다. 이해를 돕기위해 구조를 조금 단순화해서 자동차 클래스를 구현하면 다음과 같습니다.

class Car {
    String color;
    String model;
    int power;

    public void go() {
    }

    public void break() {
    }
}

이제 클래스를 통해 여러 객체를 생성할 수 있는데 클래스를 통해 생성된 객체를 인스턴스(Instance) 라고 합니다.

인스턴스(Instance)

인스턴스는 클래스를 통해 만들어진 구체적인 객체라고 볼 수 있습니다. 앞에서 만든 Car 클래스를 통해 다음과 같이 여러 자동차 인스턴스를 만들 수 있습니다. 이때 new 연산자가 사용되며 클래스의 생성자 메서드를 통해 객체를 초기화 하게 됩니다.

기본 생성자는 생략이 가능하며 필요에 따라 인자가 있는 생성자를 만들 수 있습니다.

Car sonata = new Car();
Car grandeur = new Car('그랜저','red',180);

sonata.go();
grandeur.break();
...
» 실습: 클래스와 인스턴스 종합 실습 예제

실습개요

자동차 게임에 사용될 Car 클래스를 정의하고 서로 다른 값을 가지는 여러 자동차 인스턴스를 생성

먼저 자동차 클래스를 앞에서의 예를 사용해 다음과 같이 구현 합니다.

소스코드

다음은 CarGame 클래스를 만들어 여러 자동차를 생성해 봅니다.

소스코드

실행결과

Accelerate Hyundai Sonata, Current Speed 10
Accelerate BMW 520, Current Speed 20

02: 상속과 오버라이딩

앞에서 Car 클래스를 통해 서로 다른 두 모델의 자동차 인스턴스를 생성 했습니다. 자동차를 앞으로 움직이는 go() 메서드는 차량의 마력에 따라 증가 속도를 다르게 해서 차이를 두었습니다.

사실 자동차라는 기본적인 개념은 동일하지만 실제 존재 하는 자동차는 성격이 다른 여러 종류가 존재 합니다. 예를들어 버스, 트럭, 세단, SUV, 스포츠카 등으로 구분할 수 있습니다.

버스와 세단은 모두 자동차 이지만 크기나, 탑승정원, 엔진등에서 많은 차이가 있습니다. 스포츠카의 경우 문이 2개인 경우가 많고 차체가 낮으며 속도가 빠릅니다. SUV는 4륜구동이며 오프로드를 달리기 위한 기능드이 추가되어 있습니다.

이처럼 서로 다른 자동차의 성격을 Car 라고 하는 클래스에 모두 담는 것은 거의 불가능 합니다. 엄밀히 말하면 Car 는 매우 추상적인 개념이고 세단이나 스포츠카는 좀 더 구체적인 자동차의 성격을 규정하고 있습니다.

상속(Inheritance)

상속은 바로 클래스들 간의 상하 관계로 추상적인 슈퍼클래스(Super Class) 혹은 부모 클래스로 부터 서브클래스(Sub Class) 혹은 자식 클래스로 상속이라는 관계를 통해 계층구조를 형성하게 합니다.

클래스 상속의 특징은 다음과 같습니다.