인터페이스
특징
- 클래스가 사용하는 방식/접점만을 선언하는 클래스와 유사한 툴
- 아무런 구현이 되어있지 않으며, 모든 메소드가 추상 메소드이다.
- implements하는 클래스마다 추상 메소드를 다양하게 구현할 수 있어서, 다형성을 활용한 개발을 하기에 편리하다.
interface
라는 키워드를 사용한다- 멤버 변수의 타입은 항상
public static final
이고 생략 가능하다. - 멤버 메소드의 타입은 항상
public abstract
이고 생략 가능하다.1 2 3 4
interface IFoo{ public static final int MEMBER_VAR = 10; int MEMBER_VAR2 = 20; // public static final public abstract void methodA(int param);
- 인터페이스는 객체를 만들 수 없다.(추상 메소드가 존재하기 때문에)
- 클래스는 하나만 상속할 수 있지만, 인터페이스는 여러개 가능하다.
- 인터페이스를 상속받을 때는 implements라는 키워드를 사용한다.
1 2 3 4 5 6
class Foo implements IFoo{ @Override public void methodA(int param) { System.out.println(param); } }
- 인터페이스끼리 상속할 경우 extends를 사용하여 다중상속이 가능하고, 이때 상속하는 인터페이스의 모든 메소드를 선언,구현하지 않아도 된다.
1 2 3 4 5 6 7 8 9
interface Walkable{ void walk(); } interface Runnable{ void run(); } interface Jumpable extends Walkable, Runnable{ void jump(); }
JDK 1.8 이후의 인터페이스
- 인터페이스에 default 메소드를 구현할 수 있다.
- default 메소드의 제어자는 항상 public이다.
- 인터페이스의 철학과 맞지 않지만, 모든 자식 메소드에 동일하게 구현되어야 하는 메소드가 생긴 경우에 쉽게 기능을 추가하기 위해 만들어졌다.
1 2 3 4 5
interface IFooTwo{ void abstractMethod(); default void defaultMethod(){ // 디폴트 메소드 } }
1 2 3 4 5 6 7
class FooTwo implements IFooTwo{ @Override public void abstractMethod() {} // 디폴트 메소드는 오버라이드 해도 되고, 안하고 그냥 사용할 수도 있다. @Override public void defaultMethod() {} }
- 인터페이스의 static 메소드
- static 메소드는 인터페이스 명으로 바로 호출 가능하다.
- 인터페이스를 상속한 자식클래스의 객체는 static 메소드를 호출할 수 없다.
1 2 3 4 5 6
interface IBar{ static void staticMethod(){ System.out.println("static method"); } } class Bar implements IBar{}
1 2
IBar.staticMethod(); //Bar.staticMethod(); // 구현체인 자식클래스는 클래스 메소드를 호출할 수 없다.
열거형(Enumeration)
특징
- 키워드 : enum
- 내부적인 구현은 java.lang.Enum을 상속한다. -> 다른 클래스를 상속하지 못한다.
- 인터페이스 구현은 가능하다.
- enum에는 열거형 상수와 null 할당이 가능하다.
1 2 3
enum Job{ // 각 상수는 0부터 index를 가지지만, 심볼로만 상수를 사용하고 숫자는 사용하지 않는다. STUDENT, MARKETTING, DEVELOPER, CHIEF_EXECUTIONAL_OFFICER; // 대문자에 공백은 언더바로 표현하는것이 관례 }
- enum도 클래스이다. 이때 상수 각각이 객체가 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13
enum Symbol{ ONE, TWO, THREE; // 상수들이 각각 객체가 된다. public Symbol nextSymbol(){ if(this.equals(ONE)){ return TWO; } else if(this.equals(TWO)){ return THREE; } else return ONE; } }
- 열거형 생성자를 통해 enum 상수 초기화가 가능하다.
1 2 3 4 5 6 7 8 9 10 11
enum Family{ FATHER("아버지"), MOTHER("어머니"), SON("아들"), DAUGHTER("딸"); // 열거형 상수(객체) private String koreanWord; // 멤버 변수(객체에 속하는 변수) //private은 생략 가능, public 불가능 private Family(String koreanWord){ this.koreanWord = koreanWord; } // 위 변수에는 Getter, Setter를 통해 접근한다. } // 열거형 생성자와 멤버 변수 활용 Family family = Family.SON; // SON 객체가 생성되면서 객체의 koreanWord가 아들로 초기화 된다.