[23.01.06] 53일차 [백엔드]

W·2023년 1월 6일
0

국비

목록 보기
80/119

업캐스팅

부모 = 자식 객체생성

다운캐스팅(명시적)

자식 = (부모 = 자식 객체생성)

  • Animal 클래스 (부모)
package test;

public class Animal {
	
	public void move() {
		System.out.println("동물이 움직인다");
	}
}
  • Eagle 클래스 (자식)
package test;

public class Eagle extends Animal {

	@Override
	public void move() {
		System.out.println("독수리 날개로 움직인다");
	}

	public void moveEagle() {
		System.out.println("독수리 큰 날개로 날다");
	}
}
  • Tiger 클래스 (자식)
package test;

public class Tiger extends Animal {
	// 메서드 오버라이딩 부모의 move 메서드 재정의
	
	@Override
	public void move() {
		System.out.println("호랑이 네발로 움직인다");
	}

	public void moveTiger() {
		System.out.println("호랑이 큰 발로 빨리 달린다");
	}

}
  • Main 클래스
		// 부모 = 자식 (업캐스팅)
		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(); // 호랑이 큰 발로 빨리 달린다
  • Zoo 클래스
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());
        // 모든 동물 전달 받음
		// 독수리 날개로 움직인다
		// 독수리 큰 날개로 날다

instanceof

다운캐스팅 하기전에 원래 자료형 확인

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

연습

  • Shape 클래스(부모)
package test;

public class Shape {
	
	// Shape 도형 클래스 (부모)
	// prn() "도형을 그린다"
	
	protected void prn() {
		System.out.println("도형을 그린다");
	}
}
  • Circle 클래스(자식)
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(추상메서드)
: 객체생성 할수 없음(부모인터페이스=자식클래스)

  • AbsAnimal 클래스(추상클래스)
package test;

public abstract class AbsAnimal {
	
	// abstract class 추상클래스
	// 추상메서드() => 메서드 틀
	public abstract void move();
	
	// 구체적인 멤버변수, 메서드()
	// 멤버변수
	private String name;
	// 메서드()
	public void prn() {
		System.out.println("추상클래스 일반메서드");
	}
	
}
  • EagleA 클래스(자식)
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(); // 추상클래스 일반메서드

연습

  • AbsShape 클래스(추상)
package test;

public abstract class AbsShape {
	
	// 추상클래스 AbsShape
	// public void prn() 추상메서드
	// 일반메서드 method() "AbsShape추상클래스 일반메서드()"
	
	public abstract void prn();
	
	
	public void method() {
		System.out.println("AbsShape추상클래스 일반메서드");
	}
	
}
  • CircleA 클래스(자식)
package test;

public class CircleA extends AbsShape{
	
	// 자식클래스 CircleA
	// 추상메서드 => 추상메서드 구현(메서드 오버라이딩)
	
	@Override
	public void prn() {
		
	}
}
  • 메인
		// 부모 = 자식
		// 메서드 prn(), method() 호출
		
		AbsShape as = new CircleA();
		as.prn();
		as.method(); // AbsShape추상클래스 일반메서드

0개의 댓글