상속
부모클래스가 가지는 멤버를 자식클래스가 물려받아 자신의 멤버인 것처럼 사용할 수 있도록 만든 기술
멤버 외에 타입 또한 상속이 된다 . 다형성의 토대
자바는 단일 상속(하나의 클래스만을 부모클래스로 가짐)을 지원
클래스 간의 상속 시에는 extends 키워드를 사용
public
class Academy extends Company{}
장점
새로운 클래스를 작성 시 기존에 작성 된 클래스의 재사용 가능
클래스간 계층 관계가 형성되어 다형성 문법의 토대가 됨
단점
부모클래스의 기능 변경 시 자식클래스의 정상적인 동작 유무 예측이 힘듦
자식클래스가 물려받아 사용하는 기능들을 부모클래스에서 변경 시 어려움이 따름
부모클래스로부터 물려받은 기능이 자식클래스에서는 무의미 할 수 있음
장단점을 고려해 볼 때 IS A 관계로 구분되는 경우에만 사용 해야 함
IS-A
자식클래스는 하나의 부모 클래스이다 의 관계로 , 부모클래스의 멤버들을 자식클래스가 상속 받음
super
부모클래스의 인스턴스 주소 를 보관하는 레퍼런스 변수
자식클래스 내의 모든 생성자와 메소드 내에서 부모클래스의 레퍼런스 변수를 사용할 수 있음
super()
부모 생성자 를 호출하는 구문으로 매개변수의 타입 , 개수 , 순서가 일치하는 부모의 생성자를 호출하게 됨
this() 는 해당 클래스의 생성자를 호출하는 구문이다
super() 는 부모클래스가 가지는 private 생성자를 제외한 나머지 생성자를 호출하는 구문이다.
오버라이딩
부모클래스에서 상속받은 메소드를 자식클래스가 재정의 하여 사용하는 것
1. 메소드 이름 동일
2. 메소드 리턴 타입 동일
3. 매개변수의 타입 , 개수 , 순서 가 동일
4. private 메소드는 오버라이딩 불가능
5. final 키워드가 사용된 메소드는 오버라이딩 불가능
6. 접근제한자는 부모 메소드와 같거나 더 넓은 범위여야 함
7. 예외처리는 같은 예외이거나 더 구체적 하위 인 예외를 처리해야 함
수업코드 ) 생성자 단축키 Alt + Shift + S !! getter/setter도 자동 생성 가능하다!!!
ProductDTO
public class ProductDTO {
/* 관리하려는 상품의 속성을 추상화해서 DTO 클래스를 만든다. */
private String code; //제품코드
private String brand; //제품사
private String name; //제품명
private int price; //제품가격
private java.util.Date menuFacturingDate; //제품제조일자
/* 기본 생성자 */
public ProductDTO() {
System.out.println("ProductDTO 클래스의 기본 생성자 호출함...");
}
/* 모든 필드를 초기화 하는 생성자 */
public ProductDTO(String code, String brand, String name,
int price, Date manuFacturingDate) {
/* 아무 클래스도 상속받지 않았는데 super()가 호출된다.
* java.lang.Object 클래스의 생성자를 호출하는 것이다.
* 모든 클래스는 Object 클래스의 후손이기 때문이다.
* */
super();
this.code = code;
this.brand = brand;
this.name = name;
this.price = price;
this.menuFacturingDate = manuFacturingDate;
System.out.println("ProductDTO 클래스의 매개변수 있는 생성자 호출함...");
}
ComputerDTO 클래스는 하나의 상품이다. (is-A)
ProductDTO 클래스를 상속 받아 작성할 것이다.
public class ComputerDTO extends ProductDTO {
/* Computer가 가지는 추가적인 속성을 필드로 작성한다. */
private String cpu;
private int hdd;
private int ram;
private String operationSystem;
/*기본생성자*/
public ComputerDTO() {
System.out.println("ComputerDTO 클래스의 기본 생성자 호출함...");
}
/*모든 필드를 초기화하는 생성자*/
public ComputerDTO(String cpu, int hdd, int ram, String operationSystem) {
/* 부모클래스의 기본 생성자 호출*/
super();
this.cpu = cpu;
this.hdd = hdd;
this.ram = ram;
this.operationSystem = operationSystem;
System.out.println("ComputerDTO 클래스의 모든 필드를 초기화 하는 생성자 호출함...");
}
/* 부모의 필드도 모두 초기화하는 생성자 */
public ComputerDTO(String code, String brand, String name,
int price, Date manuFacturingDate
,String cpu, int hdd, int ram, String operationSystem) {
/* 부모의 모든 필드를 초기화하는 생성자로 ProductDTO 클래스가 가진 필드를 초기화 할 값 전달*/
super(code, brand, name, price, manuFacturingDate);
// this(cpu, hdd, ram,operationSystem);
/* 위와 같이 작성하면 this()로 다시 한번 생성자를 호출하기 때문에
* 생성자 두번 호출은 허용되지 않는다. */
this.cpu = cpu;
this.hdd = hdd;
this.ram = ram;
this.operationSystem = operationSystem;
System.out.println("ComputerDTO 클래스의 부모 필드도 초기화하는 생성자 호출함...");
}
'백엔드 과정 > Java' 카테고리의 다른 글
[Java] day14. 다형성 (1) | 2022.01.05 |
---|---|
Java 문제풀이. 홀수를 입력받아 오름/내림차순으로 출력하기 (배열) (0) | 2022.01.04 |
[Java] day12. 객체배열 (0) | 2022.01.04 |
[Java] day11. 오버로딩 / Static (0) | 2022.01.03 |
Java 문제풀이. 랜덤한 로또번호 중복없이 오름차순 정렬하기 (0) | 2021.12.31 |