자바를 사용하다 보면은 오버로딩과 오버라이딩을 자주 쓰이게 된다.
나도 강의에서 오버로딩과 오버라이딩에 대한 설명을 들었지만 간단하게만 기억하고 이에 대한 자세한 내용을 설명하라고 하면 과연 내가 이걸 자세히 설명할 수 있을까?라는 의문점이 든다.
우선 내가 알고 있는 오버로딩과 오버라이딩은 아래와 같다.
오버로딩(overloading)은 이름은 같지만 매개변수의 타입, 순서, 개수가 다르게 해서 방지하는 방법이고
오버라이딩(overriding)은 부모(상위) 클래스의 메서드의 동작 방법을 재정의하여 우선적으로 사용하는 것으로 알고 있었다.
ex) ToString 재정의
오버로딩을 정의하자면 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
오버로딩의 조건
1. 한 클래스 내에서 메서드 명이 동일해야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
(리턴 타입은 오버로딩을 구현하는데 아무런 영향을 주지 않는다.)
Class overloading{
//메소드명 tinum(매개변수 한개) 기준
void tinum(int a){
System.out.println(a);
}
//메소드명 tinum(매개변수 개수 변경) 기준
void tinum(int a, int b){
System.out.println(a + b);
}
//메소드명 tinum(매개변수 타입변경) 기준
void tinum(String a){
System.out.println(a);
}
//메소드명 tinum(매개변수 타입 or 개수 변경) 기준
void tinum(String a, String b){
System.out.println(a + b);
}
오버 로딩의 장점
1. 코드 가독성 향상
2. 유지보수 용이
3. 유연성 증가
4. 컴파일 타임에 결정됨
오버라이딩을 정의하자면 상속 관계에 있는 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 같은 시그니쳐를 갖는 메서드로 다시 정의하는 것이다.
자바에서 자식클래스는 부모 클래스의 private멤버를 제외한 모든 메서드를 상속받는데, 상속받은 메서드는 그대로 사용 가능하지만 다른 필요한 동작을 위해서 재정의 하여 사용할 필요가 생긴다.
오버라이딩의 조건
1. 오브라이딩 하고자 하는 메서드가 상위 클래스에 존재해야 한다.
2. 메서드 이름이 같아야 한다.
3. 메서드 파라미터 개수, 파라미터의 자료형이 같아야 한다.
4. 메서드 리턴형이 같아야 한다.
5. 상위 메서드와 동일하거나 내용이 추가되어야 한다.
class Animal { //부모(상위) 클래스
public void sound() { // 기본 동작을 정의
System.out.println("동물이 소리를 낸다");
}
}
class Dog extends Animal { // 자식클래스
@Override //오버라이딩
public void sound() { //부모클래스의 sound "멍멍!"으로 재정의
System.out.println("멍멍!");
}
}
오버라이딩의 장점
1. 다형성 구현
2. 유연한 기능 확장
3. 코드 재사용성
4. 런타임에 동작 결정
결론
우리가 오버로딩과 오버라이딩을 사용하는 가장 큰 이유!
오버로딩은 같은 기능을 다양한 입력에 맞춰 유연하게 처리하고 싶을 때 좋다.
오버라이딩은 상속받은 기능을 자식 클래스에 맞게 재정의해서 동적 다형성을 구현할 수 있기 때문이다.
'오늘의 주제' 카테고리의 다른 글
SQL 명령문의 실행 순서 과정 (1) | 2025.04.28 |
---|---|
인터페이스를 사용하는 이유는 무엇일까? (2) | 2025.04.21 |
GC(가비지 컬렉션)이란 무엇일까? (1) | 2025.04.20 |
자바의 주요 특징은 무엇인가? (1) | 2025.04.17 |
JVM이란 것은 무엇인가? (1) | 2025.04.16 |