12. 상속(Inheritance) [ JAVA ]

duck-ach·2022년 7월 28일
0

JAVA

목록 보기
12/27
post-custom-banner

상속(Inheritance)

  • 어떤 클래스의 필드와 메소드를 다른 클래스가 물려 받아 사용하는 것
  • 부모클래스가 자식클래스에게 필드와 메소드를 물려준다.
  • 자바에서는 부모클래스를 슈퍼클래스(super) 자식클래스를 서브클래스(sub)라고 한다.

상속의 장점

  • 동일한 메소드를 클래스마다 여러 번 정의할 필요가 없다.
  • 클래스를 계층(부모-자식) 관계로 관리할 수 있다.
  • 클래스의 재사용과 확장이 쉽다.
  • 새로운 클래스의 작성 속도가 빠르다.

    상속구조

상속 관계의 클래스

상속관계를 나타낼 때

public class 서브클래스 extends 슈퍼클래스 {
}

이렇게 나타낸다.

public class Student extends Person {
	public void study() {
    
    }
}
public class Researcher extends Person {
	public void study() {
    
    }
}
public class Professor extends Researcher {
	public void study() {
    
    }
}
  • 서브클래스의 객체는 슈퍼클래스의 메소드를 사용할 수 있다.
    서브클래스의 객체를 생성할 때 슈퍼클래스의 객체가 먼저 생성된다.
public class Person {
	public Person() {
    	System.out.println("Person 생성");
    }
}
public class Student extends PErson {
	public Student() {
    	System.out.println("Student 생성");
    }
}
public class Ex {
	public static void main(String[] args) {
    	Student student = new Student();
    }
}

// 실행결과 : 
// Person 생성   // 슈퍼클래스의 생성자가 먼저 호출되고,
// Student 생성  // 서브클래스의 생성자가 나중에 호출된다.

사람과 학생이 하는 일을 나타내시오.

사람이 할 수 있는 일 (먹는다. 잔다. 걷는다.) 학생이 할 수 있는 일 (먹는다. 잔다. 걷는다. 공부한다.)

public class Person {
	
	public void eat() {
		System.out.println("먹는다.");
	}
	
	public void sleep() {
		System.out.println("잔다.");
	}
	
	public void walk() {
		System.out.println("걷는다.");
	}
	
}

public class Student extends Person {
	
	public void study() {
		System.out.println("공부한다.");
	}
	
		
	
}

public class StudentMain {

	public static void main(String[] args) {
		
		Student student = new Student();
		
		student.eat(); 		// 먹는다.
		student.sleep();	// 잔다.
		student.walk();		// 걷는다.
		student.study();	// 공부한다.
		
		
		
	}

}

상속(Inheratance)은 이렇게 공통된 사항을 부모클래스(super class)에 묶어서 자식클래스(sub class)에 물려주는 형태로 캡슐화 할 수 있도록 도와준다.

예제

자동차가 하는 일

자동차(달린다), 전기차(달린다, 충전한다), 하이브리드차(달린다, 충전한다, 기름넣는다)

// 부모 클래스
public class Car {
	public void Run() {
		System.out.println("달린다.");
	}
}
// 자식 클래스
public class Ev extends Car{
	public void Evol() {
		System.out.println("충전한다.");
	}
}
// 자식의 자식 클래스
public class Hybrid extends Ev {
	public void Oil() {
		System.out.println("기름넣는다.");
	}
}

public class CarMain {

	public static void main(String[] args) {
		
		Hybrid hybrid = new Hybrid();
		
		System.out.println("자동차 : ");
		hybrid.Run();
		
		System.out.println();
		
		System.out.println("전기차 : ");
		hybrid.Run();
		hybrid.Evol();
		
		System.out.println();
		
		System.out.println("하이브리드 : ");
		hybrid.Run();
		hybrid.Evol();
		hybrid.Oil();
		
    //자동차 : 
	//달린다.

	//전기차 : 
	//달린다.
	//충전한다.

	//하이브리드 : 
	//달린다.
	//충전한다.
	//기름넣는다.


	}

}

군인이 총을 쏘는 것을 구현하라.

먼저 클래스를 참조하여 구현을 해보겠다.

public class Gun {

	// 필드
	private String model;
	private int bullet;
	private final int MAX_BULLET = 15;
	
	// 메소드
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public int getBullet() {
		return bullet;
	}
	public void setBullet(int bullet) {
		this.bullet = bullet;
	}
	
	// 장전
	public void reload(int bullet) {
		if(this.bullet == MAX_BULLET) {
			return;
		}
		this.bullet += bullet;
		this.bullet = (this.bullet > MAX_BULLET) ? MAX_BULLET : this.bullet;
	}
	
	// 총쏘기
	public void shoot() {
		if(bullet == 0) {
			return;
		}
		bullet--;
	}

	
}
public class Soldier  {
	
	// 필드
	private Gun gun;
	
	// 메소드
	public Gun getGun() {
		return gun;
	}

	public void setGun(Gun gun) {
		this.gun = gun;
	}
	
	public void reload(int bullet) {
		gun.reload(bullet);
	}
	
	public void shoot() {
		gun.shoot();
	}
	
	
}
public class SoldierMain {

	public static void main(String[] args) {
		
		Gun gun = new Gun();
		gun.setModel("K2");
		gun.setBullet(9);
		
		Soldier soldier = new Soldier();
		soldier.setGun(gun);
		
		// soldier가 총을 쏜다.
		soldier.shoot();
		
		// soldier가 장전한다.
		soldier.reload(1);
		
		
		// soldier가 가지고 있는 gun의 model
		System.out.println(soldier.getGun().getModel());
		System.out.println(soldier.getGun().getBullet());
		
	}

}

이것을 상속으로 구현 해보겠다.
상속

public class Gun {

	// 필드
	private String model;
	private int bullet;
	private final int MAX_BULLET = 15;
	
	// 메소드
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public int getBullet() {
		return bullet;
	}
	public void setBullet(int bullet) {
		this.bullet = bullet;
	}
	
	// 장전
	public void reload(int bullet) {
		if(this.bullet == MAX_BULLET) {
			return;
		}
		this.bullet += bullet;
		this.bullet = (this.bullet > MAX_BULLET) ? MAX_BULLET : this.bullet;
	}
	
	// 총쏘기
	public void shoot() {
		if(bullet == 0) {
			return;
		}
		bullet--;
	}

	
}
package ex04_has_a_inherit;

// Soldier has a Gun.
public class Soldier extends Gun{
	

}
public class SoldierMain {

	public static void main(String[] args) {
		
		Soldier soldier = new Soldier();
		soldier.reload(10);
		soldier.shoot();
		soldier.shoot();
		soldier.reload(6);
		System.out.println(soldier.getBullet());

	}
}

상속을 이용하면 이렇게 길었던 코드를 짧고 빠르게 작성할 수 있다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가
post-custom-banner

0개의 댓글