ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 다형성(polymorphism)
    자바 2021. 3. 14. 16:43

    객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 즉 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다는 것이다.

     

    class Tv {
    	boolean power;
        int channel;
        
        void power() {
        	power = !power;
        }
        void channelUp() {
        	++channel;
        }
        voud channelDown() {
        	--channel;
        }
    }
    
    class CaptionTv extends Tv {
    	String text;
        void caption() {
        
        }
    }
    
    Tv t = new Tv();
    CaptionTv c = new CaptionTv();

    서로 상속관계에 있을 경우, 다음과 같이 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것도 가능하다.

    CaptionTv c = new CaptionTv();
    Tv t = new CaptionTv();

    허나 Tv타입의 참조변수로는 Tv클래스의 멤버들만 사용할 수 있다.

     

    조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.

    반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.

     

    참조형변수의 형변환

    기본형 변수와 같이 참조형변수도 형변환이 가능하다.

     

    자손타입 -> 조상타입 : 형변환 생략가능

    조상타입 -> 자손타입 : 형변환 생략불가

    class Car {
    	String color;
        int door;
        void drive() {
        	System.out.println("drive, Brrr~");
        }
        void stop() {
        	System.out.println("stop!!!");
        }
    }
    
    class FireEngine extends Car {
    	void water() {
        	System.out.println("water!!!");
        }
    }
    
    class Ambulance extends Car {
    	voud siren() {
        	System.out.println("siren~~~");
    	}    
    }
    
    Car car = null;
    FireEngine fe = new FireEngine();
    FireEngine fe2 = null;
    
    car = fe;
    fe2 = (FireEngine) car;

    형변환은 참조변수의 타입은 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 끼치지 않는다.

    Car car = new Car();
    Car car2 = null;
    FireEngine fe = null;
    
    fe = (FireEngine)car; // 컴파일은 ok. 실행 시 에러가 발생

    참조변수 car가 참조하고 있는 인스턴스가 Car타입의 인스턴스라는데에서 문제가 발생한다.

    조상타입의 인스턴스를 자손타입의 참조변수로 참조하는 것은 허용되지 않는다.

    컴파일 시에는 참조변수간의 타입만 체크하기 때문에 실행 시 생성될 인스턴스의 타입에 대해서는 전혀 알지 못한다.

    그래서 컴파일 시에는 문제가 없었지만, 실행 시에는 에러가 발생하는것이다.

     

    서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.

     

    매개변수의 다형성

    class Product {
    	int price;
        int bonusPoint;
    }
    class Tv extends Product {}
    class Computer extendds Product {}
    class Audio extends Product {}
    
    class Buyer {
    	int money = 1000;
        int bonusPoint = 0;
        
        void buy(Product p) {
        	money = money - p.price;
            bounsPoint = bonusPoint + p.bonusPoint;
        }
    }

    매개변수가 Product타입의 참조변수라는 것은, 메서드의 매개변수로 Product클래스의 자손타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다는 것이다.

     

    남궁성,『Java의 정석』,도우출판

    '자바' 카테고리의 다른 글

    자바 String 클래스  (0) 2021.03.14
    접근 제어자  (0) 2021.03.14
    자바 객체지향  (0) 2021.03.12
    자바의 변수(variable)에 대해서  (0) 2021.03.10
    JVM(Java Virtual Machine)  (0) 2021.03.10
Designed by Tistory.