JAVA 객체 지향 핵심

(JAVA)인터페이스(interface) - 19

mynote6676 2025. 4. 23. 17:46

학습 목표

1. 인터페이스에 개념을 이해하자.

2. 인터페이스와 추상클래스를 사용해서 코드 작성해보기

 

1. 인터페이스에 개념을 이해하자.

● 모든 메서드가 추상 메서드로 선언됨 public abstract

● 모든 변수는 상수로 선언됨 public static final

 

package com._interface;
//HOW-interface를 선언하며 된다.
//여기안에 선언된 메서드는  모두 추상메서드가 되어야한다.
//WHY
public interface Animal {
    //public interface Animal

    //메서드 선언부만 있고 바디가 없다.
    public abstract void eat();
    //void eat
    //생략이 가능하다 . abstract키워드
    void move();
    //void move();

}

 

package com._interface;

//인테페이스는 구현받다. 구현하다.(생성이라는 말을 쓰지 않고)
//Animal이라는 인터페이스를 구현받다.
public class Dog implements Animal {
    //public class Dog implements Animal{

    //추상클래스를 구현 메서드로 재정의 해야함

    @Override
    public void eat() {
        System.out.println("강아지가 먹이를 먹습니다.");
        //@Override
        //public void eat
        //System,out,ptintln("강아지가 먹이를 먹습니다.")
    }

    @Override
    public void move() {
        System.out.println("강아지가 달린다.");
        //@Override
        //public void move(){
        //Sustem.our.println("강아지가 달립니다.")
    }

    public static void main(String[] args) {
        //public static void main(String[] args){

        
        //다형성
        Animal dog = new Dog();//업캐스팅
        Animal bird = new Bird();//업캐스팅
        // Animal dog = new Dog();
        // Animal bird = new Bird();

        dog.eat();
        dog.move();
        bird.eat();
        bird.move();
    }

}


class Bird implements Animal{
    //class Bird implements Animal

    @Override
    public void eat() {
        System.out.println("새가 먹이를 먹습니다");
        //@Override
        //public void eat(){
        //System.out.println("새가 먹이를 먹습니다");

    }

    @Override
    public void move() {
        System.out.println("새가 하늘을 날아다닙니다.");
        //@Override
        //public void move(){
        //System.out.println("새가 하늘을 날아다닙니다.");
    }
}

 

 

추상 클래스와 인터페이스를 활용해서 코드를 작성해 보자.

package com._interface;

public abstract class HomeAppliances {

    int width;
    int height;
    String color;

//    public void turnOn() {
//        System.out.println("전원을 켠다");
//    }
//
//    public void turnOff() {
//        System.out.println("전원을 끕니다.");
//    }
}

 

package com._interface;

public interface RemoteController {

    //인터페이스란 구현된것이 아무것도 없는 그림만 있는 기본 설계도이다.
    //모든 변수는 상수가 된다. public int final int N;
    //모든 메서드는 추상 메서드가 된다. 심지어 abstract도 키워드도 생략가능.

    //추상클래스보다 추상화가 더 높다.
    //TODO 인테페이스 사용할때 무언가 동작 중심의 클래스를 선언해야할때 사용해야한다.

    //인터 페이스는 표준이다. 또는 강제성있는 규약이다.

    //오직 static final 상수만을 가질 수 있다.
    public static final int SERIAL_NUMBER = 100;

    public abstract void turnOn();
    public abstract void turnOff();
}

 

package com._interface;

public interface SoundEffect {

    public abstract void soundOn();
}

 

package com._interface;

//
public class Television extends HomeAppliances implements RemoteController{

    @Override
    public void turnOn() {
        System.out.println("티비 전원을 켭니다.");
    }

    @Override
    public void turnOff() {
        System.out.println("티비 전원을 끕니다.");
    }
}

 

 

package com._interface;

public class Refrigerator extends HomeAppliances
        implements RemoteController,SoundEffect{

    @Override
    public void turnOn() {
        System.out.println("냉장고를 켭니다.");
    }

    @Override
    public void turnOff() {
        System.out.println("냉장고를 끕니다.");
    }

    @Override
    public void soundOn() {
        System.out.println("띠리리리링~~ 냉장고 문이 열림");
    }
}

 

package com._interface;

//장난감 로봇이 가전을 받게 된다면 의미가 맞지 않음!!
//추상 클래스보다 더 유현한 설계 기법인 인터페이스가 있다.
public class ToyRobot implements RemoteController, SoundEffect {
//public class ToyRobot implements RemoteComtroller, SoundEffect{
    String name;

    @Override
    public void turnOn() {
        System.out.println("장난감 로봇을 켭니다");
    }

    @Override
    public void turnOff() {
        System.out.println("장난감 로봇을 끕니다.");
    }

    @Override
    public void soundOn() {
        System.out.println("뚜뚜~~뚜~~뚜뚜");
    }
}

 

 

 

package com._interface;

public interface Calc {

    //인터페이스는 public abstract생략가능
    int add(int n1, int n2);
    int sub(int n1, int n2);
    int multi(int n1, int n2);
    int divide(int n1, int n2);

}

 

 

package com._interface;

public abstract class Calulator implements Calc {
}

 

 

package com._interface;

public class CompleteCalc extends Calulator {


    @Override
    public int add(int n1, int n2) {
        return 0;
    }

    @Override
    public int sub(int n1, int n2) {
        return 0;
    }

    @Override
    public int multi(int n1, int n2) {
        return 0;
    }

    @Override
    public int divide(int n1, int n2) {
        return 0;
    }
}