java

27. 인터페이스(Interface)

dalc3154 2025. 2. 27. 17:48

인터페이스란?

객체가 어떤 방식으로 동작해야 하는지 정의하는 추상 타입

추상 메소드와 상수로만 이루어진 특수한 클래스

>> 모든 메소드는 추상 메소드여야 하며

>> 모든 변수는 상수이고 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