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 |
댓글