JAVA

[JAVA] 오버라이딩 & 오버로딩 (Overriding & Overloading)

sagecode 2024. 12. 1. 18:25

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는 어노테이션이라는 것으로 만약 오버라이딩 조건에 어긋나는 메소드가 있다면, 컴파일 단계에서 오류를 출력한다.

  • 오버라이딩 할 때 주의할 점
    1. 접근 제한을 더 강하게 재정의 할 수 없다 : 부모 메소드가 public 접근 제한을 가지고 있을 경우 오버라이딩하는 자식 메소드는 default나 private 접근 제한으로 수정할 수 없다.
    2. 새로운 예외를 throws 할 수 없다 : 예외처리에 관련된 내용은 다음 글에서 작성하겠다.
    3. final 메소드는 재정의 불가하다.