Binary World

JAVA CLASS : 상속(다형성) 본문

개발자의 길/JAVA

JAVA CLASS : 상속(다형성)

모쿠 2017. 1. 3. 11:35

<다형성>


- 인스턴스를 여러가지 타입으로 부를 수 있는것

- 생성된 인스턴스를 가리키는(참조하는) 참조 변수를 선언할 때, 

- 생성된 인스턴스의 클래스 타입으로 변수를 선언할 수도 있고

- 그 부모타입으로 변수를 선언할 수도 있는 것


<다형성의 장점>


1. 배열을 사용할 때 부모 타입으로만 선언해도, 그 배열에는 부모/자식 타입 모두 저장 가능

2. 메소드를 정의할 때, 메소드의 매개변수나 리턴 타입으로 부모 클래스 타입만 사용해도 부모/자식 타입 모두 매개변수나 리턴값으로 사용할 수 있다.


<프로그램 코드>


1. 다형성을 이용해서 배열을 생성하고 출력


* Car.java(자동차 클래스, 부모 클래스)


package edu.java.inherit06;


public class Car {

// 멤버 변수

private int fuel; // 연료

// 생성자

public Car() {}

public Car(int fuel){

this.fuel = fuel;

}

// 메소드

public int getFuel(){

return fuel;

}

public void setFuel(int fuel){

this.fuel = fuel;

}

public void display() {

System.out.println("자동차 연료: " + fuel);

}


} // end class Car



* HybridCar.java (하이브리드 클래스, 자식 클래스)


package edu.java.inherit06;


public class HybridCar extends Car{

private int battery;

// 생성자

public HybridCar() {}

public HybridCar(int fuel, int battery) {

super(fuel);

this.battery = battery;

}

public int getBattery() {

return battery;

}

public void setBattery(int battery){

this.battery = battery;

}

@Override

public void display() {

System.out.println("하이브리드 자동차 연료: " + getFuel());

System.out.println("하이브리드 자동차 배터리: " + battery);

}


} // end class HybridCar



* CarUtil.java (drive 메소드 선언)


package edu.java.inherit06;


public class CarUtil {

public static void drive(Car car) {

System.out.println("현재 연료: " + car.getFuel());

System.out.println("부릉부릉~");

}


}



* InheritMain06.java (메인 클래스)


package edu.java.inherit06;


public class InheritMain06 {


public static void main(String[] args) {

// Car 클래스의 인스턴스 생성

Car car1 = new Car();


// HybridCar 클래스의 인스턴스 생성

HybridCar car2 = new HybridCar();


// 다형성(polymorphism)

Car car3 = new HybridCar();

// hybridCar car4 = new Car(); // 불가능함

// Child 변수이름 = new Child(); // 가능

// Parent 변수이름 = new Child(); // 가능

// Child 변수이름 = new Parent(); // 불가능

// Car 타입 배열선언

Car[] cars = new Car[3];

cars[0] = car1;

cars[1] = car2;

cars[2] = car3;

for(Car x : cars) {

x.display();

System.out.println("---------------");

} // end for(x)

System.out.println();

for(Car x : cars){

CarUtil.drive(x);

System.out.println("---------------");

}

} // end main()


} // end class InheritMain06



2. 클래스 강제 형변환


* InheritMain07 (부모 클래스와 자식 클래스를 포함하는 메인 클래스)


package edu.java.inherit07;


class ParentClass {

private int x;


public ParentClass(int x) {

this.x = x;

}


public int getX() {

return x;

}

} // end ParentClass


class ChildClass extends ParentClass {

private int y;


public ChildClass(int x, int y) {

super(x); // 부모클래스의 생성자를 명시적으로 부름

this.y = y;

}


public int getY() {

return y;

}

} // end ChildClass


public class InheritMain07 {


public static void main(String[] args) {

// 다형성 사용과 instanceof 연산자

ParentClass test1 = new ParentClass(100);

ParentClass test2 = new ChildClass(100, 200);


System.out.println(test2.getX());

// test2는 ParentClass 타입으로 선언했기 때문에

// ChildClass에서 정의한 getY() 메소드를 사용할 수 없음.


// 강제 형변환(casting)을 하면, ChildClass가 가지고 있는 메소드 사용 가능

System.out.println(((ChildClass) test2).getY());


System.out.println();

// 참조변수 instanceof 클래스이름:

// 클래스 타입의 인스턴스이면 true, 아니면 false를 리턴

// 강제 형변환 했을 때 클래스를 확인하기 위해 사용

if (test2 instanceof ChildClass) {

System.out.println("x = " + test2.getX());

System.out.println("y = " + ((ChildClass) test2).getY());

} else {

System.out.println("x = " + test2.getX());

}


System.out.println();

if (test1 instanceof ChildClass) {

System.out.println("x = " + test1.getX());

System.out.println("y = " + ((ChildClass) test1).getY());

} else {

System.out.println("x = " + test1.getX());

}

// instanceof 를 사용할 때에는 일반적인(부모클래스 등)을 가장 마지막(else)에 사용해서 전체를 검색할 수 있도록

// 한다

System.out.println();

if (test2 instanceof ParentClass){

System.out.println(1);

} else if (test2 instanceof ChildClass){

System.out.println(2);

} else {

System.out.println(3);

}

} // end


Comments