본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생–오버로딩과 오버라이딩

군대를 다시 가고 싶어하는 사람은 없다. 그러나 군대 한번 갔다오면 그곳의 이야기 거리는 마치 당겨도 당겨도 묶인 손수건이 계속 나오는 마술 상자와 같다. 군대에서 나는 정비쪽 업무도 종종 보곤 했다. 처음 나는 조수였다. 고참이 능숙하게 장비를 고치면 옆에서 나는 라이트~ 를 비춰주거나 공구심부름을 하곤 하였다. 사실 공구심부름은 고역이었다. 1층 작업하는 곳에서 3층 사무실까지 갔다 와야 했다. 정비작업이 필요할땐 미리 필요한 공구를 예상하여 챙겨 내려갔다. 그래도 빠진 공구가 있어 가끔 3층 계단을 힘들게 올라갈때면, 막강한 만능공구 하나만 챙겨서 쓰면 얼마나 좋을까 하며 투덜거리곤 했다.

 

맥가이버 칼은 공구를 좋아하는 남자들의 작은 로망이다. 맥가이버 칼 하나로 갖가지 공구를 쓴다. 오버로딩은 맥가이버칼의 부속품과 같다. 같은 몸통(메소드 이름)에서 꺼내는 위치만 바꾸면(인자값) 다양한 기능을 쓸 수 있다. 오버로딩은 같은 이름의 메소드에 인자값(=시그네처)를 다르게 주어 인자별로 특화된 메소드를 만들기 위한 방법이다.

 

 

내 경험으로 오버로딩은 생성자 호출에서 특히 많이 쓰인다. 처음 객체를 생성할때 오버로딩으로 구현된 다양한 생성자들의 용도를 파악하여, 써야 되는 상황에 알맞게 해당 객체를 사용한다.

 

- 생성자 오버로딩 예제-병아리 부화 클래스

public static void main( String[] args ) throws Exception {

    …..

    Chick chick1 = new Chick(); // 1

    Chick chick2 = new Chick("먹이"); // 2

    Chick chick3 = new Chick("먹이", "물"); // 3

    …...

}

 

- 생성자 오버로딩 예제-병아리 예제 클래스

public class Chick {

    public Chick() {

        System.out.println("배가 고파요");

    }

 

    pulbic Chick(String food) {

        System.out.println(food+" 맛 있어요. 근데 목이 말라요");

    }

 

    pulbic Chick(String food, String water) {

System.out.println(food+" 먹고 "+water+" 도 먹고");

    }

}

 

병아리의 생성자는 3가지가 있다. 인자값으로 해당 생성자를 찾는 오버로딩 방법으로 3가지 생성자를 만들어 냈다. 인자값이 없는 디폴트 생성자로 객체를 생성하면 배가 고파요~란 메시지를 보낸다. 인자가 하나 있는 생성자는 먹이를 인자로 넘겨준다. 먹이만 인자로 받은 병아리는 먹이는 맛있는데 목이 마르다~는 메시지를 보낸다. 인자가 둘인 생성자는 먹이와 물을 인자로 넘겨준다. 이 두 인자를 받은 병아리 생성자는 만족해 하는 메시지를 보낸다.

 

 

나는 책을 좋아하는 편이지만, 자기계발서는 피한다. 자기계발서를 읽어보면 구체적인 지침보다는 두루뭉실한 긍정의 힘을 만병통치약으로 내세운다. 그래도 내가 좋아하는 자기계발서 중 하나는 '익숙한 것과의 결별' 이라는 책이다.

 

이 책은 자신의 능력과 현실에 안주하지 말고 계속 끊임없이 변화하고 진화하는 즐거움을 얻으라고 조언한다. 제목처럼 익숙한 현실에 안주하려는 나태함을 이겨내고 계속 진화하라는 얘기다. 나는 이 책에 감명을 받아 내가 나태해질 때마다 한번씩 다짐하곤 한다. 문제는 다짐은 잘하는데 실천이 부족한 것에 있다.

 

오버라이딩은 끊임없이 진화하려는 사물의 생존본능 특성과 닮았다. 오버라이딩은 인간적이고 진취적인 사물의 생존본능 진화 특성과 닮았다. 그래서 객체지향이 기계에 가까운 기술이 아닌 인간에 가까운 철학과 같은 기술이라는 생각을 하곤 한다.

 

 

오버라이딩은 마치 진화하는 자동차 모델의 특징 변화와 같다. 예를 들어 유명한 자동차 소나타 시리즈는 소나타1에서 EF소나타, New EF소나타, NF 소나타, 그리고 현재 YF소나타로 진화하고 있다.

 

소나타 시리즈가 진화할 때마다(소나타 객체를 상속받을때는) 먼저 자동차 모델명이 조금씩 바뀐다.(자동차 모델명을 정하는 메소드가 오버라이드 된다.) 그리고 자동차의 여러 성능이라던지 가격이라던지 자동차의 모든 특징과 기능들이 그대로인 것은 그대로 상속받고 바뀌는 것은 자식 클래스에서 다시 재정의 하여 구현한다.

 

오버라이딩은 부모 객체에서 정의한 메소드를 자식 객체 고유의 입맛에 맞게 재구현하는 개념이다.

 

소나타 객체 상속 구성도, 소나타1에 기본적으로 부가 서비스 시스템을 정의하는 serviceSystem 메소드가 존재한다. 소나타1에서는 일반 소파, 구식 라디오 등이 구비되어 있다. 소나타1을 이어받은(상속받은) EF소나타는 serviceSystem 메소드를 오버라이드 했다. 인체공학적 소파, CD플레이어등의 발전된 기능을 재정의 하였다. NF소나타도 역시 상위 클래스의 serviceSystem을 재 정의 하면서 더 발전된 기능을 제공한다.

 

 

오버라이딩 개념은 객체지향의 근간을 이루는 중요한 개념이다. 폭탄이 있다면 폭탄속의 화약 성분처럼 기초가 되고 근간이 되는 중요한 개념이다. 객체지향의 장점을 누릴 수 있는 상속과 폴리모피즘, 인터페이스와 구상 클래스, 더 나아가 디자인패턴에서도 오버라이드를 기초로 프로그램을 유연하고 확장성 높게 짤수 있다.

 

부모 클래스를 상속받은 클래스들은 대부분 부모 클래스의 주기능을 오버라이드 한다. '부모 클래스'와 '상속받은 클래스'를 묶어서 '객체 그룹'이라 이름 짓는다. '객체 그룹'를 사용하는 다른 객체는 '클라이언트 객체'라고 이름 짓는다. 제대로 된 객체지향 기법을 사용한 객체 구성이라면 '클라이언트 객체'는 '객체 패밀리'의 '부모 클래스'에만 의존하고 있다.

 

이때 '클라이언트 객체'를 제어하는 '실행 클래스' 가 '클라이언트 객체'에게 '객체 패밀리'의 '상속받은 클래스' 중에 하나를 선택하여 인자값으로 넘겨준다. 이렇게 하면 유연하고 확장성 높은 전형적인 객체지향의 장점을 누릴 수 있다. 이것이 상속과 폴리모피즘 개념이다. 상속과 폴리모피즘 구현에 오버라이딩 개념이 중요하게 작용한다.

 

[상속과 폴리모피즘 개념도]

 

인터페이스와 구상 클래스, 인터페이스와 인터페이스를 구현하는 구상 클래스로 나눌때의 이로움은 상속과 폴리모피즘과 비슷하고 그 안에 여러 장점이 포함되어 있다. '인터페이스를 쓰는 클래스'를 '클라이언트 클래스'라고 정의해 보겠다. '클라이언트 클래스' 는 인터페이스에서 명시한 기능만 알고 그 구현 클래스(=구현 방법)은 전혀 모른다. '클라이언트 클래스'가 어떤 방식으로 인터페이스에 명시한 기능을 쓸 것인지는 '실행 클래스'가 결정한다.

 

덕분에 '클라이언트 클래스'는 오직 인터페이스만 의존하면서 여러 구상 클래스를 쉽게 교체 하거나 확장 할 수 있다. 그래서 유연하고 확장성 높은 개발이 가능하다. 인터페이스를 구현한 구상 클래스는 기본적으로 인터페이스에 정의한 기능을 오버라이드 하기 때문에 인터페이스와 구상 클래스에서도 오버라이딩 개념이 중요하게 작용한다.

 

디자인패턴의 가장 기본이 되는 객체 구성도는 상속과 폴리모피즘, 인터페이스와 구상 클래스 설명을 통해 그려지는 구성도와 같다. 이 객체 구성도를 바탕으로 파생된 다양한 패턴이 존재하는데 그 바탕에는 상속과 폴리모피즘, 인터페이스와 구상 클래스, 그리고 오버라이딩 개념 등이 중요하게 적용 된다 .

 

이렇게 오버라이드는 객체지향의 장점을 살려주기 위해 밑바닥에서 알게 모르게 중요하게 작동하는 개념이다.

 

덧 ) 이 객체지향의 탄생 원고는 제가 책으로 내려다가 일단 잘 안되었는데요. 이유는 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다.등 입니다. 그래도 원고를 일단 블로그에 몽땅 풀어보고 언젠가 제대로 교정해서 다시 도전할 생각입니다. 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다. 이점을 감안해서 읽고 객체지향을 이해하는데 도움이 되셨으면 좋겠습니다. 의견도 주셨으면 좋겠습니다. 원고 조금만 교정하면 괜찮을것 같은 출판사 관계자분의 피드백도 환영합니다. 특별한 일 없으면 매주 월수 발행 예정입니다.