@Override

Juju·2022년 9월 19일
0
post-thumbnail

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

상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의하는 것을 말한다. 메소드가 오버라이딩 되었다면 부모 객체의 메소드는 숨겨지기 때문에,
자식객체에서 메소드를 호출하면 오버라이딩 된 자식 메소드가 호출 된다.

메소드 오버라이딩할 때는 다음과 같은 규칙에중의해서 작성해야 한다.
1. 부모의 메소드와 동일한 시그니처(리턴타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다.
2. 접근 제한을 더 강하게 오버라이딩 할 수 없다.
3. 새로운 예외(Exception)를 throws 할 수 없다.(예외는 10장에서)

접근 제한을 더 강하게 오버라이딩 할 수 없다는 것은 부모 메소드가 public 접근 제한을 가지고 있을 경우 오버라이딩하는 자식 메소드는 default나 private 접근 제한으로 수정할 수 없다는 뜻

부모 메소드가 default 접근 제한을 가지면 재정의 되는 자식 메소드는 default또는 public 접근 제한을 가질 수 있다.

예제1

Calculator.java /부모클래스

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

Computer.java /자식클래스

public class Computer extends Calculator {
	@Override
    double areaCircle(double r) {
    System.out.println("Computer 객체의 areaCircle() 실행");
    return Math.PI * r * r;
    }
}

Calculator의 areaCircle() 메소드는 파이의 값을 3.14로 계산하지만, 정밀한 계산을 위해 Computer의 areaCircle()메소드는 Math.PI 상수를 이용한다. Math는 수학 계산과 관련된 필드와 메소드들을 가지고 있는 클래스로, 자바 표준 API제공한다. 2라인의 @Override 어노테이션은 생략해도 좋으나, 이것을 붙여주게 되면 areaCircle() 메소드가 정확히 오버라이딩 된 것인지 컴파일러가 체그하기 때문에 개발자의 실수를 줄여준다. 개발자가 areaCircl() 처럼 끝에 e를 빼먹게 되면 컴파일 에러가 발생한다.

ComputerExample.java 메소드 오버라이딩 테스트

public class ComputerExample {
	public static void main(String[] args) {
    int r = 10;
    
    Calcualtor calculator = new Calculator();
    System.out.println("원면적: " + calculator.areaCircle(r));
    System.out.println();
    
    Computer computer = new Computer();
    System.out.println("원면적: " + computer.areaCircle(r));
    								//재정의 된 메소드 호출			

이클립스는 부모 메소드 중 하나를 선택해서 오버라이딩 메소드를 자동 생성해주는 기능이 존재한다.
부모메소드의 시그니처를 정확히 모를 경우 매우 유용하게 사용할 수 있다.
1. 자식클래스에서 오버라이딩 메소드를 작성할 위치로 입력 커서를 옮긴다.
2. 메뉴에서 [Source -> Override/Implement Methods...] 를 선택한다.
3. 부모 클래스에서 오버라이딩 될 메소드를 선택하고 [OK] 버튼을 누른다.

profile
짤막한 기록들..

0개의 댓글