매개변수의 타입, 개수, 순서를 다르게 하여 같은 이름의 생성자를 여러개 정의하는 것
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
데이터가 제공되거나 model
과 color
가 제공될 경우에도 Car
객체를 생성할 수 있어야 한다.
생성자가 하나밖에 없다면 이런 요구조건을 수용할 수 없으므로 자바에서는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 사용한다.
메소드 재정의라고 부르고, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것을 말한다.
❗️ 접근 제한을 더 강하게 재정의할 수 없다는 것은 부모 메소드가 public 접근 제한을 가지고 있을 경우, 재정의하는 자식 메소드는 default나 private접근 제한으로 수정할 수 없다는 뜻이다.
단, 반대는 가능
메소드가 재정의 되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출된다.
❗️ 자식 클래스에서 부모 클래스의 메소드를 재정의하면, 부모 클래스의 메소드는 숨겨지고 재정의된 자식 메소드만 사용된다. 그러나 _**자식 클래스
내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황_이 발생한다면 명시적으로 super.부모메소드();
키워드를 사용하여 부모 메소드를 호출**할 수 있다.
public class Calculator {
double areaCircle(double r) {
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
}
}
public class Computer extends Calculator {
@Override
double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r; // => 정밀한 계산을 위해 재정의
}
}
✔️Calculator
의 areaCircle()
메소드는 파이의 값을 3.14159
로 계산하였지만, 좀 더 정밀한 계산을 위해 Computer의 areaCircle() 메소드는 Math.PI 상수를 이용한다.
✔️Math는 수학 계산과 관련된 필드와 메소드를 가지고 있는 클래스로, 자바 표준 API이다.
✔️@Override 어노테이션은 생략할 수 있지만, 붙여주면 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄일 수 있다.
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
부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계되어 있다면 가장 이상적이겠지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수 있다.
이런 경우를 위해 상송된 일부 메소드는 자식 클래스에서 다시 수정해서 사용할 수 있어야 한다. 이 기능을 메소드 재정의(오버라이딩)이라고 한다.
👀참고자료 : <혼공자> 책