인터페이스란?
객체가 어떤 방식으로 동작해야 하는지 정의하는 추상 타입
추상 메소드와 상수로만 이루어진 특수한 클래스
>> 모든 메소드는 추상 메소드여야 하며
>> 모든 변수는 상수이고 public static final 특성을 가짐
인터페이스의 구현은 인터페이스를 클래스에서 사용할 때 구현됨
인터페이스의 특징
메소드: 모든 메소드는 public abstract로 선언
>> 키워드 생략 가능(생략시 컴파일러가 자동으로 public abstract 취급)
변수(필드): 모든 변수는 public static final로 선언
>> 키워드 생략 가능(생략시 컴파일러가 자동으로 public static final 취급)
다중 구현 지원
한 클래스에서 여러 인터페이스를 동시에 구현 가능
객체의 각 행동을 정의하는 역할
인터페이스 구현법
interface 인터페이스명 {}
인터페이스의 예시
interface PlayingCard {
// 멤버
// 클래스, 인터페이스의 멤버: 필드, 매소드
// 멤버 변수: 상수 선언
// public static final 특성을 가짐(생략가능)
public static final int SPADE = 4;
public static int DIAMOND = 3;
public final int HEART = 2;
int CLOVER = 1;
// 멤버 변수: 메소드
// pulbic abstract 특성을 가짐(생략가능)
public abstract String getCardNumber();
String getCardKind();
// 디폴트 메소드
// 인터페이스에서 새로운 기능을 추가하면서 기존 구현을 포함
// >> 기본 구현 제공, 오버라이딩(재정의) 가능
default void defaultMethod() {
//default 반환타입 메소드명() {}
System.out.println("디폴트 메소드입니다");
}
}
인터페이스의 구현 예시)
class Card implements PlayingCard {
private String cardNumber;
private String cardKind;
Card(String cardNumber, String cardKind) {
this.cardKind = cardKind;
this.cardNumber = cardNumber;
}
// 인터페이스 안의 추상 메소드를 구현한 클래스 메소드는 public 지정이 필수
public String getCardNumber() {
return cardNumber;
}
public String getCardKind() {
return cardKind;
}
// 디폴트 메소드 재정의
@Override
public void defaultMethod() {
System.out.println("Card 클래스에서 재정의 된 디폴트 메소드");
}
}
인터페이스의 사용)
public class B_Interface {
public static void main(String[] args) {
Card card = new Card("7", "HEART");
System.out.println(card.getCardNumber());// 7
System.out.println(card.getCardKind());// HEART
// 재정의(오버라이딩) 선택적
card.defaultMethod();// Card 클래스에서 재정의 된 디폴트 메소드
//card.staticMethod();
// 인터페이스의 static 메소드는 반드시 인터페이스명으로 호출
PlayingCard.staticMethod();// 정적 메소드입니다
// 인터페이스 필드(상수) 사용
System.out.println(PlayingCard.CLOVER);// 1
System.out.println(PlayingCard.DIAMOND);// 3
System.out.println(PlayingCard.HEART);// 2
System.out.println(PlayingCard.SPADE);// 4
}
}
## 추상 클래스와 인터페이스
추상 클래스: 공통적인 기능을 제공하는 '부분적 구현'
>> 추상 메소드, 구체적 메소드, 필드, 생성자 로 구성
>>>객체를 직접 생성할 수 없음(new 키워드 사용 불가능)
추상 클래스는 단일 상속(extends)만 가능
>> 기본 구현을 제공&확장 가능
인터페이스: 클래스의 동작을 정의
>>추상 메소드, 상수, 디폴트 메소드, 정적 메소드 로 구성
인터페이스는 다중 구현(implements)이 가능
>> 객체가 해야 할 행위를 정의
인터페이스의 명명 규칙은 클래스와 동일하게 UpperCamelCase를 사용한다
인터페이스의 변수의 특성
자동으로 public static final 특성을 가짐
어디서든 접근 가능하고, 모두 같은 값을 공유함(인스턴스화 없이 접근가능) => 불변성
다중 인터페이스 구현의 예시
// 다중 인터페이스 구현
interface Example1 {
int EXAMPLE_VARIABLE = 10;
void printVar1();
default void method() {
System.out.println("예시 1");
}
}
interface Example2 {
void printVar1();
void printVar2();
default void method() {
System.out.println("예시 2");
}
}
// 여러 개의 인터페이스를 구현하는 클래스
// implements 키워드 뒤에 여러 개의 인터페이스를 ,로 구분하여 나열
class ExampleClass implements Example1, Example2{
// 다중 구현의 인터페이스에서 동일한 추상 메소드명을 가져도 상관없음
public void printVar1() {
System.out.println(EXAMPLE_VARIABLE);
}
public void printVar2() {
System.out.println("다중 인터페이스 구현");
}
@Override
// 다중 인터페이스 구현 시 같은 시그니처를 가진 디폴트 메소드가 존재할 경우 반드시 오버라이드 어노테이션을 작성
public void method() {
System.out.println("Method, 중복되는 디폴트 메소드");
}
}
public class D_Interface {
public static void main(String[] args) {
ExampleClass exampleClass = new ExampleClass();
exampleClass.printVar1();
exampleClass.printVar2();
exampleClass.method();
Example1 example1 = exampleClass;
example1.printVar1();
// example1.printVar2(); Example1에 정의되지 않음
}
}
인터페이스의 다형성
인터페이스로 구현한 클래스 객체들은 해당 인터페이스의 타입으로 동작 가능함
일종의 업캐스팅
해당 인터페이스 내부의 구조만 가지고 추가 구현된 부분은 작동하지 않는다
재정의 된 메소드는 유지된다
'java' 카테고리의 다른 글
실습) 추상 클래스 활용2 (0) | 2025.02.27 |
---|---|
실습) 추상 클래스 활용 1 (0) | 2025.02.27 |
26. 추상화(Abstract) (0) | 2025.02.27 |
25. 다형성 (Polymorphism) (0) | 2025.02.27 |
24. 클래스의 형 변환 (0) | 2025.02.25 |