JAVA

[자바/JAVA] 프로그래밍 - 다형성 (Polymorphism) - 추상(abstract) - Interface

21종 2023. 6. 13. 21:13

추상클래스(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, ...(다중상속가능) : 화살표 실선