java

java 활용 예시(인터페이스)

goshek 2024. 9. 9. 12:38

package chapter09;

 

/*

Interface

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

>> 추상 메소드와 상수만으로 구성된 특수한 클래스

객체의 기능을 정의하고, 실제 구현은 인터페이스를 구현하는 클래스에서 담당

 

= 인터페이스의 필요성 =

: 서로 다른 클래스에 대해 공통된 동작을 보장할 때

: 여러 인터페이스를 동시에 구현 가능

>> 한 클래스에 대해 여러 개의 인터페이스 구현 가능

 

= 인터페이스 구현 방법 =

interface 키워드를 사용하여 선언

 

===인터페이스 vs 추상 클래스===

공통점: 하나 이상의 추상 메소드를 포함

 

1) 인터페이스: 클래스의 동작을 정의하는 계약 역할, 다중 상속 효과

- 객체가 어떤 행위를 해야하는 지를 정의

- extends 사용, 인터페이스 간에 다중 구현

- 추상 메소드, 상수만 포함

- 구현된 것은 아무것도 없고 밑그림만 그려진 기본설계도

 

2) 추상 클래스: 관련된 클래스들의 공통적인 틍징을 추출하여 일부 구현을 포함한 상태 제공

- 부분적 완성 클래스

- extends 사용하여 단일 상속만 가능

- 추상 메소드, 구체 메소드, 필드, 생성자 포함 가능

 

====================================================

카드 케임에 대한 정의

interface 인터페이스명{

 

}

*/

 

// 접근 제어자로 public과 default만 사용 가능

interface PlayingCard{

// 1. 멤버 변수

// >> public static final 특성을 가짐

/// >> 해당 키워드들이 생략 되어 있음

public static final int SPADE= 4;

final int DIAMOND= 3;

static int HEART= 2;

int CLOVER= 1;

 

// 2. 메소드 (public abstract)가 항상 포함되어 있음

// >> 모든 메소드는 추상메소드여야만 함(abstract 키워드 생략 가능)

// >> 해당 인터페이스의 활용을 위해 모든 클래스에서 접근 가능 해야하기 때문에 (public)되어 있음

public abstract String getCardNum();

String getCardKind();

 

/*

3. 디폴트 메소드

: 인터페이스에 새 기능을 추가하면서 기존 구현을 포함

>> 기본 구현 제공, 오버라이딩 가능

*/

default void defaultMethod() {

System.out.println("디폴트 메소드입니다.");

}

/*

4. 정적 메소드

: 인터페이스에서 직접 구현

>> 인터페이스 이름으로 직접 호출, 오버라이딩 불가능

*/

static void StaticMethod() {

System.out.println("스타틱 메소드입니다.");

}

}

 

class Card implements PlayingCard{

private String cardNumber;

private String cardKind;

 

public Card(String cardNumber, String cardKind) {

this.cardKind= cardKind;

this.cardNumber= cardNumber;

}

 

public String getCardNum() {

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.getCardNum());

System.out.println(card.getCardKind());

 

// 재정의가 선택적

card.defaultMethod(); // 디폴트 메소드입니다.

// card.staticMethod(); -Error

PlayingCard.StaticMethod(); // 인터페이스 이름으로만 호출 가능

}

 

}

 

 

package chapter09;

 

/*

인터페이스 멤버 변수의 특성

: 자동으로 public static final 속성을 가짐

: 모든 멤버 변수는 인터페이스 상수로 동작

>> 어디서든 접근 가능 + 인스턴스화 없이 인터페이스명으로 접근 가능 + 값 변경 불가능

*/

interface Example1{

int EXAMPLE_VARIABLE= 10;

void printVar();

 

default void method() {

System.out.println("예시1");

}

}

 

interface Example2{

void printVar2();

 

default void method() {

System.out.println("예시2");

}

}

 

/*

다중 인터페이스 구현

: 자바에스는 여러 개의 인터페이스를 동시에 구현이 가능

>> 둘 이상으 ㅣ타입으로 동작 가능

 

== 다중 인터페이스 구현 방법==

: implements 키워드 뒤에 여러 개의 인터페이스를 , 로 구분하여 나열

*/

 

class ExampleClass implements Example1, Example2{

public void printVar2() {

System.out.println("다중 인터페이스 구현");

}

 

public void printVar() {

System.out.println(EXAMPLE_VARIABLE);

}

/*

cf) 다중 인터페이스의 주의 사항

: 여러 개의 인터페이스에 같은 시그니처(선언부)를 가진 디폴트 메소드가 존재할 경우

>> 선언이 같고 구현이 다른 메소드가 충돌

*/

@Override

public void method() {

System.out.println("Method, 중복되는 디폴트 메소드");

}

}

 

public class D_Interface {

public static void main(String[] args) {

ExampleClass exClass= new ExampleClass();

exClass.printVar();

exClass.printVar2();

exClass.method();

 

Example1 exInterface= exClass;

exInterface.printVar();

//exInterface.printVar2();

exInterface.method();

 

/*

cf) 인터페이스의 다형성

: 인터페이스를 구현한 클래스의 객체는 해당 인터페이스 타입이 될 수 있음

>> 해당 인터페이스 내의 구조만을 가지며

>> 재정의 된 메소드는 유지

*/

}

 

}