부모 = 자식 객체생성
자식 = (부모 = 자식 객체생성)
package test;
public class Animal {
public void move() {
System.out.println("동물이 움직인다");
}
}
package test;
public class Eagle extends Animal {
@Override
public void move() {
System.out.println("독수리 날개로 움직인다");
}
public void moveEagle() {
System.out.println("독수리 큰 날개로 날다");
}
}
package test;
public class Tiger extends Animal {
// 메서드 오버라이딩 부모의 move 메서드 재정의
@Override
public void move() {
System.out.println("호랑이 네발로 움직인다");
}
public void moveTiger() {
System.out.println("호랑이 큰 발로 빨리 달린다");
}
}
// 부모 = 자식 (업캐스팅)
Animal a = new Eagle();
a.move(); // 독수리 날개로 움직인다
// a.moveEagle(); // 에러 (자식 단독 메서드 접근 못함)
// 업캐스팅 없는(기억장소 혼자있는) 객체생성
// 다운 캐스팅 에러발생
// Eagle e = (Eagle)new Animal();
// e.move();
// 다운캐스팅 => 자식클래스 형으로 형변환
Eagle e = (Eagle)a;
e.move(); // 독수리 날개로 움직인다
e.moveEagle(); 독수리 큰 날개로 날다
// 다운 캐스팅 => 자식클래스 형으로 형변환
// a => Eagle 객체생성 => Tiger형변환 못함=> 에러
// Tiger t = (Tiger)a;
// t.move();
// t.moveTiger();
System.out.println("===================");
// 부모 = 자식 (Tiger) 객체생성 => 업캐스팅
// 메서드 호출
Animal b = new Tiger();
b.move(); // 호랑이 네발로 움직인다
// 자식 = (형변환)업캐스팅된 부모 => 다운캐스팅
// 메서드 호출
Tiger t = (Tiger)b;
t.move(); // 호랑이 네발로 움직인다
t.moveTiger(); // 호랑이 큰 발로 빨리 달린다
package test;
public class Zoo {
public void setEagle(Eagle e) {
System.out.println("Eagle 전달 받음");
e.move();
}
public void setTiger(Tiger t) {
System.out.println("Tiger 전달 받음");
t.move();}
public void setAnimal(Animal a) {
System.out.println("모든 동물 전달 받음");
// a.move();
// 자식 = 업캐스팅된 부모 => 다운캐스팅
Eagle e = (Eagle)a;
e.move();
e.moveEagle();
}
}
Zoo zoo = new Zoo();
zoo.setAnimal(new Eagle());
// 모든 동물 전달 받음
// 독수리 날개로 움직인다
// 독수리 큰 날개로 날다
다운캐스팅 하기전에 원래 자료형 확인
Animal a = new Eagle();
Eagle e = (Eagle)a;
System.out.println(a instanceof Animal); // True
System.out.println(a instanceof Eagle); // True
System.out.println(a instanceof Tiger); // False
Animal aa = new Animal();
System.out.println(aa instanceof Animal); // True
System.out.println(aa instanceof Eagle); // False
System.out.println(aa instanceof Tiger); // False
package test;
public class Shape {
// Shape 도형 클래스 (부모)
// prn() "도형을 그린다"
protected void prn() {
System.out.println("도형을 그린다");
}
}
package test;
public class Circle extends Shape {
// Circle 원 클래스 (자식) 상속 Shape
// 메서드 오버라이딩 prn() "원을 그린다"
protected void prn() {
System.out.println("원을 그린다");
}
}
package test;
import java.util.ArrayList;
public class Test2 {
public static void main(String[] args) {
// 부모 = 자식 업 캐스팅 객체생성
Shape s = new Circle();
// 자식 = 업캐스팅된 부모 객체생성
Circle c = (Circle)s;
// 메서드 호출
c.prn() // 원을 그린다
}
}
// 배열에 모든형 저장
ArrayList a = new ArrayList();
// a.add(1); => 부모형(Object)을 업캐스팅
// a.add("안녕"); => 부모형(Object)을 업캐스팅
a.add(new Circle()); // => 부모형(Object)을 업캐스팅
// 자식 = 업캐스팅 된 부모
Circle c1 = (Circle)a.get(0); // 다운캐스팅
c1.prn(); // 원을 그린다
// 배열에 특정한 형 저장
ArrayList<Circle> a1 = new ArrayList<Circle>();
// a.add(1); -> Error
// a.add("안녕"); -> Error
a1.add(new Circle());
Circle c2 = a1.get(0);
c2.prn(); // 을 그린다
부모클래스 공통된 틀 + 자기자신 클래스
: abstract class (추상메서드, 멤버변수, 메서드)
: 객체생성 할수 없음(부모추상클래스=자식클래스)
부모인터페이스 공통된 틀
: abstract interface(추상메서드)
: 객체생성 할수 없음(부모인터페이스=자식클래스)
package test;
public abstract class AbsAnimal {
// abstract class 추상클래스
// 추상메서드() => 메서드 틀
public abstract void move();
// 구체적인 멤버변수, 메서드()
// 멤버변수
private String name;
// 메서드()
public void prn() {
System.out.println("추상클래스 일반메서드");
}
}
package test;
public class EagleA extends AbsAnimal {
@Override
public void move() {
// TODO Auto-generated method stub
}
// 추상클래스 상속 받으면 에러발생
// 추상메서드(메서드틀) => 오버라이딩(재정의) => 에러해결
// alt shift s -> v
}
AbsAnimal a = new EagleA();
a.move();
a.prn(); // 추상클래스 일반메서드
package test;
public abstract class AbsShape {
// 추상클래스 AbsShape
// public void prn() 추상메서드
// 일반메서드 method() "AbsShape추상클래스 일반메서드()"
public abstract void prn();
public void method() {
System.out.println("AbsShape추상클래스 일반메서드");
}
}
package test;
public class CircleA extends AbsShape{
// 자식클래스 CircleA
// 추상메서드 => 추상메서드 구현(메서드 오버라이딩)
@Override
public void prn() {
}
}
// 부모 = 자식
// 메서드 prn(), method() 호출
AbsShape as = new CircleA();
as.prn();
as.method(); // AbsShape추상클래스 일반메서드