오버라이딩, 오버로딩 (Overriding, Overloading)

문상우·2023년 8월 3일

Java 핵심 개념

목록 보기
4/5
post-thumbnail

오버라이딩(Overriding)이란 ?

오버라이딩은 함수를 재정의 하기 위해 사용한다. 아래는 오버라이딩의 성립 조건이다.

  • 부모 클래스와 자식 클래스 사이에만 성립함
  • static 메소드는 클래스에 속하는 메소드이기 때문에 상속 불가
  • 접근 제한자가 private 으로 정의된 메소드는 상속 자체가 안 됨 (같은 클래스 내에서만 접근 가능)
  • interface 를 구현해서 메소드를 오버라이딩 할 때는 반드시 접근 제한자를 public 으로 해야 함
  • 메소드의 인자의 갯수와 타입이 완전히 일치해야 하고, 리턴 타입도 같아야 함. 인자의 이름은 상관없음
  • 부모 클래스의 메소드의 접근 제한자보다 좁아질 수 없지만 확장될 수는 있음
  • 부모 클래스의 메소드보다 더 많은 예외를 던질 수 없음
  • final 예약어가 지정된 메소드는 오버라이딩 할 수 없음
public interface A_Interface {

    public String run();
}

public class A_Implementation implements A_Interface {

	public String run() {
		return "run a_inplementation";
	}
}

A_Interface를 구현하는 A_Implementation에서 부모와 같은 이름인 run 메서드를 오버라이딩 하여 구현한 클래스이다.


public class Main {
    public static void main(String[] args) {
		Overriding instance = new Implementation();
			
		System.out.println(instance.run());
		// run Implementation
    }
}

Overriding 클래스 타입의 변수에 Implementation 클래스의 인스턴스를 넣음으로 결과는 Implementation에서 오버라이딩을 통해 재정의한 메서드의 결과를 얻을 수 있다.


오버로딩(Overloading)이란?

오버로딩은 함수를 다중정의 하기 위해서 사용한다. 아래는 오버로딩의 성립 조건이다.

  • 파라미터의 타입이나 갯수가 달라야 함
  • 파라미터의 이름은 오버로딩의 성립에 영향을 주지 않음
  • 리턴 타입은 오버로딩 성립에 영향을 주지 않음
public class Overloading {
    private String var_1;
    private String var_2;
    
    public Overloading() {
    }

    public Overloading(String var1) {
        this.var_1 = var1;
    }

    public Overloading(String var_1, String var_2) {
        this.var_1 = var_1;
        this.var_2 = var_2;
    }

	public String getVar_1() {
        return var_1;
    }

    public String getVar_2() {
        return var_2;
    }
}

Overloading 클래스에서는 같은 이름의 생성자를 여러개 만들었다.


public class Main {
    public static void main(String[] args) {
		Overloading instance;

        instance = new Overloading();
        System.out.println("var_1 = " + instance.getVar_1() + ", var_2 = " + instance.getVar_2());

        instance = new Overloading("오버로딩");
        System.out.println("var_1 = " + instance.getVar_1() + ", var_2 = " + instance.getVar_2());

        instance = new Overloading("오버로딩", "사용");
        System.out.println("var_1 = " + instance.getVar_1() + ", var_2 = " + instance.getVar_2());
    }
}

위는 Overloading을 이용해 같은 생성자 호출이지만, 인자를 다르게 해서 생성했을 때의 차이점을 보여주는 코드이다. 똑같은 행위로 new 연산자를 사용해 Overloading 클래스의 인스턴스를 생성하지만, 어떤 생성자를 통해 인스턴스를 생성했냐에 따라 다른 결과를 보여주는 것을 알 수 있다.


오버로딩은 생성자 함수에서 많이 사용되고, 확장성있는 설계가 가능해진다.


결론

  • 하나의 클래스 내에서 같은 이름으로 된 여러 메서드를 정의하는 것은 오버로딩이고,
  • 다른 클래스를 상속, 구현해 같은 이름으로 된 메서드를 재정의하는 것은 오버라이딩이다.

[참고]

Java 중요 개념 5가지
https://bytheprogramer-fortheprogramer.tistory.com/6

profile
성실하게 도전하고 기록하며 성장하자

0개의 댓글