Published 2022. 8. 3. 15:52
반응형

여러분 전 내용에서 상속을 하면 부모 클래스의 메서드 즉 기능을 물려받아 사용할 수

있다고 했는데 만약에 부모 클래스에 구현된 메서드의 기능 그대로만 사용해야 한다면

아마 그냥 다시만드는게 낫겠다 라는 생각이 들 겁니다 

 

그래서 나온 기능이 오버라이딩 입니다 

 

전 내용을 살펴보자 Calculator 클래스를 상속받아 내가 사용하고자 하는 메서드를 추가했는데

이 행위는 상위 클래스에 새로운 기능 즉 메서드를 추가했던 거였는데 

이미 있는 기능 sum 메서드를 사용해야 하는데 그 동작 방법을 약간 수정해야 한다 

아 이러면 어쩌지 할 텐데 그때 사용하는 게 오버 라이딩입니다

 

class Calculator {
    int num1 = 0;
    int num2 = 0;
 
    public void setNum(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }
 
    public void sum() {
        System.out.println(this.num1 + this.num2);
    }
 
}


class EtndCalculator extends Calculator {

    public void substract() {
        System.out.println(this.num1 - this.num2);
    }
    
    public void sum() {
        //System.out.println(this.num1 + this.num2);
        
        int result = this.num1 + this.num2;
        
        System.out.println(result);
    }
    
}

바뀐 부분은 sum메서드를 보면 기존 출력문을 사용하지 않고 변수에 받아 출력합니다 

뭐 같은 기능이긴 하지만 예를 들어서 만약에 우리 회사에서는 출력문을 쓸 때 변수에 담아서 

출력해야 합니다 이게 코딩 규칙입니다 기존에 구현한 건 수정하지 않아도 되니까 놔두고 

앞으로 그렇게 구현해주세요라고 했다고 치자

 

그럼 이미 있는 기능인데 새로 똑같이 만들어서 sum 메서드 내용만 바꿔서 쓰는 건 

자원낭비라고 할 수 있는 겁니다 

최대한 이미 있는걸 재사용해야 자바의 강점인 것이죠 그래서 있는 것이 바로 오버 라이딩인 것입니다

 

그런데 무턱대고 아무 때나 쓸 수 있는 것은 아닙니다 

 

오버 라이딩할 때는 기존 부모 클래스의 메서드 리턴이 같아야 합니다 

 

sum 메서드를 보면 반환 타입이 void죠 ㅎㅎ 근데 상속받은 후 아 이 값을 리턴해주고 싶다고

해서 리턴을 해주면 에러가 납니다 ㅎㅎ 이 뿐만 아니라 

 

메서드 이름도 같아야 하고 매개변수와 타입이 같아야 합니다 ㅎㅎ 순서까지도 같아야 해요 

 

즉 오버 라이딩은 안에 기능만 바꾸고 외형은 똑같아야 하는 겁니다 

 

저는 항상 그렇게 기억하고 있어요 ㅎㅎ 아 오버 라이딩은 내용만 바꾸고 외형은 동일하게 가야 한다

 

그리고 super 키워드를 사용하면 부모 클래스를 지칭하는 것이라는 걸 알고 넘어가면 되겠습니다 

반응형

'Developer > Java' 카테고리의 다른 글

[java]추상(abstract)  (0) 2022.08.18
[java] 접근제어자  (0) 2022.08.16
[java]상속  (0) 2022.08.02
[java]생성자  (0) 2022.07.29
[java]멤버란 무엇인가(클래스, 인스턴스)  (0) 2022.07.28
복사했습니다!