가쟤의 해변일기 🐳

풀스택과정 3주차 - Homogeneous Collection | Heterogeneous Collection | Polymorphism | Object Casting | Virtual Method Invocation 본문

풀스택과정

풀스택과정 3주차 - Homogeneous Collection | Heterogeneous Collection | Polymorphism | Object Casting | Virtual Method Invocation

바닷가쟤 2025. 4. 25. 10:14
💡 2024 04 23
1. Homogeneous Collection | Heterogeneous Collection
2. Polymorphism
3. Object Casting
4. Virtual Method Invocation

 

Homogeneous Collection | Heterogeneous Collection

Homogeneous Collection : 동일한 타입으로 구성된 집합

Heterogeneous Collection : 다양한 타입으로 구성된 집합

Polymorphism : 다형성(상속)

 

코드가 어떻게 바뀌는지 파악해야 상속에 대한 이해가 가능

 

상속은 절대 점선 X 실선으로 표현 !

화살표는 부모로 향하게 표현한다.

 

상속을 하면 하나의 덩어리로 메모리로 올라간다.

결합도가 높기 때문에 무섭다 . . ㅎㄷㄷ

 

부모 필드에 구분하기 위한 unique한 값과 not null이 무조건 필요하다.

“부모 필드” = 다른 엔티티(혹은 테이블)에서 참조하는 기준이 되는 필드로, 보통 PK(Primary Key) 역할

Unique (고유해야 함)

다른 레코드와 절대 같은 값이 있으면 안 됨

→ 왜? 참조할 때 구분할 수 있는 기준이 필요하니까!

Not null (절대 null이 되면 안 됨)

값이 없으면 누구를 참조하는지 알 수 없기 때문

→ 왜래키(Foreign Key)로 쓰기 위해선 항상 값이 있어야 함

자식 생성자 → 무조건 부모 생성자 호출 … super();

null, 0 이런 기본값이 들어가면 안 되기 때문에 부모 명시적 생성자 호출해야 함. super(name, salary, birthDay, empno); 이렇게…

 

이럴 경우 기본 생성자 public Employee() {} 가 필요 없음

Step 1. 부모가 가지는 기능을 물려받는다.

Step 2. 자식은 자기에게 맞는 기능으로 고쳐쓴다.

 

메소드 오버라이딩

(상속 관계에 있는 부모, 자식 클래스에서만 발생)

메소드 선언부는 동일

메소드 구현부는 반드시 달라야 한다.

배열은 여러 개의 데이터를 저장할 수 있는 일정의 Collection이다.

클래스가 제공되지 않기 때문에 특정한 데이터를 저장, 삭제, 수정, 가져올 대마다 직접 기능을 만들어야 하는 번거로움이 있다.

또한 배열의 특징으로

  1. ReSizing이 안 됨 — 사이즈가 변경되면 새로운 배열이 만들어짐
  2. Same Data Type — 데이터 타입이 같은 서로 다른 값들을 저장 : Homogeneous Collection (동종간의 집합체)

상속 기술이 적용되는 순간 이기종간의 집합체가 가능하다

→ Heterogeneous Collection이 만들어진다.

⭐ 부모 타입으로 여러 타입의 자식 객체들을 단일하게 관리할 수 있다 ! wow

→ Heterogeneous Collection

System.out.println(employees);

이 코드를 실행하면 주소값이 나온다.

그렇다면?

public class HeterogenousCollectionTest1 {

	public static void main(String[] args) {
		// 이기종간의 집합체... Same Data Type이 무너짐
		Employee[] employees = { new Manager("김관식", 111, new MyDate(1975, 10, 10), "기획부", 10, "hi"),
				new Manager("박해일", 222.0, new MyDate(1974, 5, 20), "기획부", 20, "hi"),
				new Engineer("아이유", 333.5, new MyDate(1979, 2, 1), 30, "java", 200),
				new Engineer("James", 444.8, new MyDate(1977, 3, 25), 40, "기획부", 300),
				new Security("박해일", 555.3, new MyDate(1972, 4, 15), 50, "James") };

		System.out.println(employees);
		for (Employee e : employees)
			System.out.println(e);
	}
}

for (Employee e : employees)

System.out.println(e);

(이 코드를 실행하면 객체가 출력된다. .toString을 오버라이딩 해서 사용했음)

왜???

✅ Virtual Method Invocation 원리

→ 상속 관계 시 오버라이딩 한 자식에서만 발생하는 현상

컴파일 시점 — 부모의 메소드 호출

실행 시점 — 실질적으로 갖다 쓴 자식을 실행해버림(부모 자식이 오버라이딩으로 연결되어 있어서..)

Virtual은 자식 객체의 메서드가 실행된다는 뜻!

이렇게 자식 메소드에 바로 접근하려고 하면 안 된다!!!!

The method changeTech(String) is undefined for the type Employee 에러 뜸

그래서 이 때, 오브젝트 캐스팅을 해 줘야 함.

for(Employee e: employees) {
			if(e.getEmpno() == 30) {
				//e.changeTech("AI");
				Engineer eg = (Engineer) e;
				eg.changeTech("Python");
			}
		}

위 코드와 ((Engineer) e).changeTech("AI"); 이 것은 같은 코드이다.

✅ 배열 관련된 유용한 기능을 가지고 있는 클래스

  • Arrays.copyOf()
  • Arrays.toString(배열)
  • System.arraycopy(source, o, target, 0, length)
  •  
		System.out.println(Arrays.toString(employees));
		
		System.out.println("\n========Employee's AnnualSalary X X X X X ==========");
		int annualSalary = 0;
		for(Employee e: employees)
			annualSalary += (e.getSalary() * 12);
		System.out.println("Employees All Cost => " + annualSalary + " !!");
		
		
		System.out.println("\n========Employee's AnnualSalary ==========");
		int total = 0;
		for(Employee e : employees) {
			if(e instanceof Engineer)
				total += (int)(e.getSalary() * 12) + ((Engineer) e).getBonus();
			else
				total += (int)(e.getSalary() * 12);
		}
		System.out.println("Employees All Cost => " + total + " !!");

부모 타입으로 여러 자식 객체들을 관리할 때 특정한 타입의 자식 객체를 찾을 수 있어야 한다.

→ instanceof 키워드를 사용

if(e instanceof Engineer)

 

부모 타입으로 다양한 자식 객체를 만들어 내는 기술

부모 타입의 Container에 다양한 자식 객체들을 담아내는 기법

  • Object Casting
  • Virtual Method Invocation
  • Instanceof
728x90