Java

인터페이스 Interface, 동작을 정의하는 추상타입

데브노트 2025. 4. 23. 17:05

⭐인터페이스

Interface

객체의 동작을 정의하는 추상타입으로
클래스가 구현할 메서드의 설계도를 제공한다.

👍다형성
👍 유연성
👍 코드재사용성을 높일 수 있다.

 

예제 1)

인터페이스(동물 )

클래스(새,개)

설계를 통해 인터페이스 사용법을 알아봤다.

 

public interface Animal { //인터페이스

}

public class Bird implements Animal { //구현클래스

}

public class Dog implements Animal {  //구현클래스

}

package com.interface_.animal;
/**
 * 4.23 인터페이스
 *
 * How
 * Interface를 선언하면 된다.
 * 여기 안에 선언된 메서드는
 * 모두 추상메서드가 돼야 한다.
 *
 * Why?
 */
public interface Animal {

    //추상메서드 선언
    public abstract void eat(); // 메서드 선언부만 있고 바디가 없다.

    public void move(); // abstract 생략 가능

}//end of Animal
package com.interface_.animal;
/**
 * 4.23 인터페이스
 */
public class Bird implements Animal{

    @Override
    public void eat() {
        System.out.println("새가 모이를 먹는다");
    }

    @Override
    public void move() {
        System.out.println("새가 하늘을 난다");
    }
    
}//end of Bird
package com.interface_.animal;
/**
 * 4.23 인터페이스
 * <p>
 * 인터페이스는 상속이 아니라 구현받다, 구현하다 라고 말한다.
 * <p>
 * Animal 인터페이스를 구현받았다.
 */
public class Dog implements Animal {

    //추상메서드를 구현메서드로 재정의 해야 한다.
    @Override
    public void eat() {
        System.out.println("강아지가 먹이를 먹는다");
    }

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

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

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

        dog.eat();
        dog.move();
        System.out.println();
        bird.eat();
        bird.move();

    }//end of main

}//end of dog

 

예제 2)

인터페이스(리모콘,음향)

추상클래스(가전)

구현클래스(티비,냉장고,로봇,)

설계를 통해 인터페이스 사용법을 알아봤다.

 

⭐바텀업!

먼저 티비, 냉장고, 로봇 클래스를 만든 뒤

공통된 부분을 추상클래스로

동작 부분은 인터페이스로 선언해간다.

 

public interface RemoteController { //인터페이스

}

public interface SoundEffect { //인터페이스

}

 

public abstract class HomeAppliances { //추상클래스

}

 

public class TV extends HomeAppliances //추상클래스 상속

implements RemoteController, SoundEffect { //인터페이스 구현

}

public class Refrigerator extends HomeAppliances //추상클래스 상속

implements RemoteController , SoundEffect { //인터페이스 구현

}

public class Refrigerator implements Animal, SoundEffect { //인터페이스 구현

 

2-1.TV 클래스

package com.interface_.appliance;
/**
 * 4.23 인터페이스 2강
 */
public class Television extends HomeAppliances implements RemoteController {

//    //member
//    int width;
//    int height;
//    String color;
//
//    //method
//    public void turnOn() {
//        System.out.println("TV전원을 켠다");
//    }
//    public void turnOff() {
//        System.out.println("TV전원을 끈다");
//    }

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

    @Override
    public void turnOff() {
        System.out.println("티비 전원을 끈다");
    }
    
}//end of TV

 

2-2.냉장고

package com.interface_.appliance;
/**
 * 4.23 인터페이스 2강
 */
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("냉장고 문이 열렸다고 경고한다");
    }
}//end of Refrige

 

2-3.장난감로봇

package com.interface_.appliance;
/**
 * 4.23 인터페이스 2강
 *
 * 지금처럼 장난감 로봇이 가전을 상속받는다면 혼동이 올 수 있다.
 *
 * 추상클래스보다
 * 더 유연한 설계기법이 필요하다.
 *
 * 그것이 인터페이스 Interface 다.
 */
public class ToyRobot implements RemoteController, SoundEffect {

    String name;

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

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

    @Override
    public void soundOn() {
        System.out.println("장난감 로봇이 소리를 낸다");
    }
    
}//end of TR

 

2-4.가전 (추상클래스)

package com.interface_.appliance;
/**
 * 4.23 인터페이스 2강
 */
public abstract class HomeAppliances implements RemoteController {

    //member
    int width;
    int height;
    String color;

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

}//end of HA

 

2-5. 리모콘 (인터페이스)

package com.interface_.appliance;
/**
 * 4.23 인터페이스 2강
 *
 * 인터페이스 개념정리
 */
public interface RemoteController {

    /*
    ⭐인터페이스란

    구현된 것이 아무것도 없는
    밑 그림만 있는 기본 설계도다.

    모든 변수는 상수가 된다.
    public static final int N;

    모든 메서드는 추상메서드가 된다.
    심지어 abstract 키워드도 필요 없다.

    추상클래스보다 추상화 수준이 더 높다.

    ⭐Why
    인터페이스는
    동작 중심의 클래스를 선언해야 할 때 사용한다.

    인터페이스는 동작 중심이다.

    인터페이스는 표준이다.

    또는 강제성 있는 규약이다.
     */

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

    //오직 abstract 추상 메서드만을 가질 수 있다.
    public abstract void turnOn();
    public void turnOff();

}//end of RemoteController

 

2-6. 음향(인터페이스)

package com.interface_.appliance;
/**
 * 4.23 인터페이스 2강
 */
public interface SoundEffect {

    //추상메서드
    public abstract void soundOn();

}//end of SE

 

2-7. 코드 실행부

package com.interface_.appliance;
/**
 * 4.23 인터페이스 2강
 */
public class MainTest1 {
    //main
    public static void main(String[] args) {
        /*
        인터페이스를 사용하면
        유연한 코드를 설계할 수 있다.
         */
        RemoteController[] remoteControllers = new RemoteController[3];

        remoteControllers[0] = new Television(); //다형성
        remoteControllers[1] = new Refrigerator();
        remoteControllers[2] = new ToyRobot();

        /*
        인터페이스는 표준이다.
        또는 강제성 있는 규약이다.
         */
        for (int i = 0; i < remoteControllers.length; i++) {
            remoteControllers[i].turnOn(); //한번에 모든 전원을 켰다.
        }

    }//end of main
}

 

예제 3)

다음 코드다이어그램(uml) 구현

 

 

Calc, 인터페이스로 작성

 

 

 

 

Claclator, 추상클래스로 작성

 

 

 

 

CompleteCalc, 구현클래스로 작성

 

 

 

⭐코드설계가 이미 완성돼 있다면

탑다운으로 작성하더라도 문제가 없다.

 

3-1.Calc(인터페이스) 작성

package com.interface_;
/**
 * 4.23 인터페이스 3강
 */
public interface Calc { //인터페이스 선언

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

}//end of Calc

 

3-2. Calculator(추상클래스) 작성

package com.interface_;
/**
 * 4.23 인터페이스 3강
 */
public abstract class Calculator implements Calc {

}//end of Calculator

 

3-3. CompleteCalc(구현클래스) 작성

F2를 누르면 구현메서드를 딸깍하고 만들 수 있다.

package com.interface_;
/**
 * 4.23 인터페이스 3강
 */
public class CompleteCalc extends Calculator{

    @Override
    public void add(int n1, int n2) {

    }

    @Override
    public void sub(int n1, int n2) {

    }

    @Override
    public void multi(int n1, int n2) {

    }

    @Override
    public void divide(int n1, int n2) {

    }

}//end of CompleteCalc