프로그래밍/JAVA

메소드 오버로딩(overloading) vs 메소드 오버라이딩(overriding)

코딩딩 2016. 3. 30. 16:33

메소드 오버로딩(Method Overloading)

같은 이름을 가진 메소드를 여러개 정의하는 것. (메소드 이름은 같고, 매개변수의 선언이 다른 메소드를 만드는 것)

인자는 다르지만 기능은 같은 메소드들을 하나의 메소드 이름으로 접근한다는 개념.

생성자, 기타 다른 메소드에 적용가능

사용이유 : 

하나의 메소드 이름에 하나의 형채로만 메소드가 정의 된다면, 인자가 다르지만 같은 기능을 하는 메소드들을 각기 다른 이름으로 설정해야 한다. 사용자는 같은 기능의 메소드라도 인자의 형태에 따라 일일이 메소드의 이름을 기억해야한다.이러한 이유로 메소드의 이름은 그대로 사용하면서 다양한 형태의 메소드를 정의 하면, 어떠한 형태의 인자를 사용더라도 해당 기능을 맡은 메소드 이름만 기억하면 된다.


※ 오버로딩의 주의사항

메소드의 구분은 매개변수의 개수와 데이터 형에 의해서만 구분됨 -> signature

signature를 이용해서 메소드나 생성자의 다름을 구별.

반환형은 signature가 아님. 리턴타입(반환형)이 다르다고 해서 메소드가 다른 것이라고 할 수 없음.

※ 오버로딩의 조건

메소드의 이름이 같아야 한다.

매개변수의 개수 또는 타입이 달라야 한다.

매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

  (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)


위와 같이 println 메소드는 다른 인자가 입력되더라도 동일한 기능이 구현되도록 다양한 인자에 대해 오버로딩 되어있다.


확인 문제

다음 중 아래 add메서드를 잘못 오버로딩 한 것은?

long add(int a, int b) { return a+b;}


A. long add(int x, int y) { return x+y;}

B. long add(long a, long b) { return a+b;}

C. int add(byte a, byte b) { return a+b;}

D. int add(long a, int b) { return (int)(a+b);}


정답. A는 오버로딩된 것이 아니라 중복 선언된 것이다.


메소드 오버라이딩 - method overriding (메소드 재정의)

상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의 하는 것을 말한다.

부모 클래스의 모든 메소드가 자식 클래스에게 맞게 설계되어 있다면 가장 이상적인 상속이지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다. 

이경우 상속된 일부의 메소드는 자식클래스에서 다시 수정해서 사용해야 한다.

※ 메소드 오버라이딩시 주의사항

1. 상위 메소드의 이름, 인자 정의, 반환형에 대해서 완전히 같아야 한다.
2. 접근 제어는 같거나 더 커야 한다.
3. Exception의 추가가 불가능하다.
4. static, final, private 메소드는 오버라이딩 할 수 없다.


예제 : 상속에서의 메소드 오버라이딩>

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Animal {
    public void makeSound(){
        // 아직 특정한 동물이 지정되지 않았으므로 몸체는 비어있다.
    }
};
 
public class Dog extends Animal {
    public void makeSound()
    {
        System.out.println("멍멍!");
    }
};
 
cs








'프로그래밍 > JAVA' 카테고리의 다른 글

객체 지향 프로그래밍 원칙  (0) 2016.03.31
접근 제한자  (0) 2016.03.30
객체지향에서의 다형성  (0) 2016.03.30
상속 개념파악하기!  (0) 2016.03.30
정적 변수 (static variable)  (0) 2016.03.29