본문 바로가기

KOSA FullStack 교육/java

KOSA fullStack 교육(상속)

상속의 개념

 

객체 간의 공통된 속성과 행동을 도출해 상위 개념으로 일반화하는 과정을 추상화라고 하며,

이러한 상위 개념을 기반으로 점차 세부 기능을 추가하고 특화시켜 나가는 과정을 구체화라고 한다. 

 

자바는 다른 언어와 다르게 최상위 부모 클래스가 존재한다. 바로 Object!

즉, 자바에서 만드는 모든 클래스는 Object를 암묵적으로 상속받고 있다.

 

주요 내장 함수는 다음과 같다.

 

toString() - 객체를 문자열로 표현 (기본: 주소값 반환)

equals(Object obj) - 두 객체가 같은지 비교 (기본: 주소 비교)

hashCode() - 객체의 해시값 반환

clone() - 객체 복제

getClass() - 런타임 시 클래스 정보 반환

finalize() - 가비지 컬렉션 전에 호출

notify(), notifyAll(), wait() - 스레드 동기화 관련

자식생성자는 무조건 부모 생성자를 호출한다. super()

부모 명시적 생성자 호출 super(empno, name, salary, birthDate);

 

메소드 오버라이딩

오버라이딩은 상속받은 메서드를 자식 클래스에서 재정의하는 것을 의미하며, 흔히 **“메서드 재정의”**라고도 부른다.
public String toString() {

return super.toString()+","+dept;

}

 

  • 이 코드는 자바에서 기본 제공되는 toString() 메서드를 두 번 오버라이딩한 구조이다.
  • super.toString()은 **부모 클래스(Employee)의 toString()**을 호출한다.
  • 그 결과에 dept(부서 정보 등)를 추가로 붙여 출력 결과를 확장한다.

오버라이딩의 두단계

  1. 상속한다 → 부모 클래스의 메서드를 물려받음
  2. 재정의한다 → 자식 클래스에서 구현부를 고쳐서 원하는 기능을 덧붙임

 

 

사진을 보면 super 키워드는 현재 클래스의 ‘직접 부모 클래스’를 가리킨다는 것을 알 수 있다.

toString() 메서드는 현재 클래스의 직접 부모인 Employee 클래스에서 이미 오버라이딩되어 있기 때문에,

super.toString()은 Object의 toString()이 아닌, Employee의 toString()을 호출한다.

반면, clone() 메서드는 Employee에서 별도로 오버라이딩되어 있지 않고,

그 부모가 Object 클래스이기 때문에 → super.clone()을 통해 곧바로 Object.clone()이 호출된다.

 

 

HeteroGeneous Collection

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

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

또한 배열의 특징으로

1. ReSizing이 안됨 -> 사이즈가 변경되면 새로운 배열이 만들어짐

2. Same Data Type -> 데이터 타입이 같은 서로다른 값들을 저장

= Homogeneous Collection (동족간의 집합체)

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

= Heterogeneous Collection

다음은 헤테로지니어스에 대한 설명이다

Manager[] managers

Engineer[] engineers

Secretary[] secretaries

-> Employee[] employees

Parent Type으로 여러개의 자식 객체들을 단일하게 관리할 수 있다.

 

public class HeterogenousCollectionTest1 {

	public static void main(String[] args) {
		Employee [] employees = {
				new Manager(111, "김00", 34000.0, new MyDate(1929,12,10), "Node.js"),
				new Manager(112, "이00", 34000.0, new MyDate(1929,12,10), "React"),
				new Engineer(113, "곽00", 34000.0, new MyDate(1929,12,10), "기획부", 300),
				new Engineer(114, "최00", 34000.0, new MyDate(1929,12,10), "기획부", 200),
				new Secretary(115, "강00", 34000.0, new MyDate(1929,12,10), "Name1"),
		};
		
		
		for(Employee e: employees) {
			System.out.println(e);
		}
	}

}

왜 각각의출력이 잘 나올까? Employee의 toString()은 Employee의 필드만 출력해야하는데

 

virtual Method Invocation 원리 : 상속 관계시 오버라이딩한 자식에서만 발생하는 현상
(여기서의 Virtual은 자식)
컴파일 시점 -> 부모의 메소드 호출
실행 시점 -> 자식 메소드 호출

 

Object Casting

for(Employee e: employees) {
			if(e.getEmpNo() == 333) {
				//e.setTech("AI");
				Engineer eg = (Engineer)e;
				//Object 캐스팅
				eg.changeTech("AI");
			}
		}

 

위와같이 e.setTech("AI")를 호출하면 에러가 뜬다. 

왜냐하면 Employee 클래스는 setTech 라는 메서드, 즉 tech라는 필드도 없기 때문이다. 

이는 Engineer라는 자식 클래스에 존재하기 때문에, (Engineer)e를 해주어야 한다. 이것이 Object Casting이다.