📌 인터페이스란?
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 |