※ 본 글은 Oracle의 java-developers-guide를 참고하였습니다.
자바에 대한 개인적 공부와 정리를 위해 Oracle의 공식적인 자바 개발자를 위한 가이드를 보며
주기적으로 글을 작성하도록 해본다.
1.1.4 자바 클래스 계층 구조
자바는 클래스들을 대규모 계층 구조 내에서 정의한다. 계층 구조의 최상위에는 Object 클래스가 있다.
자바의 모든 클래스는 상위 클래스의 상속 체인을 따라 올라가면서 어떤 수준에서든 Object 클래스로부터 상속받는다. 클래스 B가 클래스 A로부터 상속받는다고 할 때, 클래스 B의 각 인스턴스는 클래스 B에 정의된 모든 필드뿐만 아니라 클래스 A에 정의된 모든 필드를 포함한다.
1-4는 일반적인 자바 클래스 계층 구조를 보여준다.FullTimeEmployee 클래스는 Employee 클래스에서 상속받기 때문에 Employee 클래스에 정의된 id와 lastName 필드를 포함한다. 추가로 FullTimeEmployee 클래스는 보너스 필드를 추가하며, 이는 FullTimeEmployee 클래스에만 포함된다.
클래스 B의 인스턴스는 클래스 A나 클래스 B에 정의된 메서드를 호출할 수 있다. 예를 들어, FullTimeEmployee 인스턴스는 FullTimeEmployee 클래스에 정의된 메서드와 Employee 클래스에 정의된 메서드를 호출할 수 있다.
클래스 B의 인스턴스는 클래스 A의 인스턴스 대신 사용할 수 있으며, 이는 객체 지향 언어의 코드 재사용성을 높이는 강력한 구조 중 하나다. 클래스 라이브러리의 기존 기능을 활용하면서도 계층 구조 내에서 논리적으로 동작과 상태를 정의하는 클래스를 생성할 수 있다.
Employee 클래스는 PartTimeEmployee와 FullTimeEmployee라는 두 개의 하위 클래스를 가지고 있다. PartTimeEmployee는 일정(schedules)을 추적해야 하고, FullTimeEmployee는 보너스를 받을 수 있다.
모든 FullTimeEmployee는 월급제로 일하면 면제(Exempt)로 간주되며, 시간당 급여를 받으면 비면제(NonExempt)로 간주된다. 각각은 salaryToDate를 다르게 계산한다.
- ex) 기본 클래스 : Employee(직원)
class Employee {
String id;
String lastName;
public Employee(String id, String lastName {
this.id = id;
this.lastName = lastName;
}
public void displayEmployeeInfo() {
System.out.println("ID: " + id + ", 성: " + lastName);
}
}
- 'Employee' 클래스는 직원의 ID와 성(lastName)을 속성으로 가지고 있으며, 직원 정보를 출력하는 메서드를 가진다.
- ex) 하위 클래스 : PartTimeEmployee (파트타임 직원)
파트타임 직원은 일정(schedule)을 추가로 관리해야 한다.
class PartTimeEmployee extends Employee {
String schedule;
public PartTimeEmployee(String id, String lastName, String schedule) {
super(id, lastName);
this.schedule = schedule;
}
public void displaySchedule() {
System.out.println("ID: " + id + ", 일정: " + schedule);
}
}
- 'PartTimeEmployee' 클래스는 'Employee' 클래스를 상속받아 id와 lastName을 재사용하고, 추가로 일정(schedule)을 속성으로 가진다.
- ex) 하위 클래스: FullTimeEmployee(정규직 직원)
정규직 직원은 보너스를 받을 수 있으므로, 보너스를 추가로 관리하는 클래스를 만든다.
class FullTimeEmployee extends Employee {
double bonus;
public FullTimeEmployee(String id, String lastName, double bonus) {
super(id, lastName);
this.bonus = bonus;
}
public void displayBonus() {
System.out.println("ID: " + id + ", 보너스 : " + bonus);
}
}
- 'FullTimeEmployee' 클래스는 'Employee' 클래스를 상속받아 id와 lastName을 재사용하고, 추가로 보너스(bonus)를 속성으로 가진다.
- ex) 예시 사용
public class Main {
public static void main(String[] args) {
PartTimeEmployee partTimeEmployee = new PartTimeEmployee("PT123", "김", "월,수,금");
FullTimeEmployee fullTimeEmployee = new FullTimeEmployee("FT456", "이", 500000);
partTimeEmployee.displayEmployeeInfo();
partTimeEmployee.displaySchedule();
fullTimeEmployee.displayEmployeeInfo();
fullTimeEmployee.displayBonus();
}
}
- 이 예시는 'Employee' 클래스를 상속받아 파트타임 직원과 정규직 직원을 각각 표현하는 방법을 보여준다. 이처럼 상속을 사용하면 공통적인 기능을 재사용하고, 각 클래스에 맞는 고유한 기능을 추가할 수 있어 코드의 효율성과 가독성을 높일 수 있다.
'자바 기초' 카테고리의 다른 글
자바 기초 개념 - 메모리 공간 관리 (0) | 2024.07.15 |
---|---|
자바 기초 개념 - Oracle DB에서 Java 사용 (0) | 2024.07.12 |
자바 기초 개념 - 언어의 주요 특징 / JVM (0) | 2024.07.10 |
자바 기초 개념 - 캡슐화 / 다형성 (0) | 2024.07.09 |
자바 기초 개념 - 상속 / 인터페이스 (0) | 2024.07.08 |