- 어떤 클래스의 필드와 메소드를 다른 클래스가 물려 받아 사용하는 것
- 부모클래스가 자식클래스에게 필드와 메소드를 물려준다.
- 자바에서는 부모클래스를
슈퍼클래스(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());
}
}
상속을 이용하면 이렇게 길었던 코드를 짧고 빠르게 작성할 수 있다.