java 활용 예시(인터페이스)
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) 인터페이스의 다형성
: 인터페이스를 구현한 클래스의 객체는 해당 인터페이스 타입이 될 수 있음
>> 해당 인터페이스 내의 구조만을 가지며
>> 재정의 된 메소드는 유지
*/
}
}