객체지향 - 오버로딩 vs. 오버라이딩

해질녘·2023년 1월 26일
0

CS

목록 보기
1/3

개요

객체지향 프로그래밍에 있어 주요 용어인 오버로딩과 오버라이딩의 차이점에 대해 다룬다.

왜 헷갈리는가?

사실 이름이 비슷하다는 것 빼고는 헷갈릴 이유가 별로 없다. 개념이 명확하게 다르고, 그리고 실제 코딩할 때 많이 쓰는 기법이기 때문이다.

이 두 개념은 모두 객체지향의 특징인 다형성을 나타내는 개념이다. 다형성이란, 하나의 메소드나 클래스가 다양한 방법으로 동작하는 것을 뜻한다.

오버로딩

연산자 오버로딩을 생각하면 쉽다.

함수 재정의를 이용하여 같은 이름을 가진 함수를 여러개 만든다. 이 함수들은 주로 return형, 매개변수 타입, 매개변수 개수 등의 차이가 존재한다.

    class Bar {
        public void foo (int a) {
            // write code here
        }
    
        public void foo (int a, int b) {
            // write code here
        }
    
        public void foo (String a) {
            // write code here
        }
    }

foo 함수들은 매개변수 타입과 매개변수 개수가 다르게 구성되어있다. 호출 시점에 셋 중에 어떤 foo를 호출하는지는 컴파일 시점에 처리된다. 따라서 정적이다.

오버라이딩

오버라이딩이라는 개념은 주로 메소드 오버라이딩을 칭한다. 메소드 오버라이딩은 다음과 같은 개념이다.

상위 클래스로부터 상속받은 메소드를 하위 클래스가 재정의하는 것.

예시 코드는 다음과 같다.

    class Human {
        public void 자기소개 () {
            System.out.println("저는 사람입니다.");
        }
    
        class NewHuman {
            @Override
            public void 자기소개 () {
                System.out.println("저는 신인류 뉴타입 사람입니다.");
            }
        }
    }

위의 코드를 보면 Human 이라는 상위 클래스 아래에 NewHuman이라는 하위 클래스가 존재한다.

호출 시에는 다음과 같다.

    public class Main {
        public static void main(String[] args) {
            NewHuman newhuman = new NewHuman();
            newhuman.자기소개();
        }
    }

위의 호출 결과는 저는 신인류 뉴타입 사람입니다. 이다.

덮어쓰기 개념이라서 오버라이딩이다.

위 코드에 존재하는 @Override는 뭘까? 이는 자바 어노테이션Annotation으로 함수가 오버라이딩 되었다는 것을 컴파일러에 전달한다.

@Override를 제거하여도 코드 실행에는 문제가 없다. 하지만 이것을 추가하면 코드를 작성할 때에 있어 실수를 방지할 수 있다는 장점이 있다. 컴파일 시에 오버라이딩 대상 함수가 없으면 오류가 나는 식이다. 또, 코드 작성 시 오버라이딩된 함수라고 명확하게 알 수 있다. (가독성!)

profile
해질녘 | 백엔드 공부 중

0개의 댓글