반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-18 06:40
관리 메뉴

ImJay

[자바] 오버라이드 메소드 ( Override Method ) 본문

자바/기본 개념

[자바] 오버라이드 메소드 ( Override Method )

ImJay 2022. 6. 30. 22:51
반응형
 

[자바] Is A 상속

Has A 상속과 비교했을 때 Is A 상속은 부모가 자식이 요구하는 것을 완벽하게 갖고 있진 않다는 것이다. Is A 상속은 한 캡슐이 내가 만들고자 하는 캡슐에서 필요한 부분들이 상당 부분 있을 때,

develop247.tistory.com

앞서 한 이야기에서 우리가 해결하지 못한 문제가 있다.

 

Is A 상속을 통해 기존에 있던 객체에 우리가 원하는 변수를 추가하여 새로운 객체를 완성했는데,

 

기존 객체의 메소드에서는 우리가 새롭게 추가한 변수에 대한 고려가 되어있지 않다는 점이다.

 

우리는 이 문제를 어떻게 해결할 수 있을까?

 

우선 어떤 식으로 메모리가 우선 할당되는지 이해가 필요하다.

 

우리는 기존 객체 Parent 와 Parent 를 Is A 상속하는 Child 객체를 갖고 있다.

 

Program 객체(Main 객체) 에서 Child 객체를 생성하면, Child 객체는 객체를 두개 만들어야 한다.

 

첫번째로는 기존 객체가 갖고 있던 부분들을 생성하는 메모리를 가져야한다.

 

이 때, 이 상속 받은 기존 객체들로 할당된 부분을 super로 지정할 수 있다.

 

두번째로는 상속 받은 객체에 추가로 내가 추가한 부분들이다.

 

전체를 통틀어 this로 사용할 수 있고, 부모만 따로 super로 사용할 수 있다.

 

자, 그럼 다시 원래 우리의 문제로 되돌아가보자.

public class Program {
    public static void main(String[] args) {
        Child A = new Child();
        
        A.setX(10);
        
        System.out.println(A.print());
    }
}

우리가 호출한 print 메소드는 A 의 print 메소드, 즉 자식의 print 메소드이다. 

 

그렇다면, 우리가 자식의 print 메소드를 선언하지 않았는데, 어떤 메소드가 사용되는 것일까?

 

바로 부모 Parent 의 print 메소드가 사용되고 있다.

 

즉, 우리는 child 의 print 메소드를 따로 선언해주지 않았기 때문에 parent 의 print 메소드를 사용 중인 것이다.

 

따라서, 우선순위는 Child -> Parent 순으로, Child 에서 호출된 메소드가 존재하지 않으면, 상속받은 Parent 의 메소드를 자동으로 사용하는 것이다.

 

Child 에서 호출된 메소드가 따로 선언되어 있다면, Parent 의 메소드를 거치치 않고 Child 의 메소드를 호출하는 것으로 끝이난다.

 

이 기존의 Parent 메소드를 새롭게 재정의한 Child 의 메소드를 오버라이드 메소드 ( Override Method ) 라고 한다.

 

문제를 해결하기 위해 print 메소드의 오버라이드 메소드를 작성해보자.

 

import Parent;

public class Child extends Parent {
	
    private int x;
    
    public int getX() {
        return x;
    }
    
    public void setX(int x) {
        this.x = x;
    }
    
    @Override
    public void print() {
    	super.print();
    	System.out.println(x);
    }
}

Parent에서 정의한 메소드와 같은 형태로 메소드를 선언해준다.

 

이게 바로 오버라이딩 메소드이다.

 

Child 에서 print() 메소드를 호출하면 Parent의 print() 메소드보다 Child 의 print() 메소드가 우선순위이기 때문에, 우리가 원하는 결과가 출력된다.

 

또, 매개변수와 반환 자료형을 같게 해줘야하는 이유는 그 차이에 따라 다른 함수가 되기 때문이다.

 

우리는 기존에 상속받은 print 메소드에 새롭게 추가한 변수를 함께 출력하는 print 메소드를 만들고 싶기 때문에,

 

super.print() 를 통해 Parent 의 print 메소드를 사용해주고, 우리가 원하는 기능을 추가해주면 된다.

 

이게 기존의 기능을 사용하면서 새롭게 기능을 추가할 수 있는 방법, 오버라이드 메소드이다.

 

 

 

반응형
Comments