자바 메소드 오버라이딩 | 자바 입문강좌 27

자바 메소드 오버라이딩

메소드 오버라이딩 (method overriding)이라는 이름을 처음 들으면 당황부터 하게됩니다. 둘다 중학교 영어 수준에서는 나오지 않는 영단어입니다.

용어부터 설명하고 자세히 알아보겠습니다.

메소드(method) : 메소드는 함수의 일종입니다. 클래스의 함수를 메소드라고 하는데 일반 함수와 다른 점은 메소드는 해당 클래스의 인스턴스에서만 호출될 수 있다는 점입니다. (Static 제외)

또 하나는 클래스를 선언하면 가상메소드 테이블에 메소드의 주소를 저장한다는 점입니다. 가상 메소드 테이블이 있기 때문에 다형성을 사용할 수 있습니다.

오버라이딩(overriding) : 오버라이딩은 기존의 메소드를 갈아엎는 것을 의미합니다. 기존의 메소드란 base 의 메소드입니다. 오버라이딩은 조건이 있는데 반환형, 메소드 이름, 매개변수 개수, 매개변수 자료형이 같아야 합니다. 즉 똑같은 함수형이어야 합니다.

오버라이딩 예제

다음은 오버라이딩 예제입니다. 애노테이션 표시 @Overrride 는 컴파일러에게 오버라이딩이라는 것을 적극적으로 알립니다. 오버로딩에 혼동할 수 있기 때문에 표시해주는게 좋습니다.

그리고 보통은 인텔리제이나 이클립스에 오버라이딩 함수를 생성하는 기능이 있습니다. 직접 타이핑해도 좋지만 어차피 오버라이딩은 내용이 중요하므로 편집툴의 기능을 충분히 활용하는게 시간을 절약합니다.

package com.kay;

public class Main {

    public static void main(String[] args) {

        baseClass bc1 = new baseClass(101, "describing baseClass");
        bc1.generateMsg("generating base1");

        System.out.println("------------------------------------------");
        subClass sc1 = new subClass(201, "describing subClass",
                "subText");
        sc1.generateMsg("generating subClass 1");
    }
}
class baseClass{
    private int id;
    private String description;

    public baseClass() {
        id = 100;
        description = "base one";
    }
    public baseClass(int id, String description) {
        this.id = id;
        this.description = description;
    }
    public void generateMsg(String text){
        System.out.println("text = " + text);
        System.out.println("description = " + description);
    }
}

class subClass extends baseClass{
    private String subText;

    public subClass(){
        super();
    }
    public subClass(int id, String description, String subText) {
        super(id, description);
        this.subText = subText;
    }

    @Override
    public void generateMsg(String text) {
        super.generateMsg(text);
        System.out.println("subText = " + subText);
        System.out.println("Override base method");
    }
}
text = generating base1
description = describing baseClass
------------------------------------------
text = generating subClass 1
description = describing subClass
subText = subText
Override base method

OOP 프로그래밍의 경우 위에서 부터 끝까지 순차적으로 읽어도 별로 도움이 되지 않습니다.

머리속에 상속관계에 대한 이미지를 가지고 있는게 좋은데요. 그 이미지에 따라 머리를 굴려서 코드를 작성합니다. 처음에는 지엽적인 사실이나 문법에 집착하지만 시간이 갈수록 중요해지는 것은 객체간의 관계를 설계하는 것 입니다.

거듭 강조하지만 상속관계에서 중요한 것은 base 클래스가 확장한 sub 클래스와 서로간의 관계입니다.

오버라이딩을 예를 들면 하나의 base 애 sub 클래스가 100개 있다고 생각해봅니다. 100개는 여러가지 목적으로 base 를 확장한 sub 일 것입니다.

상속받은 객체? 라는 것은 좀 거창하니까 똑같은 객체에 100가지 특수옵션을 준다고 생각해도 됩니다. 자동차를 계약하는데 자동문을 선택했다고 합시다. 문을 여는 행위(메소드)는 자동차라면 똑같겠지만 동작은 분명 다를 겁니다.

자동문은 버튼을 누르면 전동으로 열리는 동작이 들어가고, 일반문은 손으로 손잡이를 당겨 여는 동작이 들어갑니다. 혹은 옆으로 열리는 슬라이드 도어도 있겠죠. 문을 연다는 추상적 개념(abstraction) 은 같지만 구체적 동작에 있어 차이를 보입니다. 이런 이유로 자바에서는 abstract 클래스도 지원합니다.

최상의 개념을 정의하는데는 세부적인 동작은 필요없다는 것이죠.

일상에서도 이런 개념이 많습니다. 걷는다, 달린다, 먹는다 같은 동사는 최상의 개념을 가지고 있습니다. (최상위 개념이란 거기서 부터 시작하는 아이디어를 뜻합니다)

OOP는 이런 식으로 설계의 가닥을 잡는데 처음부터 수학식이나 알고리즘을 뽑아놓고 시작하지 않습니다. 그렇기 때문에 어려운 것 입니다. 차라리 문법이나 알고리즘이 확실하면 그것만 보면 될텐데 OOP 는 매우 방대한 아이디어를 가지고 있어서 설명이 어렵습니다. 좀 현명한 교재에서는 OOP를 애써 전부 설명하지 않습니다. 그럴 수 없다는 것을 알기 때문이죠.

어쩌면 지금 프로그래밍계에 필요한 것은 OOP라는 한정된 틀에 프로그래머를 묶어놓는게 아니라 좀 더 인간 중심적인 생각으로 돌아가는게 중요하지 않겠나 라는 생각을 합니다. 작년 오큘러스2 출시 이후 VR 기기의 보급이 늘고 있습니다. 인간은 원래 키보드에 타이핑 하는 일에 적합하지 않았습니다. VR기기의 콜트롤러 처럼 사람들은 두 팔과 손을 자유롭게 사용하길 원합니다. 아니 몸 전체를 자유롭게 쓰길 원하죠.

VR시장의 흥행과 더불어 프로그래밍 인터페이스도 빠르게 진화할 것으로 예상할 수 있습니다. 아니 프로그래밍의 개념이 진화하는게 아니라 사람들이 프로그래밍을 짜는 방법이 바뀔겁니다. 그리고 예상적으로 보면 프로그래밍은 파이썬 보다 더 쉬워질 것 입니다.

IT다 뭐다 말이 많지만 코딩 자체를 잘해서 성공한 사람은 거의 없습니다. 코딩을 잘하냐 못하냐가 아니라 아이디어를 가진 사람들이 성공하죠. 코딩에 포커스를 맞추는 시대는 지나고 있습니다.

꼭 창업자나 프리랜서 아키텍트가 아니더라도 근 시일내에 일반 프로그래머들에게 더 높은 덕목과 실력을 요구할 것이 예상됩니다.

요약

자바 메소드 오버라이드에 대해 알아봤습니다. 내용 자체는 간단하지만 그 안에 들어있는 아이디어는 깊기 때문에 약간 관련된 아이디어를 기록해봤습니다.

외부참고문서

Method Overriding in Java – javatpoint

자바 메소드 오버라이딩 – GeeksforGeeks

자바 메소드 오버라이딩 예제 (beginnersbook.com)

자바 메소드 오버라이딩 (tistory.com)

Leave a Comment