본문 바로가기
Backend/JAVA

JAVA 다형성

by YERIEL_염주둥 2020. 4. 22.
728x90

1. 다형성


  - 하나의 클래스를 상속받아 여러개의 클래스가 확장 되었을 경우 상속의 주체가 되는 슈퍼클래스의 참조 타입으로 업캐스팅이 가능하며  캐스팅 된 객체로 비지니스 로직 처리가 가능하다.
       

2. 업캐스팅 (up cast)

  - 상속받아 객체화 된 대상을 슈퍼클래스 참조타입으로 캐스팅 하는 것
  - 슈퍼클래스 -> 서브 클래스

 

3. 다운 캐스팅 (down cast)

  - 객체화 된 부모클래스에서 상속을 받은 서브클래스로 캐스팅 되는 것
  - 서브클래스 -> 슈퍼클래스

 

package kr.or.ksmart;

class Car{
	private int num;
	private int gas;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public int getGas() {
		return gas;
	}
	public void setGas(int gas) {
		this.gas = gas;
	}
	@Override
	public String toString() {
		return "Car [num=" + num + ", gas=" + gas + "]";
	}
	
}

class Bus extends Car{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Bus [name=" + name + "] " + super.toString();
	}
}

class Sport extends Car{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Sport [name=" + name + "] "+ super.toString();
	}
}

public class JavaBasic01 {

	public static void main(String[] args) { // bus 클래스와 sport 클래스는 Car라는 객체를 가지고있다.
		
		String type ="sport";
		Car car = null; //(명시적캐스팅) 슈퍼클->서브클 "업캐스팅"
		
		if("bus".equals(type)) {
			Bus bus = new Bus();
			bus.setGas(1000);
			bus.setNum(1000);
			bus.setName("3-2");
			System.out.println(bus.getGas());
			System.out.println(bus.getNum());
			System.out.println(bus.getName()); //참조타입이 슈퍼클래스로도 올 수 있다.
			System.out.println(bus.toString());
			car = bus;
		}else if("sport".equals(type)) {
			Sport sport = new Sport();
			sport.setGas(2000);
			sport.setNum(2000);
			sport.setName("E-type");
			System.out.println(sport.getGas());
			System.out.println(sport.getNum());
			System.out.println(sport.getName());
			System.out.println(sport.toString());
			car = sport;
		}
		
		System.out.println(car.getNum()); //bus의 주소값을 가지고 있지만 바뀐 참조 타입의 메서드만 사용 할 수 있다.
		System.out.println(car.getGas());
		System.out.println(car.toString());
		
	}

}

 

4. 슈퍼 클래스를 참조타입으로 서브클래스 인스턴스화 하기

package kr.or.ksmart;

class Car{
	private int num;
	private int gas;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public int getGas() {
		return gas;
	}
	public void setGas(int gas) {
		this.gas = gas;
	}
	@Override
	public String toString() {
		return "Car [num=" + num + ", gas=" + gas + "]";
	}
	
}

class Bus extends Car{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Bus [name=" + name + "] " + super.toString();
	}
}

class Sport extends Car{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Sport [name=" + name + "] "+ super.toString();
	}
}

public class JavaBasic01 {

	public static void main(String[] args) { // bus 클래스와 sport 클래스는 Car라는 객체를 가지고있다.
		
		Car car2 = null;
		if("bus".equals(type)) {
			car2 = new Bus();
			//참조타입에 있는 데이터만 넣을 수 있다.
			car2.setGas(1000);
			car2.setNum(1000);
		}else if("sport".equals(type)) {
			car2 = new Sport();
			car2.setGas(2000);
			car2.setNum(2000);
		}
		System.out.println("------------------------------------------------------");
		System.out.println(car2.toString());
		
		Bus bus = (Bus) car2;
		System.out.println(bus.toString());
		
	}

}

 

5. Object 클래스로 업캐스팅 다운캐스팅

package kr.or.ksmart;

class MyClass{
	public String myName;
}

public class JavaBasic02 {

	public static void main(String[] args) {
		//Object myClass = new MyClass();
		MyClass myClass = new MyClass();
		myClass.myName = "홍길동";
		Object myClassObject = myClass; // 오브젝트 클래스로 업캐스팅
		MyClass myClass2 = (MyClass) myClassObject;
		
		//에러발생 : 코드상에 오류는 없으나 업캐스팅후 다운캐스팅할때 명확하게 가져와야한다. 
		//JavaBasic02 myClass3 = (JavaBasic02) myClassObject;
		
		System.out.println(myClass2.myName);
	}

}
반응형

'Backend > JAVA' 카테고리의 다른 글

JAVA 추상 클래스  (0) 2020.04.27
JAVA override && final  (0) 2020.04.27
JAVA 상속  (0) 2020.04.22
JAVA 생성자 설계하기  (0) 2020.04.22
JAVA 메서드 오버로딩  (0) 2020.04.22

댓글