📌 다형성이란?
📌 오버라이딩과 오버로딩의 구분
📌 다형성과 T메모리
➕ 다형성이 지원되지 않는 언어
📚 다형성이란, 여러개의 형태를 가지는 것을 말한다.
객체 지향의 다향성이란 동일한 코드가 상황에 따라 여러가지로 실행되는 것이다.
상위클래스와 하위클래스, 인터페이스와 구현 클래스로도 설명할 수 있으나. 기본적으로는 오버라이딩과 오버로딩을 말한다.
🔖 오버로딩이란, 한 클래스내에 메서드명이 동일한 메서드가 중복 정의되어 있는 경우이다. 매개변수로 구별할 수 있다.
대표적으로 생성자가 여러개 생성된 생성자 오버로딩이 있다.
🔖 오버라이딩이란, 상속 구조내 상위클래스에서 정의한 메소드를 하위클래스에서 재정의하는 것이다.
따라서, 오버로딩은 한 클래스내에 매개변수는 다르지만 동일한 메서드명을 가진 메서드가 두개 이상 존재한다. 오버라이딩은 매개변수와 메서드명이 동일한 메서드가 상위클래스에 존재한다.
package OOP03.polymorphism01;
public class Anlimal {
public String name;
public void showName() {
System.out.println("이 동물의 이름은 " +name+ "입니다.");
}
}
package OOP03.polymorphism01;
public class Penguin extends Anlimal {
public String habitat;
public void showHabitat() {
System.out.printf("%s는 %s에 살아\n", name, habitat);
}
@Override
public void showName() {
System.out.println("이 펭귄의 이름은 " +name+ "입니다.");
}
public void showName(String s) {
System.out.println("안녕하세요! " + s +"씨" +
" 이 펭귄의 이름은 " +name+ "입니다.");
}
}
🎙️ 오버라이딩된 메서드는?
오버라이딩은 상위클래스의 메서드를 재정의 한 것!!
-> public void showName()
🎙️ 오버로딩된 메서드는?
오버로딩은 한 클래스 내에서 매개변수의 차이로 메서드를 여러개 선언하는 것!
-> public void showName(String s)
package OOP03.polymorphism01;
public class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "눈 덮인 숲속 마을";
pororo.showName();
pororo.showName("서현");
pororo.showHabitat();
Anlimal pingu = new Penguin();
pingu.name = "핑구";
pingu.showName();
// pingu.showName("서현");
// 🤔 왜 안될까?
}
}
🤔 왜 안될까?
묵시적 형변환된 객체 참조 변수는 ⭐객체 참조변수의 멤버만 사용할 수 있었다.
헷갈리면 이전 포스팅을 보고오자! 매개변수가 String
인 메서드는 상위클래스에는 존재하지 않는다. (오버라이딩된 것이 아님) 상위클래스 Animal
에는 해당 메서드가 없어서 실행할 수 없다.
👉 실행화면
이 펭귄의 이름은 뽀로로입니다.
안녕하세요! 서현씨 이 펭귄의 이름은 뽀로로입니다.
뽀로로는 눈 덮인 숲속 마을에 살아
이 펭귄의 이름은 핑구입니다.
⭐ 하위 클래스에서 오버라이딩되면 상위 클래스의 메서드가 가려진다.
따라서 상위 클래스 타입의 객체 참조 변수인 핑구 인스턴스도 상위클래스의 showName()
이 가려져 하위클래스의 재정의 된 메서드가 생성된다.
메서드명이 동일해도 매개변수가 다르면 다른 메서드이다.
🤔 두 가지의 숫자를 더하는 메서드를 만든다고 생각해보자!
-> 엄청 간단할 것 같지만, 정수 자료형과 부동소수점 자료형은 총 7가지가 있다. 자바는 매개변수를 순서로 구분하니까 (정수형,부동소수점)과 (부동소수점,정수형)은 다르다. 이런 경우는 모두 7*7 =49개이다. 총 49개의 메서드를 만들어야한다.
🤮 다형성을 지원하지 않으면 메서드명이 다 달라야하기 때문에 총 49개의 메서드명을 만들어야한다.
😄 하지만?! 오버라딩이 있다면, 메서드명하나로 인자목록만 다르게 할 수 있다. 또한 제네릭을 이용하면 하나의 함수만 구현할 수 있다.
😄 상위 클래스 타입의 객체 참조 변수에서 생성되었던 타입을 몰라도 하위 클래스가 오버라이딩한 메서드를 자동으로 시ㄹ행한다.
📌 하위 클래스에서 오버라이딩되면 상위 클래스의 메서드가 가려진다.
재미지다