다형성(polymorphism)이란?
객체지향 프로그램의 4대 특징 중 하나 (상속과 연관성이 많음)
다형성의 사전적 의미 : 같은 종의 생물이지만 모습이나 특징이 고유의 성질을 가지고 있는 것을 말함 ex) 고양이과 - 고양이, 삯, 호랑이 등
여러가지 모습으로 해석될 수 있는 형태
여러거자 형태를 가질 수 있는 능력
하나의 메서드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것
하나의 사물(객체)를 다양한 타입으로 선언하고 이를 이용할 수 있는 성질
하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것
: 조상 타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 특징임. 단, 조상클래스에서 상속을 받는 멤버들에만 접근할 수 있고, 자손클래스에서 만들어진 멤버들에는 접근할 수 없음. ex) 조상 타입의 참조변수로 자식의 멤버를 호출
조상 타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있지만, 반대로 자손타입의 조상타입의 인스턴스를 참조할 수 없음
[다형성을 사용하는 이유]
Animal 인터페이스 생성
=============================코드=============================
public interface Animal {
void sound();
}
Animal 인터페이스를 상속받을 Cat 클래스 생성

=============================코드=============================
public class Cat implements Animal{
@Override
public void sound() {
System.out.println("냐옹냐옹");
}
void prn() {
System.out.println("출력용 메서드 입니다!");
}
}
메인메서드에 다형성을 이용하여 객체를 생성해보자!
=============================코드=============================
public static void main(String[] args) {
// 일반적인 객체 생성 방법
//Cat cat = new Cat();
//cat.sound();
// 다형성을 이용한 객체 생성방법
Animal cat = new Cat();
cat.sound();
// 다형성을 이용하여 객체 생성 후 자손 객체에 접근 할 시
// 자손에서 만든 멤버에는 접근할 수 없음
// cat.prn();
// 자식 클래스에서 만든 메서드가 부모클래스에는
// 존재하지 않기 때문에 다형성의 원칙에 맞지 않음
// Cat cat1 = new Animal(); !error 발생!
}

Tire라는 이름을 가진 클래스를 인터페이스로 선언한 뒤, roll이라는 멤버메서드 생성
=============================코드=============================
public interface Tire {
// 멤버메서드
void roll();
}
Tire 인터페이스를 상속받을 한국타이어, 금호타이어 클래스 생성

=============================코드=============================
///////////// 한국타이어 클래스
public class HanKookTire implements Tire {
@Override
public void roll() {
System.out.println("한국 타이어가 회전을 합니다.");
}
}
///////////// 금호타이어 클래스
public class KumHoTire implements Tire {
@Override
public void roll() {
System.out.println("금호 타이어가 회전을 합니다.");
}
}
tire 클래스를 멤버변수로 가질 Car 클래스 생성
=============================코드=============================
public class Car {
// 멤버변수 (Car 클래스 안에 tire 클래스를 멤버변수로 갖는다)
Tire tire;
void run() {
tire.roll();
}
}

=============================코드=============================
public static void main(String[] args) {
// 필드의 다형성
Car car = new Car();
car.tire = new HanKookTire();
car.run();
car.tire = new KumHoTire();
car.run();
}

Vehicle이라는 이름을 가진 클래스를 인터페이스로 선언한 뒤, run이라는 멤버메서드 생성
=============================코드=============================
public interface Vehicle {
void run();
}
Vehicle 인터페이스를 상속받을 Taxi, Bus, Subway 클래스 생성


=============================코드=============================
//////////////// Taxi 클래스
public class Taxi implements Vehicle {
@Override
public void run() {
System.out.println("총알 택시가 달립니다.");
}
}
//////////////// Bus 클래스
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("버스가 전용차로로 달립니다.");
}
}
//////////////// Subway 클래스
public class Subway implements Vehicle {
@Override
public void run() {
System.out.println("지하철이 달립니다.");
}
}
Vehicle 클래스를 멤버메서드, 멤버변수로 호출할 Driver 클래스 생성

=============================코드=============================
public class Driver {
void drive(Vehicle vehicle) {
vehicle.run();
}
}
메인메서드로 다형성을 이용하여 호출할 Vehicle_03 클래스 생성

=============================코드=============================
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
driver.drive(bus);
Taxi taxi = new Taxi();
driver.drive(taxi);
// Subway subway = new Subway();
driver.drive(new Subway()); // 한번에 작성하는 것도 가능
}

**어려웠던 점
-뭔가 여러 가지가 짬뽕 되며 헷갈린다.. 다형성은 추후 자세히 배울 수 있다고 하니 그때 한 번 더 알아보자..ㅎ