오버라이딩과 오버로딩
오버라이딩(Overriding)
- 정의
- 서브 클래스가 슈퍼 클래스의 메서드를 재정의하는 것임.
- 특징
- 같은 메서드 이름을 가지면서, 슈퍼 클래스의 메서드의 구현을 서브 클래스에서 변경하여 사용합니다.
- 예시
- 슈퍼 클래스에
printMessage()
메서드가 “hello” 를 출력한다면
- 서브 클래스에서
- 오버라이딩하여
printMesssage()
메서드의 출력 문구를 변경하여 사용가능 ( 중괄호 안의 구현을 새롭게 가능 )
- 슈퍼 클래스에
오버로딩
- 정의
- 하나의 클래스에서 같은 이름의 메서드를 여러 개 정의하는 것을 의미
- 특징
- 메서드의 이름은 동일
- 매개변수의 타입, 개수, 순서가 다를 수 있음.
- 예시
printMessage()
메서드를 오버로딩하여 하나는 인자 없이, 또 다른 하나는 문자열 인자를 받아 출력하도록 정의가능
오버라이딩과 오버로딩의 구분
- 오버라이딩
- 상위 클래스의 메서드를
재정의
- 메서드 이름과 매개변수
동일
- 상위 클래스의 메서드를
- 오버 로딩
- 하나의 클래스 내에서 메서드 이름
동일
- 매개변수가 다른 여러 메서드를 정의
- 하나의 클래스 내에서 메서드 이름
예시로 보는 다형성의 메모리구조
package polymorphism01;
public class Animal {
public String name;
public void showName() {
System.out.printf("안녕 나는 %s야. 반가워 \n", name);
}
}
package polymorphism01;
public class Penguin extends Animal {
public String habitat;
public void showHabitat() {
System.out.printf("%s는 %s에 살아\n", name, habitat);
}
// 오버라이딩 - 재정의: 상위클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트
@Override
public void showName() {
System.out.println("어머 내 이름은 알아서 뭐하게요?");
}
// 오버로딩 - 중복정의: 같은 메서드 이름, 다른 인자 리스트
public void showName(String yourName){
System.out.printf("%s 안녕, 나는 %s라고 해 \n", yourName, name);
}
}
package polymorphism01;
public class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showName("초보람보");
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name = "핑구";
pingu.showName();
}
}
Penguin pororo = new Penguin();
- 위 그림이 new Penguin 으로 객체를 만든 순간의 T 메모리 구조이다.
- 오버라이딩
@Override public void showName() { System.out.println("어머 내 이름은 알아서 뭐하게요?"); }
에서 상속받은 메서드를 재정의하고 있기에, Penguin 클래스의
showName()
메서드가 실행된다.정적영역에서 showName 은 Penguin 클래스에 존재하는 showName 을 찾아 실행한다.
- 오버로딩
pororo.showName("초보람보");
위 부분은 상속받은 메서드에서 인자가 하나 추가된 형태로서
메서드의 이름은 같지만, 매개변수의 타입이나 개수가 다르다.
정적 영역에서 해당 showName (인자1) 을 가진 클래스안의 메서드에서 탐색하여, 코드를 수행한다.
Animal pingu = new Penguin();
- pingu 의 객체 참조 변수는 타입이
Animal
이다.
- 하지만,
Penguin
객체를 참조하고 있습니다.
- 그렇기 때문에, pingu.showName() 을 호출하면 Penguin 클래스에서 재정의된
showName 메서드가 수행된다.
자세한 호출방식
- Animal pingu = new Penguin() 이 수행시에 일어나는 일
- 힙 영역
new Penguin()
을 통해 Penguin 객체가 힙 영역에 생성된다.
pingu
참조변수는Penguin
객체를 참조한다.
- 해당 객체는
Penguin
클래스의 속성( 인스턴스 변수) 과 메서드에 대한 참조를 포함함
- 정적 영역 == 메서드 영역 == 메타스페이스
Penguin
클래승
- 힙 영역
- pingu 의 객체 참조 변수는 타입이
Uploaded by N2T
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[3단원]상속과 인터페이스 (0) | 2023.08.25 |
---|---|
[3단원]상속과 T 메모리 (0) | 2023.08.25 |
[3단원]상속은 is a 관계를 만족해야 한다? (0) | 2023.08.25 |
[3단원]클래스 멤버 vs. 객체 멤버 = static 멤버 vs. 인스턴스 멤버 (0) | 2023.08.22 |
[3단원]상속의 강력함 (0) | 2023.08.22 |