[Java] 객체지향 4대 특성 - 다형성

- 3 mins

다형성이란?

사용편의성 증진을 위해 사용

오버라이딩과 오버로딩?

Screenshot

코드

public class Animal {
	public String name;

	public void showName() {
		System.out.printf("안녕 나는 %s야. 반가워\n", name);
	}
}
public class Penguin extends Animal {
	public String habitat;

	public void showHabitat() {
		System.out.printf("%s는 %s에 살아\n", name, habitat);
	}

	//오버라이딩 - 재정의: 상위클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트
	public void showName() {
		System.out.println("어머 내 이름은 알아서 뭐하게요?");
	}

	// 오버로딩 - 중복정의: 같은 메서드 이름, 다른 인자 리스트
	public void showName(String yourName) {
		System.out.printf("%s 안녕, 나는 %s라고 해\n", yourName, name);
	}
}
public class Driver {
	public static void main(String[] args) {
		Penguin pororo = new Penguin();

		pororo.name = "뽀로로";
		pororo.habitat = "남극";

		pororo.showName(); // 어머 내 이름은 알아서 뭐하게요?
		pororo.showName("sehun"); // sehun 안녕, 나는 뽀로로라고 해
		pororo.showHabitat(); // 뽀로로는 남극에 살아

		Animal pingu = new Penguin();

		pingu.name = "핑구";
    pingu.showName(); // 어머 내 이름은 알아서 뭐하게요?
  }
}

pororopingu 객체의 T 메모리 매핑과정

JVM의 메모리를 추상화한 T 메모리란 용어에 대해 알고 싶으면 이 글을 읽어볼 것

Screenshot main()에서 pororoPenguin 타입의 객체이고, pinguAnimal 타입의 객체이다. pinguheap 영역에서 Animal을 가리키고 있고, pororoPenguin을 가리키고 있다.

showName()은 Animal에 있는 메소드를 Penguin 이 오버라이딩한 것이기에, Animal 타입으로 showName()을 호출해도 Penguin 이 가진 메소드가 덮어씌어져서 호출되게 된다.

다형성은 개발자의 편의를 위해 필요하다. (근데 오버로딩은 다형성이 맞는지 모르겠다..)

ex)  더하는 프로그램을 만들 때, 오버로딩이 없으면 *addChar(char, char), addInt(int, int), addLong(long, long), 등등* 같은 일을 하면서 다른 인자를 받는 것들을 여러 이름으로 새로 만들어야한다.

Tip : Call By

기본 자료형이던 참조자료형이던 해당 변수가 가지고 있던 것이 전달된다.

이 것을 전달 받았을 때 값(프리미티브 타입)인지 주소인지 해석하는 것.

1. Call By Value

2. Call By Reference


참고

Sehun Kim

Sehun Kim

하다보니 되더라구요.

comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora