[자바/JAVA] 오버로딩 vs 오버라이딩?

이나영·2022년 2월 11일
0

Basic CS - Java

목록 보기
1/2
post-thumbnail

오버로딩과 오버라이딩의 차이는?


🔰오버로딩(Overloading)

매개변수의 타입, 개수, 순서를 다르게 하여 같은 이름의 생성자를 여러개 정의하는 것


✍️생성자 오버로딩 소스코드 Car.java

public class Car {
	// 필드
    String company = "현대자동차";
    String model;
    String color;
    int maxSpeed;
    
    // 생성자
    Car() { }  // => 기본 생성자
    
    Car(String model) {  // 생성자2
    	this.model = model;
    }
    
    Car(String model, String color) {  // 생성자3
    	this.model = model;
        this.color = color;
    }
    
    Car(String model, String color, int maxSpeed) {  // 생성자4
    	this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

❓왜 오버로딩이 필요할까?

외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양화될 필요가 있다.
Car 객체를 생성할 때 외부에서 제공되는 데이터가 없다면 기본 생성자로 Car 객체를 생성해야 하고, 외부에서 model 데이터가 제공되거나 modelcolor가 제공될 경우에도 Car 객체를 생성할 수 있어야 한다.

생성자가 하나밖에 없다면 이런 요구조건을 수용할 수 없으므로 자바에서는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 사용한다.



🔰오버라이딩(Overriding)

메소드 재정의라고 부르고, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것을 말한다.


메소드 재정의 방법

  • 부모의 메소드와 동일한 시그너처(리턴타입, 메소드 이름, 매겨변수 목록)을 가진다.
  • 접근 제한을 더 강하게 재정의할 수 없다.
    ❗️ 접근 제한을 더 강하게 재정의할 수 없다는 것은 부모 메소드가 public 접근 제한을 가지고 있을 경우, 재정의하는 자식 메소드는 default나 private접근 제한으로 수정할 수 없다는 뜻이다.
    단, 반대는 가능
  • 새로운 예외(Exception)를 throw할 수 없다.

메소드가 재정의 되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출된다.


부모 메소드 호출 시

❗️ 자식 클래스에서 부모 클래스의 메소드를 재정의하면, 부모 클래스의 메소드는 숨겨지고 재정의된 자식 메소드만 사용된다. 그러나 _**자식 클래스

내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황_이 발생한다면 명시적으로 super.부모메소드(); 키워드를 사용하여 부모 메소드를 호출**할 수 있다.


✍️부모클래스 소스코드 Calculator.java

public class Calculator {
	double areaCircle(double r) {
    	System.out.println("Calculator 객체의 areaCircle() 실행");
        return 3.14159 * r * r;
    }
}

✍️자식클래스 소스코드 Computer.java

public class Computer extends Calculator {
	@Override
	double areaCircle(double r) {
    	System.out.println("Computer 객체의 areaCircle() 실행");
        return Math.PI * r * r;  // => 정밀한 계산을 위해 재정의
    }
}

✔️CalculatorareaCircle()메소드는 파이의 값을 3.14159로 계산하였지만, 좀 더 정밀한 계산을 위해 Computer의 areaCircle() 메소드는 Math.PI 상수를 이용한다.
✔️Math는 수학 계산과 관련된 필드와 메소드를 가지고 있는 클래스로, 자바 표준 API이다.
✔️@Override 어노테이션은 생략할 수 있지만, 붙여주면 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄일 수 있다.


✍️메소드 재정의 테스트 소스코드 ComputerExample.java

public class ComputerExample {
	public static void main(String[] args) {
    	int r = 10;
        
        Calculator calculator = new Calculator();
        System.out.println("원 면적 : " + calculator.areaCircle(r));
        System.out.println();
        
        Computer computer = new Computer();
        System.out.println("원 면적 : " + computer.areaCircle(r));
    }
}

👉실행결과

Calculator 객체의 areaCircle() 실행
원 면적 : 314.159

Computer 객체의 areaCircle() 실행
원 면적 : 314.1592653589793

❓왜 오버라이딩이 필요할까?

부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계되어 있다면 가장 이상적이겠지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수 있다.

이런 경우를 위해 상송된 일부 메소드는 자식 클래스에서 다시 수정해서 사용할 수 있어야 한다. 이 기능을 메소드 재정의(오버라이딩)이라고 한다.



👀참고자료 : <혼공자> 책

profile
소통하는 백엔드 개발자로 성장하기

0개의 댓글