본문 바로가기
코리아 IT아카데미/Java

9일차| 다형성, 업캐스팅, 배열다형성, 다운캐스팅, 추상메서드, 템플릿 메서드 패턴

by Sharon kim 2021. 10. 28.
chapter03 복습순서
메모
ch04>
Archer
Hero
Warrior
Wizard
MainTest1
-------------
Person
Student
Teacher





ch05>
Banana
Peach
Fruit
-------------
MainTest1
MainTest2
MainTest3
-------------
DownCastingTest
ch06>
Animal
AnimalTest
Human
Tiger
ch07>
Computer
Desktop
MyNoteBook
NoteBook
MainTest1
-------------
AlCar
Car
ManulCar
MainTest2




 

궁사, 히어로, 전사, 마법사 클래스 설계

클래스 사용

package ch04;

public class MainTest1 {

	// main function_start of code
	public static void main(String[] args) {

		Warrior warrior1 = new Warrior("전사", 100);
		Archer archer1 = new Archer("궁수", 100);
		Wizard wizard1 = new Wizard("마법사", 50);

		String name = warrior1.name; // hero
		int hp = warrior1.hp; // hero
		warrior1.attack(); // hero
		
		warrior1.comboAttack(); // warrior
		
	}// end of main
}// end of class

 


상속 형태


과일(부모) ← 바나나, 복숭아(자식들) 클래스 설계

다형성 : 과일이면서도 복숭아 · 바나나이기도 한 것

예시 : 먹는 배, 바다에 띄우는 배, 신체 배

package ch05;

public class MainTest1 {

	public static void main(String[] args) {

		Banana banana = new Banana();
		Peach peach = new Peach();

		banana.showInfo();
		System.out.println("--------------------");
		peach.showInfo();

		// 자바에서 다형성이란
		// 부모 타입 인스턴스 변수에 자식 객체를 생성할 수 있다.
		Fruit fruit = new Banana(); // 업 캐스팅 된 상태
		// 바나나의 주소값이 과일에 담김
		// 부모 자식 관계에서 사용 가능하다._상속구조일때만
		// 그 역은 성립하지 않는다.
		// 즉 자식 인스턴스 변수에(참조변수)
		// 부모 인스턴스를 생성시킬 수 없다.
//		Banana banana2 = new Fruit(); (x)
		

	}
}

업캐스팅

package ch05;

import java.util.Scanner;

public class MainTest2 {

	public static void main(String[] args) {
		
		final int BANANA = 1;
		final int PEACH = 2;
		
		//스캐너 
		//사용자가 입력한 1,2 받으면 해당하는 객체에 정보를
		//화면에 출력해 주세요
		
		System.out.println("바나나 : 1, 복숭아 : 2");
		Scanner sc = new Scanner(System.in);
		int userInput = sc.nextInt();
		
		Fruit fruit;
		
		//만약 1번이라면 바나나 객체를 생성하고 
		//showInfo 메서드를 호출해 주세요.
		//아니라면 복숭아 객체를 생성해서 
		//showInfo 메서드를 호출해 주세요.
		if(userInput == BANANA) {
			fruit = new Banana(); //업 캐스팅
		}else {
			fruit = new Peach();
		}
		fruit.showInfo(); //1,2
		//사용자가 입력한 값에 따라서 인스턴스를 쉽게
		//바꿔 줄 수 있다.
		
//		Fruit fruit1 = new Banana();
//		Fruit fruit2 = new Peach();
//		
//		if(userInput == 1 ) {
//			fruit1.showInfo();
//		}else {
//			fruit2.showInfo();
//		}
		
	}
}

배열로 다형성을 써보자

package ch05;

public class MainTest3 {

	public static void main(String[] args) {
		// 다형성 : 배열 (자료구조) 관계에서도 사용 가능
		// 하나의 변수에 연관된 데이터를 통으로 관리하기 위해 사용

		// 1.
		Banana banana1 = new Banana();
		Banana banana2 = new Banana();

		Banana[] bananaBuket = new Banana[2];
		bananaBuket[0] = banana1;
		bananaBuket[1] = banana2;

		// 1분 foreach _showInfo 호출
		for (Banana banana : bananaBuket) {
			banana.showInfo();
		}
		//복숭아
		Peach peach1 = new Peach();
		Peach peach2 = new Peach();
		
		//배열 사용해서 담아 주세요
		//배열은 2칸
		Peach[] peachBuket = new Peach[2];
		peachBuket[0] = peach1;
		peachBuket[1] = peach2;
		
		//for 사용해서 showInfo 메서드 호출
//		for (Peach peach : peachBuket) {
//			peach.showInfo();
//		}
		//3. 다형성을 사용한다면 
		System.out.println("~~~~~~~~~~~~~~~~~~~~~");
		Fruit[] fruitBuket = new Fruit[4];
		fruitBuket[0] = banana1;
		fruitBuket[1] = peach1;
		fruitBuket[2] = banana2;
		fruitBuket[3] = peach2;
		
		for (Fruit fruit : fruitBuket) {
			fruit.showInfo();
		}
	}
}

다운캐스팅

package ch05;

public class DownCastingTest {

	public static void main(String[] args) {
		
	 //1.바나나에 origin 멤버 변수를 추가
		Fruit fruit = new Banana(); // 업캐스팅
                                            //    ↓
//		fruit.origin;	           // 다운캐스팅
		//컴파일러는 부모 타입 인스턴스 변수타입을 바라보고 있는 상태
		//다운 캐스팅을 사용한다면 가능 
		//(컴파일러에게 자식 객체 타입으로 바라보라고 명시)
		 String origin = ((Banana)fruit).origin;
		 System.out.println("원산지 : "+ origin);
		//컴파일 타임 - 사람이 작성한 언어를 기계언어(0,1)로 변환하는 것
		
		//런타임 - 프로그램을 실행했을 때 
		
	}//end
}//end

상속 오버라이드 

package ch06;

public class AnimalTest {

	public static void main(String[] args) {

		Animal hAnimal = new Human();
		Animal tAnimal = new Tiger();
		
		hAnimal.move();
		System.out.println("--------------------");
		tAnimal.move();
	}
}

컴퓨터 관련 클래스 설계 , 상속 , 추상클래스 객체 생성 X

package ch07;

public class MainTest1 {

	public static void main(String[] args) {
		
//		Computer computer = new Computer();
		//추상클래스로는 객체를 생성할 수없다
		Computer computer = new DeskTop();
		computer.turnOn();
		computer.display();
		computer.turnOff();
		
		System.out.println("------------------------");
		
		NoteBook noteBook = new MyNoteBook();
		noteBook.turnOn();
		noteBook.display();
		noteBook.turnOff();
	}

}

추상메서드 만들기 abstract

추상메서드를 직접 구현한 일반 메서드 만들기

package ch07;

public class AICar extends Car {
//추상메서드 만들기 abstract
	
	//추상메서드를 직접구현한 일반메서드 만들기
	@Override
	public void drive() {
		System.out.println("자율 주행합니다.");
		System.out.println("자동차가 스스로 방향을 바꿉니다.");
	}

	@Override
	public void stop() {
		System.out.println("스스로 멈춥니다.");
	}

	@Override
	public void wiper() {
		System.out.println("스스로 와이퍼를 동작합니다.");
		
	}
	
	@Override
		public void washCar() {
			System.out.println("스스로 세차를 합니다.");
		}
	
//	private void run() {
//		// TODO Auto-generated method stub
//
//	}
}

템플릿 메서드 패턴

package ch07;

public abstract class Car {
	
	public void startCar() {
		System.out.println("시동을 켭니다.");
	}
	public void turnOff() {
		System.out.println("시동을 끕니다.");
	}
	public abstract void drive();
	public abstract void stop();
	public abstract void wiper();
	
	//후크(hook)메서드 : 필요하면 가져다가 쓰는 것 
	public void washCar() {

	}
	
	//템플릿메서드 패턴
	//핵심 !!
	//하위 클래스에서 재정의 할 수 없게 해야 한다. --> final
	final public void run() {
		startCar();
		drive();
		wiper();
		stop();
		turnOff();
		washCar();
		
	}
}

 

package ch07;

public class ManualCar extends Car{

	@Override
	public void drive() {
		System.out.println("사람이 운전을 합니다.");
		System.out.println("사람이 핸들을 조작 합니다.");
	}

	@Override
	public void stop() {
		System.out.println("브레이크를 밟아서 정지합니다.");
	}

	@Override
	public void wiper() {
		System.out.println("사람이 와이퍼를 작동합니다.");
		
	}

}

 

package ch07;

public class MainTest2 {

	public static void main(String[] args) {
		
		Car aiCar = new AICar();
		aiCar.run();
		System.out.println("------------------");
		
		Car manualCar = new ManualCar();
		manualCar.run();
		//프레임워크란 실행의 흐름이 
		//정해져 있기 때문에 그 안에서 흐름을 
	}//end

}//end



수업내용

[출처] https://blog.naver.com/devnote1 작성자 devnote1