일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 배열
- 백준
- 페이코 초대코드
- php 프로그래밍 입문 예제
- 플러터
- php 프로그래밍
- C언어
- php 프로그래밍 입문 3판
- php 프로그래밍 입문 솔루션
- php 프로그래밍 입문 연습문제
- php 프로그래밍 입문 문제풀이
- php
- 페이코 추천인
- SWEA
- programmers
- 페이코 추천인코드
- 파이썬
- 최단 경로
- spring
- C
- php 프로그래밍 입문
- Java
- JAVA SPRING
- 한정 분기
- Flutter
- 플러터 개발환경 설정
- 자바
- 자바 스프링
- 페이코 친구코드
- 스프링
- Today
- Total
ImJay
[자바] 오버라이드 메소드 ( Override Method ) 본문
앞서 한 이야기에서 우리가 해결하지 못한 문제가 있다.
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 메소드를 사용해주고, 우리가 원하는 기능을 추가해주면 된다.
이게 기존의 기능을 사용하면서 새롭게 기능을 추가할 수 있는 방법, 오버라이드 메소드이다.
'자바 > 기본 개념' 카테고리의 다른 글
[자바] 자식 클래스 객체 초기화 (0) | 2022.07.04 |
---|---|
[자바] Is A 상속 (0) | 2022.06.30 |
[자바] Has A 상속 (0) | 2022.06.30 |
[자바] 프로그램 설계 시 기본적으로 고려해야되는 것 (0) | 2022.06.30 |
[자바] Getters 와 Setters 를 사용하는 이유 (0) | 2022.06.29 |