코딩 기록들
[Java Programming] 8.1 상속 본문
상속
- 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
'Java' 카테고리의 다른 글
[Java Programming] 9.1 추상화, 인터페이스 (1) | 2024.01.29 |
---|---|
[Java Programming] 8.2 다형성 (메소드 오버라이딩) (0) | 2024.01.26 |
[Java Programming] 7.1 메소드 오버로딩 (1) | 2024.01.26 |
[Java Programming] 7.4 배열 (0) | 2024.01.26 |
[Java Programming] 7.3 String Concatenation, String Buffer (0) | 2024.01.25 |