추상클래스(abstract Class) : 일반필드 + 일반메소드 [+ 추상메소드]
인터페이스(interface) : only 상수필드 + 추상메소드
인터페이스 사용 전
Person Class
package com.kh.chap02_abstractAndInterface.part02_basic.model.vo;
public abstract class Person {
private String name;
private double weight;
private int health;
public Person() {
}
public Person(String name, double weight, int health) {
this.name = name;
this.weight = weight;
this.health = health;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public String toString() {
return "name : " + name + ", weight : " + weight + ", health : " + health;
}
public abstract void eat();
public abstract void sleep();
}
Mother Class
package com.kh.chap02_abstractAndInterface.part02_basic.model.vo;
public class Mother extends Person implements Basic {
private String babyBirth; // 아이의 탄생 출산|입양|없음
public Mother() {
}
public Mother(String name, double weight, int health, String babyBirth) {
super(name, weight, health);
this.babyBirth = babyBirth;
}
public String getBabyBirth() {
return babyBirth;
}
public void setBabyBirth(String babyBirth) {
this.babyBirth = babyBirth;
}
@Override
public String toString() {
return super.toString() + ", babyBirth : " + babyBirth;
}
@Override
public void eat() {
// 밥먹으면 몸무게 10증가
super.setWeight(super.getWeight() + 10);
// 건강도 10 감소
super.setHealth(super.getHealth() - 10);
}
@Override
public void sleep() {
// 잠자면 건강도 20 증가
super.setHealth(super.getHealth() + 20);
}
}
Baby Class
package com.kh.chap02_abstractAndInterface.part02_basic.model.vo;
public class Baby extends Person implements Basic{ // 상속 => 단일상속 | 다중상속 => 인터페이스
public Baby() {
}
public Baby(String name, double weight, int health) {
super(name, weight, health);
}
@Override
public String toString() {
return super.toString();
}
@Override
public void eat() {
// 밥먹으면 몸무게 3증가
super.setWeight(super.getWeight() + 3);
// 건강도 1증가
super.setHealth(super.getHealth() + 1);
}
@Override
public void sleep() {
// 잠자면 건강도 3 증가
super.setHealth(super.getHealth() + 3);
}
}
실행 Class
package com.kh.chap02_abstractAndInterface.part02_basic.run;
import com.kh.chap02_abstractAndInterface.part02_basic.model.vo.Baby;
import com.kh.chap02_abstractAndInterface.part02_basic.model.vo.Mother;
import com.kh.chap02_abstractAndInterface.part02_basic.model.vo.Person;
public class BasicRun {
public static void main(String[] args) {
// Person p = new Person(); 추상클래스라서 객체 생성 안됨
Person mom = new Mother("김엄마", 50, 70, "출산");
Person baby = new Baby("김아기", 3.5, 70);
System.out.println(mom);
System.out.println(baby);
// 동적 바인딩
mom.eat(); // 몸무게 + 10 / 건강도 - 10
baby.eat(); // 몸무게 + 3 / 건강도 + 1
mom.sleep(); // 건강도 + 20,
baby.sleep(); // 건강도 + 3
System.out.println("==========다음날============");
System.out.println(mom);
System.out.println(baby);
}
}
실행 결과
인터페이스 사용 후
인터페이스 생성
package com.kh.chap02_abstractAndInterface.part02_basic.model.vo;
public interface Basic {
// 추상클래스(abstract Class) : 일반필드 + 일반메소드 [+ 추상메소드]
// 인터페이스(interface) : only 상수필드 + 추상메소드
// private int a;
/*
public void test() { => 얘 못쓴다.
}
*/
// 인터페이스에서의 필드는 무조건 상수필드임!!
/*public static final*/ int NUM = 10;
// 인터페이스에서의 메소드는 무조건 추상 메소드임!!
/*public abstract*/ void eat();
/*public abstract*/ void sleep(); // public abstract 생략가능
}
Person Class
package com.kh.chap02_abstractAndInterface.part02_basic.model.vo;
public abstract class Person {
private String name;
private double weight;
private int health;
public Person() {
}
public Person(String name, double weight, int health) {
this.name = name;
this.weight = weight;
this.health = health;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public String toString() {
return "name : " + name + ", weight : " + weight + ", health : " + health;
}
// public abstract void eat();
// public abstract void sleep();
}
Mother Class (인터페이스 사용 전과 같다.)
package com.kh.chap02_abstractAndInterface.part02_basic.model.vo;
public class Mother extends Person implements Basic {
private String babyBirth; // 아이의 탄생 출산|입양|없음
public Mother() {
}
public Mother(String name, double weight, int health, String babyBirth) {
super(name, weight, health);
this.babyBirth = babyBirth;
}
public String getBabyBirth() {
return babyBirth;
}
public void setBabyBirth(String babyBirth) {
this.babyBirth = babyBirth;
}
@Override
public String toString() {
return super.toString() + ", babyBirth : " + babyBirth;
}
@Override
public void eat() {
// 밥먹으면 몸무게 10증가
super.setWeight(super.getWeight() + 10);
// 건강도 10 감소
super.setHealth(super.getHealth() - 10);
}
@Override
public void sleep() {
// 잠자면 건강도 20 증가
super.setHealth(super.getHealth() + 20);
}
}
Baby Class (인터페이스 사용 전과 같다.)
package com.kh.chap02_abstractAndInterface.part02_basic.model.vo;
public class Baby extends Person implements Basic{ // 상속 => 단일상속 | 다중상속 => 인터페이스
public Baby() {
}
public Baby(String name, double weight, int health) {
super(name, weight, health);
}
@Override
public String toString() {
return super.toString();
}
@Override
public void eat() {
// 밥먹으면 몸무게 3증가
super.setWeight(super.getWeight() + 3);
// 건강도 1증가
super.setHealth(super.getHealth() + 1);
}
@Override
public void sleep() {
// 잠자면 건강도 3 증가
super.setHealth(super.getHealth() + 3);
}
}
실행 Class
package com.kh.chap02_abstractAndInterface.part02_basic.run;
import com.kh.chap02_abstractAndInterface.part02_basic.model.vo.Baby;
import com.kh.chap02_abstractAndInterface.part02_basic.model.vo.Basic;
import com.kh.chap02_abstractAndInterface.part02_basic.model.vo.Mother;
public class BasicRun {
public static void main(String[] args) {
// Basic b = new Basic(); // 래퍼런스 변수로는 사용 가능하나 객체 생성은 불가능함
Basic mom = new Mother("김엄마", 50, 70, "출산");
Basic baby = new Baby("김아기", 3.5, 70);
System.out.println(mom);
System.out.println(baby);
mom.eat();
baby.eat();
mom.sleep();
baby.sleep();
System.out.println("==========다음날============");
System.out.println(mom);
System.out.println(baby);
}
}
실행 결과
클래스에서 클래스를 상속받을 때 : 클래스 extend class : (단일 상속만 가능) : 화살표 실선
클래스에서 인터페이스를 구현할때 : 클래스 implements 인터페이스1, 인터페이스2, ... (다중구현가능) : 화살표 점선
인터페이스에서 인터페이스를 상속 : 인터페이스 extends 인터페이스1, 인터페이스2, ...(다중상속가능) : 화살표 실선