JAVA

[ java ] 인터페이스 (다중구현, static, default)

Adose 2025. 3. 31. 17:51

📌 인터페이스란?

public interface Flyable {
    public void 날다();
}

public class 나비 implements Flyable{
    @Override
    public void 날다() {
        System.out.println("나비가 훨훨 납니다");
    }
}

public class FlyableTest {
    public static void main(String[] args) {
        Flyable flyable = new 나비();
        //객체 생성은 안되지만 타입으로 사용 가능 
    }
}
  • 인터페이스는 클래스가 구현해야할 메서드의 형식을 정의하는 청사진(계약서) 역할을 한다.
    • 인터페이스를 구현할때는 implemets를 사용한다.
    • 클래스를 만들때는 그 인터페이스를 구현! 하는 것이기 때문에, 구현한다 라고 말한다.
    • 인터페이스 → 구현, 클래스 → 상속
  • 실제 구현코드는 없고, 메서드의 이름, 매개변수, 반환타입만 정의한다.
    • 모든 메소드추상 메소드 여야 한다.
    • → But !! 자바 8 이후 default, static 메서드는 허용한다.
  • 필드 가지지 못한다. 하지만 상수는 선언할 수 있다.
    • 인터페이스에 선언된 상수는 인터페이스를 통해서 접근할 수 있다.
  • 객체 생성은 안되지만 타입으로 사용이 가능하다
  • 다중 구현이 가능
    • 하나의 클래스가 여러 인터페이스 구현이 가능하다.
  • 인터페이스끼리 상속받으면, class는 상속받은 그 interface 메서드까지 구현해야 한다.

 

🔥인터페이스 특징

📌 인터페이스끼리 상속받으면, class는 상속받은 그 interface 메서드까지 구현해야 한다.

  • 아래는 예시코드이다.
  • InterABC는 3개의 언터페이스를 상속 받았다.
  • InterTest는 InterABC를 구현하고, 각각의 상속된 메서드를 구현해야 한다.
public interface InterABC extends InterA,InterB,InterC{
    public void methodABC();
}

public class InterTest implements InterABC{
    @Override
    public void methodA() {
        
    }

    @Override
    public void methodABC() {

    }

    @Override
    public void methodB() {

    }

    @Override
    public void methodC() {

    }
}

 

📌 인터페이스의 다중 구현?

  • interface A, B 를 동시에 구현할때, 같은 메서드를 가지고 있어도 오류가 나지 않는다
    • Ex. InterA, InterB 둘다 methodB()를 가지고 있다.

❓ 같은 메서드를 가지고 있어도 오류가 나지 않는 이유 !

  • 어차피 실제 메서드는 구현한 부분에서 사용한다.
  • 여러개 있어도 구현체 부분(클래스에서)만 사용해서 , 중복 메서드가 어디에 있는지는 중요하지 않다. → 어차피 클래스에 구현된 구현체가 실행됨
  • 그래서 인터페이스는 다중 구현이 가능하다.
public interface InterA {

    public void methodA();
    public void methodB();
}
public interface InterB {

    public void methodB();
}

public class Test implements InterA, InterB{
		@Override
    public void methodA() {
        
    }

    @Override
    public void methodB() { 
    //어차피 구현한 부분에서 methodB가 사용되기 때문에, 
    //인터페이스 메서드 중복이 발생해도 상관없다. 
  

    }

}

 

 

📌 인터페이스의 상수 선언

  • 인터페이스에서 변수를 선언하면, 상수로 본다.
    • 왜 ? → 자동으로 public static final이 붙는다.
public interface InterA {
		int AGE = 10 //public static final 생략되어져 있음 

    public void methodA();
   
}

📌 인터페이스의 default 메서드

  • defualt 메서드는 클래스의 메서드라 생각하면 된다.
  • 인터페이스에서 구현을 할 수 있는 메서드이다.
  • default 메서드는 클래스에서 재정의(오버라이드)할 수 있다.
public interface InterA {

    public default void methodA(){
	    System.out.println("methodA");
    };
   
}

public class MyClass implements  InterA{
    @Override
    public void methodA() {
        System.out.println("Override methodA");
    }
}

 

📌 인터페이스의 static 메서드

  • 하나의 static 메서드가 생성된다고 생각하면된다.
  • Interface 이름을 통해서 어디서든지 호출이 가능하다(구현하지 않아도)
public interface InterA {
    static void interMethodA() {
        System.out.println("Static method in interface");
    }
}

public class InterB implements InterA {
    // 이 메서드는 인터페이스의 static 메서드를 오버라이드하지 않는다.
    // 별도의 정적 메서드를 정의하는 것이다. 
    public static void interMethodA() {
        System.out.println("Static method in class");
    }
}

public class Main {
    public static void main(String[] args) {
        // 인터페이스(InterA)의 static 메서드 호출
        // 인터페이스 이름으로 바로 접근한다. 
        InterA.staticMethod(); // 출력: Static method in interface

        // 클래스(InterB)의 static 메서드 호출
        //클래스 이름으로 바로 접근한다. 
        InterB.staticMethod(); // 출력: Static method in class
    }
}

'JAVA' 카테고리의 다른 글

[ java ] Static 메서드에서 Field 접근  (0) 2025.03.31
[ java ] Optional 이란?  (0) 2025.01.20
[ java ] 멀티 스레드 사용법  (1) 2024.12.26
[ java ] 생성자, 생성자 오버로딩  (0) 2024.12.10
[ java ] 추상클래스  (0) 2024.12.10