본문 바로가기
Java

[Java] 오버로딩(overloading) / 오버라이딩(overriding)

by 상후 2021. 8. 28.
728x90
반응형

 

 

 

간단하게 오버로딩(overloading)과 오버라이딩(overriding)을 정리합니다.


오버로딩 - overloading

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

 

오버로딩의 조건

  • 메서드 이름에 동일해야 한다.
  • 메서드의 매개변수 개수 또는 타입이 달라야 한다

- 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

 

// 1. 오버로딩 X - 매개변수의 개수 및 타입이 모두 일치하므로
int add(int a, int b) { return a+b; }
int add(int x, int y) { return x+y; }

// 2. 오버로딩 X - 반환타입은 오버로딩을 구현하는데 영향을 줄 수 없음
int add(int a, int b) { return a+b; }
long add(int x, int y) { return (long)(x+y); }

// 3. 오버로딩 O - 매개변수의 순서로도 메서드 구분이 가능함
int add(int a, long b) { return a+b; }
int add(long x, int y) { return x+y; }

 

자주 사용하는 println() 메서드를 생각하면 오버로딩과 오버로딩의 장점을 쉽게 이해할 수 있다.


오버라이딩 - overriding

부모 클래스로부터 상속받은 메서드의 내용을 자식 클래스(자신)의 입맛에 맞게 변경하는 것

 

오버라이딩의 조건

  • 상속 관계이다.
  • 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 반환 타입이 같아야 한다.

- JDK 1.5 부터 공변 반환 타입이 추가되어 반환타입을 자손 클래스의 타입으로 변경하는 것은 가능하다고 한다.

- 공변 반환타입 : 오버라이딩 시 부모 메서드의 반환 타입을 자식 클래스의 타입으로 변경을 허용하는 것

 

// 아래와 같이 공변 반환타입을 사용하여 불필요한 형 변환 제거가 가능 
Point copy = (Point)orginal.clone();
Point copy = orginal.clone();

 

 

 

  • 접근제어자는 부모클래스의 메서드보다 좁은 범위로 변경할 수 없다.

당연하다고 느껴졌지만, 설명을 하려고하니 명확하게 설명이 되지 않았다.

 

extends 즉, 상속은 확장의 의미이다.

그래서 자식 클래스는 부모 클래스를 상속받아 부모클래스의 멤버들을 사용할 수 있고, 자신이 필요한것을 확장하여 설계한다.

근데 부모클래스가 public인데 자식이 private으로 재정의한다는 것은 확장이 아니다.

 

부모 클래스 인스턴스에서는 public이기 때문에 어디서든 사용이 가능한 메서드인데,

자식 클래스 인스턴스에서 재정의한 메서드가 private이라 자식 클래스 내에서만 사용할 수 있다?

이는 상속(확장)의 개념과 일치하지 않다.

 

조금 더 쉽게? 생각하면

private 메서드는 당연히 오버라이딩할 수 없다. 객체지향의 규칙이라 봐야하나..ㅎ

 

이해가 안되시면 아래의 글을 참고해주세요..

https://stackoverflow.com/questions/6851612/when-overriding-a-method-why-can-i-increase-access-but-not-decrease-it

 

 

  • 부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

여기서 예외는 다양한 Exception들의 선언된 수가 아니라, 실제 예외를 던질 수 있는 수를 의미한다. 

 

class Parent {

    public Parent getMine(int a) throws IOException, SQLException {
        System.out.println("Parent Method");
        return new Parent();
    }

}

class Child extends Parent {

    // 부모 클래스의 메서드에 다양한 Exception이 많이 선언되었지만,
    // 선언된 Exception의 수는 중요하지 않다.
    // Exception은 (Object 클래스 처럼) 예외의 최고 조상이므로 가장 많은 수의 예외를 던질 수 있다.
    // 그러므로 오버라이딩을 할 수 없다. (에러 발생)
    @Override
    public Parent getMine(int a) throws Exception {
        System.out.println("Child Method");
        return new Parent();
    }

}

 

  • 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

인스턴스 메서드의 생명주기와 static 메서드의 생성시기를 생각하면 이해하기 쉽다.

각각의 클래스의 같은 이름으로 각각의 static 메서드가 존재한다면, 이는 오버라이딩이 아니라 별개의 static 메서드일 뿐이다. 

 

 

 

 

출처 : Java의 정석

 

 

 

 

728x90
반응형

댓글