코딩 기록들

[Java Programming] 8.1 상속 본문

Java

[Java Programming] 8.1 상속

코딩펭귄 2024. 1. 26. 14:59

상속

- Inheritance : 상속/계승 /  "확장"

- A클래스를 상속(계승)해 B클래스를 만드는것

- Java에서 상속은 extends로 표현

- 상속을 사용하는 예 : 하나의 클래스를 확장해 다양한 클래스를 만들어내기 위함 (멤버변수 혹은 인스턴스 메소드 추가)

package vending_machine_explain;

/**
 * 자판기에서 판매할 상품의 정보 (데이터클래스)
 */
public class Product {
	/**
	 * 상품의 이름
	 */
	String name; // 정보안주면 null 할당됨
	/**
	 * 상품의 가격
	 */
	int price; // 정보안주면 0 할당됨	
	/**
	 * 상품의 재고 (수량 관리 위함)
	 */
	int quantity; 
    
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getQuantity() {
		return quantity;
	}
	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}
}
package vending_machine_explain;

public class TemperatureProduct extends Product { // 확장은 1개의 클래스만 가져올 수 있음

	//온도정보 추가
	/**
	 * 상품이 뜨거운지,차가운지에 대한 정보
	 * true = 뜨거운 상품
	 * false = 차가운 상품
	 */
	private boolean isHot;
	
	public boolean getIsHot() {
		return this.isHot;
	}

	public void setIsHOt(boolean isHot) {
		this.isHot = isHot;
	}
}
public static void main(String[] args) {
		
		Product p = new Product();
		TemperatureProduct tp = new TemperatureProduct();
		
		p.getName();
		p.getPrice();
		p.setName(null);
		// Product를 확장했기때문에 tp도 p의 것들 쓸 수 있음
		tp.getName();
		tp.getPrice();
		tp.getQuantity();
		tp.getIsHot();
		tp.setName(null);
		tp.setPrice(0);
		tp.setQuantity(0);
		tp.setIsHOt(false);
}

 

자바는 모든 클래스가 object클래스를 상속받기 때문에 별도의 object클래스를 상속해주지 않아도, 상속이 되어있음

 

object가 product에게 상속을 해주고, product가 temperature에게 상속해주어서 object 클래스 사용가능함

 

 

클래스 상속

형태

class 자식클래스 extends 부모클래스{
   ///필드, 생성자, 메소드 등등
}
상속의 특징

1: 여러개의 부모클래스 상속할수 없음 = extends뒤에는 1개의 부모클래스만 올수있음

2.부모클래스에서 private접근제한을 갖는 필드와 메소드는 상속대상에서 제외됨 (부모-자식클래스가 다른패키지에 존재하면 default접근제한을 갖는 필드와 메소드도 상속대상에서 제외됨)

 

부모생성자 호출

- 모든 객체는 클래스의 생성자를 호출해야만 생성됨, 여기에는 부모객체도 해당됨

- 부모생성자는 자식생성자의 맨 첫줄에서 호출됨. ex) .super() 이 맨 첫줄 = 부모의 기본생성자 호출

 

 

 

상속의 관계 IS A

클래스끼리 상속을 받으면 IS A 관계가 생김

Sub class IS A Super class (O)  <-> Super class IS A Sub class (X)

super class(product class) -> 상속을 해준 클래스

sub class (temperature class) -> 상속을 받은 클래스

 

 

IS A 관계에 있는것들은 이렇게 표현할 수 있음(type이 달라도 상속받은 IS A 관계 이므로 할당 가능해짐)

ex) Contact emailContact = new EmailContact();

 

 

 

상속관계에서의 형변환 예시

- tp에만있고 p에는 없는것들은 형변환 해주면 됨

public static void printTemperatureProduct(TemperatureProduct tp) {
System.out.println(tp.getName()); //null
}
public class Mart {
	
	//tp는p를 상속받은것이므로 아래코드는 생략가능함
    //단, tp에만있고 p에는 없는것들은 형변환 해주면 됨
	//public static void printTemperatureProduct(TemperatureProduct tp) {
    //System.out.println(tp.getName()); //null
    //}
	
	public static void printProduct(Product p) {
//	public static void printProduct(Object p) {
		System.out.println(p.getName()); //null
//		System.out.println(otherP.getName()); //null
	
		if (p instanceof TemperatureProduct ) { //tp가 전달되면
			TemperatureProduct tp = (TemperatureProduct) p; //형변환 해주고
			tp.setIsHOt(true);
			System.out.println(tp.getIsHot());
		}
	}

	public static void main(String[] args) {
		
		Product p = new Product();
		TemperatureProduct tp = new TemperatureProduct();
		
		tp.setName("티피");
		printProduct(tp);
		//printTemperatureProduct(tp);
		printProduct(p); // 출력됨
		//printTemperatureProduct(p); //IS A 관계를 역행하는것이기 때문에 안됨
		
	}
모든 클래스의 슈퍼클래스는 Object
 Object
 --> Product
 --> TemperatureProduct
 Product is a Object
 --> TemperatureProduct is a Product
 ---> TemperatureProduct is a Object