데이터를 담을 DTO 클래스가 없을 때...
1. 새로 만들어서 사용한다.
2. 상속 관계에 있는 부모 클래스의 DTO를 사용한다.
상속 관계에 있는 클래스는 자식-부모 관계로 지정이 된다. 이 때문에 자식 클래스는 부모 클래스의 것을 얼마든지 사용이 가능하다.
수평적인 구조로 클래스를 설계 시 나타나는 단점
수평적인 구조로 클래스를 설계할 때 나타나는 단점을 줄일 수 있다.
사원을 상속(확장)시켜서 일반사원, 관리사원, 비서사원, 일용직 사원 등을 만들 수 있다.
사원의 정보를 하위 클래스에 상속시켜 코드의 중복을 최소화 하고 하위 클래스별로 필요한 멤버변수를 개별적으로 추가한다면 유지보수 & 확장성을 높일 수 있다.
수직적 구조 = 계층화 = 상속
상속을 통해 코드 중복을 줄이고(코드 재사용) 클린한 코드를 만드는데 도움을 줄 수 있다.
클래스를 수직적인 구조로 설계할 시 얻는 장점
상속을 사용하면 하위클래스가 상위클래스를 재활용 가능하다.
-> 하위클래스가 상위클래스에 접근해 사용 가능
super class : 상위클래스(부모클래스)
sub class : 하위클래스(자식클래스, 파생클래스)
public class Employee {
protected String name;
protected String phone;
protected int age;
protected String empDate;
protected String dept;
protected boolean isMarriged;
}
protected : 상속관계에서 하위클래스가 상위클래스로의 접근을 허용하는 접근권한
public class RempDTO extends Employee { // Employee를 상속가능
public RempDTO() {
super(); // super() : 상위클래스의 생성자를 호출
}
}
하위클래스가 상위클래스를 상속받아 사용하려면 먼저 부모 클래스가 Heap Memory에 할당되어야 한다. 위의 코드는 RempDTO 객체 생성시 super()를 통해 상위클래스의 생성자를 호출해 부모클래스가 먼저 메모리에 올라가게 된다.
따라서 하위클래스의 메모리 공간이 부모클래스의 메모리 공간을 상속받아 확장되어 부모클래스의 멤버도 사용할 수 있게 된다.
-> 접근범위를 부모클래스까지 extend
자바에서 최상위 클래스는 Object클래스이다. 모든 클래스는 기본적으로 Object클래스를 상속받고 있다.
상속을 통해 자식이 부모클래스에 자유롭게 접근이 가능하지만 기본적으로 부모클래스의 멤버변수에 직접 접근하는 것 또한 정보은닉에 위배가 된다. 이러한 정보은닉을 방지하는 것에 대해 생각해봐야한다.
상속관계에서 객체 초기화를 활용해 객체를 생성하는 방법이 있다.
public class RempDTO extends Employee {
public RempDTO(String name, int age, String phone,
String empDate, String dept, boolean isMarriaged) {
super();
this.name = name;
this.age = age;
this.phone = phone;
this.empDate = empDate;
this.dept = dept;
this.isMarriaged = isMarriaged;
}
}
하지만 여전히 자식이 부모클래스의 멤버변수에 직접 접근하게 되므로 정보은닉에 위배된다.
객체의 초기화는 객체자신이 하는 것이 가장 바람직하다.
객체의 초기화는 객체 자신이 하는 것이 가장 바람직하다고 배웠다. 그렇다면 부모클래스의 생성자에서 직접 객체를 초기화하고, 자식클래스에서 super()메서드로 생성자를 호출할 때 매개변수에 값을 저장하면 상속관계에서도 정보은닉에 위배되지 않고 객체를 생성할 수 있다.
public class Employee {
protected String name;
protected String phone;
protected int age;
protected String empDate;
protected String dept;
protected boolean isMarriged;
public Employee() {}
public Empl
}
super()메서드는 생성자 메서드에서 가장 첫 문장에 사용해야 한다. super()는 상위 클래스의 메서드를 호출하는 메서드이기 때문에 하위 클래스의 생성자가 초기화가 되기 전 먼저 호출되어야 하므로 항상 하위 생성자 메서드의 가장 첫 문장에 사용되어야 한다.