java 100예제 #7

·2022년 1월 20일
0

JAVA

목록 보기
7/14

다형성

polymorphism 다양한 형태 또는 특성을 가진다.

: 하위클래스의 객체는 상위클래스의 객체로도 사용될 수 있다.

ex) Brid n = new Parrot( ) ;

상위클래스 타입의 하위클래스 객체는 상위클래스의 자원만 사용할 수 있고, 하위클래스의 오버라이딩한 메소드만 사용 가능하다.

  • 하위클래스 타입의 하위클래스 객체에서 오버라이딩 메소드의 원본인 부모클래스의 메소드를 호출하고 싶다면 super 키워드를 이용하여 메소드를 추가하여 사용한다. (s1)

  • 상위클래스 타입의 하위클래스 객체에서 오버라이딩하지 않은 하위클래스의 메소드를 호출하려면 캐스트를 사용한다. (s2)

클래스를 이용한 다형성 이해하기 예제


class Person1{
	String str1 = "부모 클래스";
	void method1() {System.out.println("a");}
	void p() {System.out.println("person");}
}

class Student1 extends Person1{
	String str2 = "자식 클래스";
	void method1() {System.out.println("오버라이딩 - A");}
	void s() {System.out.println("student");}
	
	void s_method1() {super.method1();}
	//오버라이딩한 메소드의 원본메소드 호출하는 메소드
}


public class ex3 {

	public static void main(String[] args) {
		
		
		System.out.println("-------상속받은 하위 클래스---------");
		
		Student1 s1 =new Student1();
		
		//부모+자식의 모든 자원을 사용할 수 있다. 
		System.out.println(s1.str1 +" + "+ s1.str2);
		s1.s();
		s1.p();
		
		s1.method1(); //오버라이딩된 메소드
		//부모클래스의 메소드를 가지고 오고 싶다면? -> super키워드 + 새로운 메소드
		s1.s_method1();
		
		
		
		
		System.out.println("-------다향성---------");
		
		Person1 s2 = new Student1(); 
		
		//부모클래스 타입인 자식클래스의 객체, 부모의 자원 + 오버라이딩한 자식의 메소드만 사용가능
		System.out.println(s1.str1);
		
		//에러 예시
		//s2.s(); 
		//System.out.println(s2.str2);
		
		s2.method1();
		//오버라이딩한 메소드는 자식의 메서드로 실행된다.
		
		//(오버라이딩 안한)자식 메소드를 호출하고 싶다면? -> 캐스트 필요
		((Student1)s2).s();
	}
}

캐스트 사용하는 방법 외에는 자동 타입 변환 방법이 있다.

부모타입 변수 = 자식타입변수 ;

이렇게 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드, 오버라이딩 되지 않은 메소드와 오버라이딩된 자식 클래스의 메소드만 호출 가능하다.

추상 클래스와 상속을 사용한 다형성 예제

  • 객체 생성 시 배열 사용 ( car1 , car2)
  • 반복문으로 메소드 호출
abstract class Car {abstract void run();} 

class Ambulance extends Car {void run() {System.out.println("삐뽀삐뽀");}}


class Cultivator extends Car {void run() {System.out.println("달달달달ㄷㄷㄷㄷㄷ");}}


class SportsCar extends Car {void run() {System.out.println("부와아앙");}}


public class ex4 {
	public static void main(String[] args) {

		Car[] car1 = new Car[3];
		car1 = new Car[] {new Ambulance(), new Cultivator(), new SportsCar()};

		
		Car[] car2 = {new Ambulance(), new Cultivator(), new SportsCar()};

		
		System.out.println("각 객체의 run()메소드 호출");
	
		System.out.println("------for문을 이용---------");
		for(int i = 0 ; i<car2.length ;i++) {
			car2[i].run();
		}
		
		System.out.println("------향상된 for문을 이용-----");
		for(Car i : car1) {
			i.run();
		}
	}
}

배열 다형성의 장점
각 클래스 별로 생성하는 객체는 해당 클래스 타입으로만 관리해야 하지만 다형성이 가능하여 상위 타입으로 선언하고 상위 또는 하위 클래스로 객체를 만들 수 있다.

매개변수 활용에서 다형성의 장점
System.out.println() 메소드에서 어떤 타입이나 객체를 매개변수로 받더라도 다형성을 활용하기 때문에 해당 값을 출력할 수 있다.
public void println( Object ) 로 되어 있는데 Object가 최상위이므로 어떤 객체 타입이 와도 에러가 없다.

0개의 댓글

관련 채용 정보