Programming/JAVA

[JAVA] 다형성(3) / 인터페이스 / 관련 예제

Jayna. 2023. 12. 27. 17:12
728x90

 

인터페이스 

접근제한자 interface 인터페이스이름 {     
      상수필드
     
      추상메소드
}

 

 - 상수필드와 추상메소드만으로 이루어진 추상클래스의 변형체

 - 인터페이스에서 필드는 상수필드이다.

 - 인터페이스에서 메소드는 추상메소드이다.

 - 구현해야하는 게 있을 때 인터페이스에 틀만 만들어두고 상속하게 된다.

 - 인터페이스는 다중상속을 허용.

   => 메소드가 겹치더라도 최종 구현 부분은 실제 구현 클래스에서 기술하기 때문

 - 추상클래스보다 좀 더 강한 규칙성, 강제성을 가진다.

 

 

추상클래스와 인터페이스

 1. 공통점 

 - 객체 생성은 안되나, 참조변수로 사용 가능(다형성 적용 가능)

 - 상속하는 클래스에 추상메소드를 오버라이딩하도록 강제한다.

 

2. 차이점

 - 추상클래스: 클래스 멤버 변수로, 함수 생성이 가능하고 추상메소드가 포함되어 있거나, abstract 키워드를 통해 정의됨

 - 인터페이스 : 모든 필드는 상수필드, 모든 메소드는 추상메소드로 정의해야 함

 

  => 존재하는 목적이 다름

  추상클래스는 추상클래스를 상속받아서 기능을 이용하고, 클래스 확장해서 쓸 것

  인터페이스는 클래스의 기능(메소드) 구현을 강제하기 위해서 사용

  (구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있다.)

 

728x90

extends 와 implements

 - 클래스 간의 상속 관계

자식클래스 extends 부모클래스

 

- 클래스와 인터페이스의 구현 관계

클래스 implements 인터페이스

 

- 인터페이스 간의 상속 관계

자식인터페이스 extends 부모인터페이스1, 부모인터페이스2

 

public interface Basic {
    //인터페이스 정의
    //인터페이스에서는 무조건 상수필드와 추상메소드밖에 정의가 불가하므로
    //접근제한자 예약어 생략 가능!

    //상수필스
    /*public static final*/ int NUM = 10;

    //추상메소드
    /*public abstract*/void eat();
    /*public abstract*/void sleep();

    // => 인터페이스의 모든 필드들은 암묵적으로 public ,  상수필드이다.
    // => 인터페이스의 모든 메소드들은 암묵적으로 public, abstract이다.
}

>> 예제

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 "Mother [ "+ super.toString() + " , babyBirth : " + babyBirth + "]"; 
    }
    @Override
    public void eat() { // 밥을 먹으면
        // 몸무게 10증가
        // 부모의 필드 weight +10
        // 수정할 몸무게 == 기존의 몸무게 +10
        super.setWeight(super.getWeight()+10);
    }
    @Override
    public void sleep() { //잠을 자면
        // 10만큼 건강해짐
        super.setHealth(super.getHealth()+10);
    }
}
public class Baby extends Person implements Basic  {
    //필드부 없음
    //생성자부 기본생성자,  매개변수 생성자
    public Baby() {

    }
    public Baby(String name, double weight, int health) {
    	super(name, weight, health);
    }

    //메소드부
    //toString
    @Override
    public String toString() {
    	return "Baby["+super.toString()+"]";
    }

    @Override
    public void eat(){
        //몬무게 5증가
        super.setWeight(super.getWeight()+5);
        //건강 5증가
        super.setHealth(super.getHealth()+5);
    }

    @Override
    public void sleep() {
        //건강 10
        super.setHealth(super.getHealth()+10);
    }
}
public class FamilyRun {
    public static void main(String[] args) {
        //Person p = new Person();
        // Person은 추상클래스이므로 객체 생성 불가

        //다형성 적용 인터페이스 적용 전
        /*
        Person mom = new Mother("김엄마",50,80,"출산");

        Person baby = new Baby("김응애",3.3,90);

        System.out.println(mom);
        System.out.println(baby);

        mom.eat();   //몸무게 +10
        baby.eat();  //몸무게 +5, 건강+15

        mom.sleep();   //건강 +10
        baby.sleep();  // 건강 +10

        System.out.println("======다음날======");
        System.out.println(mom);
        System.out.println(baby);
        */

        // 2. 인터페이스 적용 후
        //Basic b = new Basic();    //객체 생성 불가능

        Basic mom = new Mother("김엄마",50,80,"출산");
        Basic baby = new Baby("김응애",3.3,90);

        System.out.println(mom);
        System.out.println(baby);
    }
}
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;
    }

    @Override
    public String toString() {
    	return "name = " + name + " weight = " + weight + " health = " + health;
    }

    //public abstract void eat();
    //public abstract void sleep();
}
728x90