다형성

김민성·2022년 7월 14일
0

Java

목록 보기
18/47
post-thumbnail

다형성

참조변수의 형변환

  • 업 캐스팅

    • 업 캐스팅이랑 부모 타입의 객체에 자식 필드의 주소값을 담아주는 것이다.
    • 업 캐스팅된 객체는 자식 클래스에서 추가된 내용을 사용할 수 없다.
    • 단, 오버라이딩 된 메서드는 덮어씌워진 내용으로 사용 가능하다.
  • 다운 캐스팅

    • 다운 캐스팅이란 업 캐스팅 된 객체를 다시 자식 타입으로 바꾸는 것이다.
    • 업 캐스팅시 잘려나갔던 자식 클래스에 추가된 내용들을 다시 사용할 수 있게 하려면 자식 타입으로 바꿔주어야 한다.
    public class Main{
    	public static void main(String[] args) {
    		Ambulance amb = new Ambulance();
    		Car car = amb;		// 업캐스팅
    		
    		//car.siren();		// 컴파일에러
    		car.func();			// "오버라이드된 기능"
    	}
    }
    
    class Car{
    	void drive() {
    		System.out.println("기본기능 - 전진");
    	}
    	void stop() {
    		System.out.println("기본기능 - 멈춤");
    	}
    	void func() {
    		System.out.println("오버라이드를 통한 기능추가");
    	}
    }
    
    class Ambulance extends Car{
    	void siren() {
    		System.out.println("구급차기능 - 사이렌");
    	}
    	
    	@Override
    	void func() {
    		System.out.println("오버라이딩된 기능");
    	}
    }

    위의 코드를 보자. Car 클래스에는 drive, stop, func 세 메서드가 있고 Ambulance 클래스는 Car 클래스를 상속받고 siren이라는 메서드와 오버라이딩된 func 메서드를 가지고 있다.

    main 메서드에서 Ambulance 타입의 객체 amb를 생성하고 amb를 Car 타입의 객체인 car에 대입 했다. 이때 업캐스팅이 일어난다. 이 때 자식 객체에 선언된 siren이라는 메서드는 사용할 수 없지만 오버라이딩 된 func 메서드는 오버라이딩한 기능으로 사용할 수 있게 된다.

    업캐스팅을 할 때는 Car car = (Car)amb 에서 (Car)은 생략 가능하다.

    public class Main{
    	public static void main(String[] args) {
    		Car car = new Ambulance();	// 업캐스팅
    		Ambulance amb = (Ambulance)car;		// 다운캐스팅
    		amb.siren();		// "구급차기능 - 사이렌"
    		amb.func();			// "오버라이딩된 기능"
    		amb.drive();		// "기본기능 - 전진"
    	}
    }
    
    class Car{
    	void drive() {
    		System.out.println("기본기능 - 전진");
    	}
    	void stop() {
    		System.out.println("기본기능 - 멈춤");
    	}
    	void func() {
    		System.out.println("오버라이드를 통한 기능추가");
    	}
    }
    
    class Ambulance extends Car{
    	void siren() {
    		System.out.println("구급차기능 - 사이렌");
    	}
    	
    	@Override
    	void func() {
    		System.out.println("오버라이딩된 기능");
    	}
    }

    위의 코드를 보자. main 메서드에서 Car car = new Ambulance(); 으로 업캐스팅을 해준 후 Ambulance amb = (Ambulance)car; 다시 다운 캐스팅 한다. 그럼 다시 자식 객체에 선언한 siren 메서드를 사용할 수 있게 된다.

    다운 캐스팅을 할 때는 Ambulance amb = (Ambulance)car 에서 (Ambulance)는 생략이 불가능하다.

instanceof

  • intanceof 연산자는 앞에 있는 객체가 뒤에 오는 클래스 타입인지 비교할 때 사용한다.

  • 객체 instanceof 클래스명 으로 사용하며 결과가 truefalse로 나오는 조건식이다.

    public class Main{
    	public static void main(String[] args) {
    		FireEngine fe = new FireEngine();
    		
    		if (fe instanceof FireEngine) {			// true
    			System.out.println("FireEngine 타입의 객체입니다.");
    		}
    		if (fe instanceof Car) {				// true
    			System.out.println("Car 타입의 객체입니다.");
    		}
    		if (fe instanceof Object) {				// true
    			System.out.println("Object 타입의 객체입니다.");
    		}
    	}
    }
    
    class Car{}
    class FireEngine extends Car{}

0개의 댓글