백엔드 과정/Java

[Java] day13. 상속 / 오버라이딩

mim 2022. 1. 4. 19:00
반응형

상속

부모클래스가 가지는 멤버를 자식클래스가 물려받아 자신의 멤버인 것처럼 사용할 수 있도록 만든 기술
멤버 외에 타입 또한 상속이 된다 . 다형성의 토대
자바는 단일 상속(하나의 클래스만을 부모클래스로 가짐)을 지원

 

클래스 간의 상속 시에는 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 클래스의 부모 필드도 초기화하는 생성자 호출함...");
	
	}
반응형