1. 오버로딩(Overloading)
- 오버로딩의 정의
오버로딩은 사전적으로는 '과적하다'라는 뜻이다. 하나의 메소드 이름으로 여러 기능을 구현하기 때문이다.
자바에서의 정의는 한 클래스 내에서 같은 이름의 메서드나 연산자를 서로 다른 매개변수 목록(파라미터 개수, 타입 등)을 사용하여 정의하는 것을 의미한다.
- 오버로딩의 조건
메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다. '리턴 값만' 다른 것은 오버로딩 할 수 없다. 만약 매개변수의 타입과 개수가 같고 리턴타입이 같은 경우 Java에서 기능에 관련된 영역까지 개입을 하게되므로 컴파일러가 코드를 구분하는데 문제가 생길 수 있기 때문이다.
class OverLoading {
public void print() {
System.out.println("void 파라미터 없음");
}
void print(Stirng a) {
System.out.println("void 파라미터 String");
}
String print(Integer a) {
System.out.println("String 파라미터 int");
return a.toString();
}
String print(Integer a, Integer b) {
System.out.println("String 파라미터 int 2개");
return a.toString() + b.toString();
}
}
class OverLoadingTest {
public static void main(String[] args) {
OverLoading ol = new OverLoading();
ol.print();
ol.print("Hello!");
ol.print(3);
ol.print(3, 5);
}
}
<결과>
void 파라미터 없음
void 파라미터 String
String 파라미터 int
3
String 파라미터 int, 2개
35
결국 오버로딩은 매개변수의 차이로만 구현할 수 있다.
2. 오버라이딩(Overriding)
- 오버라이딩의 정의
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는것을 오버라이딩이라고 한다. 상속받은 메소드를 자식클래스에서 상황에 맞게 변경해야 하는 경우 사용한다.
- 오버라이딩의 조건
오버라이딩은 부모 클래스의 메소드의 이름, 파라미터, 리턴타입이 모두 같아야 한다.
class Person {
void cry() {
System.out.println("흑흑");
}
}
class Child extends Person {
@Override
void cry() {
System.out.println("응애");
}
}
class Adult extends Person {
@Override
void cry() {
System.out.println("훌쩍훌쩍");
}
}
public class Overriding {
public static void main(String[] args) {
Person person = new Person();
Child child = new Child();
Adult adult = new Adult();
person.cry();
child.cry();
Adult.cry();
}
}
<결과>
흑흑
응애
훌쩍훌쩍
위 코드처럼 상속된 자식클래스의 메소드의 이름과 리턴타입, 파라미터가 모두 같지만 클래스의 용도에 따라서 결과값이 다르게 나오게 메소드를 선언할 수 있다.
- @Override의 용도
@Override는 어노테이션이라는 것으로 만약 오버라이딩 조건에 어긋나는 메소드가 있다면, 컴파일 단계에서 오류를 출력한다.
- 오버라이딩 할 때 주의할 점
- 접근 제한을 더 강하게 재정의 할 수 없다 : 부모 메소드가 public 접근 제한을 가지고 있을 경우 오버라이딩하는 자식 메소드는 default나 private 접근 제한으로 수정할 수 없다.
- 새로운 예외를 throws 할 수 없다 : 예외처리에 관련된 내용은 다음 글에서 작성하겠다.
- final 메소드는 재정의 불가하다.
'JAVA' 카테고리의 다른 글
[JAVA] 디자인패턴 - 데코레이터 패턴(Decorator Pattern)을 알아보자 (0) | 2024.12.03 |
---|---|
[JAVA] 디자인패턴 - 전략 패턴(Strategy Pattern)을 알아보자 (0) | 2024.12.02 |
[JAVA] 추상클래스와 인터페이스의 차이점? (0) | 2024.12.01 |
[JAVA] 상속, 다형성, 추상 클래스 (3) | 2024.11.26 |
[JAVA] JVM 메모리 사용 영역 (0) | 2024.11.26 |