JAVA 7강_6_다형성(polymorphism)

열라뽕따히·2024년 2월 19일

JAVA

목록 보기
45/79

다형성(polymorphism)이란?

  • 객체지향 프로그램의 4대 특징 중 하나 (상속과 연관성이 많음)

  • 다형성의 사전적 의미 : 같은 종의 생물이지만 모습이나 특징이 고유의 성질을 가지고 있는 것을 말함 ex) 고양이과 - 고양이, 삯, 호랑이 등

  • 여러가지 모습으로 해석될 수 있는 형태

  • 여러거자 형태를 가질 수 있는 능력

  • 하나의 메서드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것

  • 하나의 사물(객체)를 다양한 타입으로 선언하고 이를 이용할 수 있는 성질

  • 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것
    : 조상 타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 특징임. 단, 조상클래스에서 상속을 받는 멤버들에만 접근할 수 있고, 자손클래스에서 만들어진 멤버들에는 접근할 수 없음. ex) 조상 타입의 참조변수로 자식의 멤버를 호출

  • 조상 타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있지만, 반대로 자손타입의 조상타입의 인스턴스를 참조할 수 없음


[다형성을 사용하는 이유]

  1. 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음
  2. 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능을 구현
  3. 여러 클래스를 하나의 타입(상위 클래스)로 핸들링을 할 수 있음



참고 블로그 : https://inpa.tistory.com/entry/OOP-JAVA%EC%9D%98%EB%8B%A4%ED%98%95%EC%84%B1Polymorphism%EC%99%84%EB%B2%BD%EC%9D%B4%ED%95%B4#%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98_%EB%8B%A4%ED%98%95%EC%84%B1





<예시1>

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 발생!

	}

=============================실행=============================





<예시2>

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();
	}

}

메인메서드내에 **다형성을 이용**하여 호출할 Car_02 클래스 생성


=============================코드=============================

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

=============================실행=============================





<예시3>

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());  // 한번에 작성하는 것도 가능

	}

=============================실행=============================





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

0개의 댓글