일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java
- 새벽공부
- 백엔드
- 다형성
- 개발자
- 인터페이스
- 졸리다
- 인스턴스
- exception
- 상속
- 메서드
- 자료형
- 예외 처리
- node.js
- 자바
- ArrayList
- 파이팅
- FileInputStream
- SSR
- 코딩
- 보조 스트림
- MPA
- 배열
- 코린이
- throws
- 변수
- 바이트 단위 스트림
- try-catch
- 초보개발자
- 문자 단위 스트림
- Today
- Total
SHUSTORY
08-3 메서드 오버라이딩 본문
상위 클래스 메서드 재정의하기
08-1 상속 예제에서 VIP 고객에게 제공하는 할인율과 세일 가격을 어떻게 적용할지 구현하지 않았다.
그에 대한 코드를 구현해보도록 하자.
상위 클래스 Customer에는 제품 가격을 계산하는 정가를 그대로 지불하는 calcPrice( ) 메서드가 정의되어 있다.
VIP 고객은 정가에서 10% 할인받을 수 있도록 하려면 상위 클래스의 calcPrice( ) 메서드를 재정의해야 하는데,
이를 메서드 오바리이딩이라고 한다.
오버라이딩을 하려면 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야 한다.
만약 그렇지 않을 경우 자바 컴파일러는 재정의한 메서드를 기존 메서드와 다른 메서드로 인식한다.

하위 클래스 VIPCustomer에서 상위 클래스의 calcPrice( ) 메서드와 매개변수의 자료형 및 개수, 반환형을 동일하게 하여 원하는 조건에 맞게 재정의하였다.
상위 클래스의 메서드를 재정의할 때는 메서드 이름을 직접 작성하는 방법도 있고,
아래와 같이 코드 우클릭 - Source - Override/... 를 선택하여 원하는 메서드를 선택하여 Override 할 수도 있다.
참고로 @Override 애노테이션은 '이 메서드는 재정의된 메서드입니다.'라고 컴파일러에 정확하게 알려주는 역할을 한다.
만약 메서드의 선언부가 다르다면 컴파일 오류가 발생하여 프로그래머의 실수를 막아 준다.

묵시적 클래스 형 변환과 메서드 재정의

묵시적 형 변환에 의해 VIPCustomer가 Customer형으로 변환되었다.
그 후 calcPrice( ) 메서드를 호출했는데, 이때 calcPrice(10000)는 상위 클래스와 하위 클래스 중 어떤 메서드를 호출할까?

멤버 변수와 메서드는 선언한 클래스형에 따라 호출된다.
그런데 VIPCustomer 클래스의 calcPrice( ) 메서드, 즉 재정의된 메서드가 호출된 이유는 무엇일끼?
상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때, 즉 재정의된 메서드가 있을 경우
호출되는 메서드는 인스턴스에 따라 결정된다.
이렇게 인스턴스의 메서드가 호출되는 기술을 '가상 메서드'라고 한다.
가상 메서드
자바의 클래스는 멤버 변수와 메서드로 이루어져 있다. 변수와 메서드가 사용하는 메모리는 다르다.
클래스를 생성하여 인스턴스가 만들어지면 멤버 변수는 힙 메모리에 위치한다.
변수는 인스턴스가 생성될 때마다 새로 생성되지만,
메서드는 실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행하며 여러 개 생성되지는 않는다.
메서드의 명령 집합은 메서드 영역( 코드 영역 )에 위치한다. 우리가 메서드를 호출하면 메서드 영역의 주소를 참조하여 명령이 실행되기 때문에 인스턴가 달라도 동일한 메서드가 호출되는 것이다.
가상 메서드의 원리
메서드를 호출한다는 것은 그 메서드의 명령 집합이 있는 메모리 위치를 참조하여 명령을 실행하는 것이다.
그렇기에 자바의 모든 메서드는 가상 메서드이다.
가상 메서드는 '가상 메서드 테이블'이 만들어지는데, 이는 각 메서드 이름과 실제 메모리 주소가 짝을 이루고 있다.
어떤 메서드가 호출되면 이 테이블에서 주소 값을 찾아서 해당 메서드의 명령을 수행한다.
* 재정의되지 않은 메서드의 경우 상위 메서드와 하위 메서드의 메서드 주소가 같으며 상위 클래스의 메서드가 호출된다.
'프로그래밍 > JAVA' 카테고리의 다른 글
08-5 다형성 활용하기 (0) | 2023.02.25 |
---|---|
08-4 다형성 (1) | 2023.02.25 |
08-2 상속에서 클래스 생성과 형 변환 (0) | 2023.02.25 |
08-1 상속 (0) | 2023.02.25 |
07-3 ArrayList 클래스 사용하기 (0) | 2023.02.25 |