## 커리큘럼(12-30/변경)
```
01. Java (v)
02. git 
03. Database
04. Jsp [Server]

05. 미니프로젝트 (3W)
06. HTML,CSS  
07. JS

08. SpringFramework , SrpingBoot
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)
```
---

# 다형성(Polymorphism)
- **객체가 여러 형태를 가진다**는 의미로 해석되며, 하나의 객체가 여러가지 유형으로 사용되는 것을 의미
- 상속을 전제조건
- 부모 타입에 모든 자식객체가 대입될 수 있음
- `부모클래스 변수  = new 자식클래스()`
- 부모클래스의 변수와 기능만 사용가능하지만 오버라이딩 된 메서드가 있다면 오버라이딩 된 메서드가 실행됨.


```
public class Parent {

	public void method01() {
		System.out.println("부모의 1번 메서드 실행");
	}
	public void method02() {
		System.out.println("부모의 2번 메서드 실행");
	}
}

public class Child extends Parent{

	@Override
	public void method02() {
		System.out.println("자식에 재정의 된 2번 메서드 실행");
	}
	
	public void method03() {
		System.out.println("자식의 3번 메서드 실행");
	}
}

public class MainClass {
	public static void main(String args[]) {
		Child c = new Child();
		c.method01(); // 상속받은 메서드
		c.method02(); // 오버라이드 메서드
		c.method03(); // 자식의 메서드
		
		System.out.println("----다형성 적용-----");
		Parent p = c; // 일시적으로 Parent형으로 형변환
		
		System.out.println("주소값:"+c);
		System.out.println("주소값:"+p);
		
		p.method01();
		p.method02();
		//p.method03(); // x
		/*
		 * 다형성이 적용되면, 본래 멤버에 접근 할 수 없음
		 * 단, 오버라이드 된 메서드는 정상적으로 호출 됨
		 */
	}
}
```

## 클래스 캐스팅(Class Casting)
+ **강제 타입 변환(Type Casting)**
	- 강제 타입 변환은 부모 타입을 자식 타입으로 변환하는 것
	- 부모 타입으로 한번 형변환이 된 자식 객체만 강제 타입 변환을 사용가능
	- Promotion이 일어나면 자식 클래스가 가지고 있는 재정의되지 않은 메서드를 사용할 수 없음.


	```
	public class MainClass{

		public static void main(String args[]){

			Parent p = new Child();

			// Child c = (Child)new Parent(); // Class Cast 오류 발생
			Child c = (Child)p;  // 실행 O 
			c.method03();
		}
	}
	```

## 이종모음(Heterogeneous Collection)
- 배열에 다형성을 적용시키는 원리 (배열은 원래 동종모음 구조)


```
public class HeteroCollectionExample{
	public static void main(String args[]){
		Person[] pArr = new Person[4];

		// 부모 타입 배열에 자식 객체가 저장될 수 있음
		pArr[0]=new Person("홍길동",20);
		pArr[1]=new Student("박진수",17,"201600001");
		pArr[2]=new Teacher("고길동",22,"Java");
		pArr[3]=new Employee("허헌정",23,"교무처");


	}
}
```

## 매개변수의 다형성
- promotion은 멤버 변수의 값을 대입할 때도 발생하지만, 메서드를 호출할 때 사용하는 매개변수에도 발생할 수 있음
- 메서드를 호출할 떄는 메서드 선언부에서 지정한 데이터 타입과 일치하는 매개값을 전달하여 호출하지만, 매개 변수에 다형성을 적용하면 자식 객체를 전달할 수 있음


```
// 매개변수에 객체를 전달하려면 타입의 클래스 타입을 적어주면 됨
// 이떄 Person의 자식 클래스는 전부 전달 될 수 있음
publis static void printPersonInfo(Person p){
	System.out.println("-----");
	System.out.println(p);
}
```

## 클래스 타입 확인
- **instanceof**키워드
- 객체가 지정한 클래스의 인스턴스인지 아닌지 검사할 떄 사용하는 연산자
- `instanceof`연산자의 왼쪽 항의 객체가 오른쪽 항 클래스의 인스턴스가 맞으면 true, 아니면 false를 리턴


```
public static void main(String args[]) {
		Person hong = new Student("홍길동",10,"123");
		Person park = new Teacher("박찬호",20,"체육");
		Person choi = new Employee("창민",30,"가수");
		
		printPerson(hong);
		printPerson(park);
		printPerson(choi);
	}
	
	public static void printPerson(Person p) {
		//p가 Student였으면 Student캐스팅
		//p가 Teacher였으면 Teacher캐스팅
		
		if(p instanceof Student) { // p가 student였으면 true
			Student s =(Student)p;
			System.out.println("p는 원래 Student");
			System.out.println(s.info());
		}
		else if(p instanceof Teacher) {
			Teacher t=(Teacher)p;
			System.out.println("p는 원래 Teacher");
			System.out.println(t.info());
		}
		else if(p instanceof Employee) {
			Employee e = (Employee)p;
			System.out.println("p는 원래 Employee");
			System.out.println(e.info());
		}
	}
```