오버로딩(Overloading)이란 ?
Overloding 의 사전적 의미는 '과적하다' 이다. 메서드도 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 한다. 그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름에 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있는 아주 재미있는 기능을 제공한다.
오버로딩의 조건
- 메서드 이름이 같아야 하고, 매개변수의 개수 또는 타입이 달라야 한다 !
<예시 코드>
//[ex01]
int add(int a, int b) return a + b;
int add(int x, int y) return x + y;
//[ex02]
int add(int a, int b) return a + b;
long add(int a, int b) return (long)(a + b);
//[ex03]
int add(int a, int b) return a + b;
double add(double a, double b)return a + b;
int add(int a, int b, int c) return a + b + c;
ex01) 두 메서드는 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에 오버로딩이 성립되지 않는다. 매개변수의 이름이 다르면 메서드 내에서 사용되는 변수의 이름이 달라질 뿐, 아무런 의미가 없기 때문에 두 식은 동일한 식이다.
ex02) 두 메서드는 리턴타입만 다르고 매개변수의 타입과 개수가 일치하기 때문에 오버로딩이 성립되지 않는다.
ex03) 세 메서드는 매개변수의 타입이 서로 다르고, 매개변수의 갯수가 다르기 때문에 오버로딩이 성립된다.
오버라이딩(Overriding)이란 ?
Overriding 의 사전적 의미는 '~위에 덮어쓰다' 이다. 상속 관계이 있는 조상클래스로부터 상속받은 메소드의 동작을 자식 클래스에서 재정의 하는 것을 의미한다. 오바라이딩된 메소드는 조상 클래스의 메소드와 같은 이름, 같은 매개변수를 가지고 있지만, 메소드의 구현 내용은 다를 수 있다.
오버라이딩의 조건
- 자손클래스에서 오버라이딩하는 메서드는 조상클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 한다.
<예시 코드>
public class Overriding {
static class Animal {
void sound() {
System.out.println("Animals Sound");
}
}
static class Dog extends Animal {
@Override
protected void sound() {
System.out.println("Dogs Sound");
}
}
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.sound();
}
}
위의 코드에서 Dog 클래스는 Animal 클래스의 sound() 메서드를 오버라이딩 한다. 따라서 myDog.soung() 를 통해 "Dogs Sound" 를 출력할 수 있다. 여기서 눈 여겨봐야 할 것은 @Override 와 접근제어자 이다.
@Override 이란 ?
@Override 에너테이션은 해당 메서드가 상위 클래스의 메서드를 오버라이딩 한다는 것을 컴파일러에게 명시적으로 알릴 때 사용되며 이는 컴파일러가 오버라이딩이 제대로 이루어졌는지 검증할 수 있게 해준다. 코드상으로 검사했을 때 오버라이딩이 실제로 시행되지 않았다면 컴파일 시에 오류를 출력한다. 또한 코드의 가독성을 향상 시켜 유지보수성을 향상시켜준다.
따라서 위 예제를 다시 보면 @Override 에너테이션을 통해 Dog 클래스의 sound()메서드가 Animal 클래스의 메서드를 오버라이딩하고 있음을 쉽게 알아차릴 수 있다.
이번에는 접근 제어자가 다르게 설정되어 있는것을 볼 수 있는데, 오버라이딩에서 접근 제어자를 설정하는데에는 규칙이 존재한다.
- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
만일 조상 클래스에 정의된 메서더의 접근 제어자가 protected 라면 이를 오버라이딩 하는 자식 클래스의 메서드는 접근 제어자가 protected 이거나 public 이어야 한다. - 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
만약, 자식 클래스가 Exception 을 throws 하고, 조상 클래스가 IOException , SQLException 을 throws 한다는 가정에 조상 클래스에 정의된 메서드보다 적은 개수의 예외를 선언한 것 같지만, 결국 자식 클래스가 가지고 있는 Exception 이 IOException , SQLException 을 포함하고 있기 때문에 성립이 불가능 하다. - 인스턴스메서드를 static 메서드 로 또는 그 반대로 변경할 수 없다.
조상 클래스의 정의된 statatic 메서드를 자식 클래스에서 똑같은 이름의 static 메서드로 정의가 가능하지만, 이것은 각 클래스에 별개의 static 메서드를 정의한 것일 뿐 오버라이딩이 아니다.
Overloading vs Overriding
오버로딩(Overloading) : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩(Overriding) : 상속받은 메서드의 내용을 변경하는 것
오버로딩 | 오버라이딩 | |
목적 | 같은 이름의 메소드를 다양한 매개변수로 사용 | 상속받은 메소드의 동작을 변경 |
적용 범위 | 동일한 클래스 안에서 | 상속 관계의 클래스 |
매개변수 | 매개변수의 타입, 개수 순서가 달라야 함 | 매개변수가 완전히 동일해야 함 |
결정 시점 | 컴파일 타임에 결정 | 런타임에 결정 |
'Java' 카테고리의 다른 글
[Java] 추상화(Abstract) (2) | 2024.04.28 |
---|---|
[Java] 다형성 (Polymorphism) (0) | 2024.04.26 |
[Java] 생성자(Constructor) (0) | 2024.03.31 |
[Java] Getter&Setter (0) | 2024.03.31 |
[Java] 접근 제어자(Access Modifiers) (0) | 2024.03.26 |