[3단원]다형성: 사용편의성

오버라이딩과 오버로딩

오버라이딩(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();
    }
}
  1. Penguin pororo = new Penguin();
    • 위 그림이 new Penguin 으로 객체를 만든 순간의 T 메모리 구조이다.
  1. 오버라이딩
     @Override
        public void showName() {
            System.out.println("어머 내 이름은 알아서 뭐하게요?");
        }

    에서 상속받은 메서드를 재정의하고 있기에, Penguin 클래스의 showName() 메서드가 실행된다.

    정적영역에서 showName 은 Penguin 클래스에 존재하는 showName 을 찾아 실행한다.

  1. 오버로딩
            pororo.showName("초보람보");

    위 부분은 상속받은 메서드에서 인자가 하나 추가된 형태로서

    메서드의 이름은 같지만, 매개변수의 타입이나 개수가 다르다.

    정적 영역에서 해당 showName (인자1) 을 가진 클래스안의 메서드에서 탐색하여, 코드를 수행한다.

  1. Animal pingu = new Penguin();
    • pingu 의 객체 참조 변수는 타입이 Animal 이다.
    • 하지만, Penguin 객체를 참조하고 있습니다.
    • 그렇기 때문에, pingu.showName() 을 호출하면 Penguin 클래스에서 재정의된 showName 메서드가 수행된다.

    자세한 호출방식

    • Animal pingu = new Penguin() 이 수행시에 일어나는 일
      1. 힙 영역
        1. new Penguin() 을 통해 Penguin 객체가 힙 영역에 생성된다.
        1. pingu 참조변수는 Penguin 객체를 참조한다.
        1. 해당 객체는 Penguin 클래스의 속성( 인스턴스 변수) 과 메서드에 대한 참조를 포함함
      1. 정적 영역 == 메서드 영역 == 메타스페이스
        1. Penguin 클래승

Uploaded by N2T