인터페이스 (interface)
구현 코드가 없는 메서드 즉 추상메서드들로만 이루어진 클래스를 의미하며, interface 키워드를 사용하여 구현한다. 인터페이스는 일종의 설계도 역할을 한다고 볼 수 있다.
public interface [인터페이스명] { }
・ 인터페이스에 선언된 모든 메서드는 기본값이 public abstract로 된 추상 메서드이다.
・ 인터페이스에 선언된 모든 변수는 기본값이 public static final 로 선언된 상수이다.
즉 인터페이스에 선언된 모든 변수는 상수로 변환된다.
・ 인터페이스에 선언된 변수와 메서드는 컴파일시에 각각 사용자 정의 상수와 추상메서드로 변환된다.
・ 인터페이스의 경우 추상클래스와 마찬가지로 자기자신은 인스턴스로 생성될 수 없다.
・ 인터페이스를 상속받은 하위클래스에서 인터페이스에 선언된 모든 추상 메서드를 구현하지 않으면, 하위클래스는 추상클래스가 되어 인스턴스를 생성할 수 없게 된다. 만일 하위클래스를 다시 상속받은 하위클래스의 하위클래스에서 인터페이스에서 선언된 모든 메서드를 구현하면 해당 하위클래스를 통해서는 인스턴스를 생성할 수 있다.
・ 클래스를 extends를 통해 상속받은 경우 구현 상속이라하면, 인터페이스를 implements를 통해 상속받은 경우에는 타입상속이라 한다.
・ 인터페이스 타입으로 구체화된 하위클래스 인스턴스를 생성하는 것도 가능한다.
ex) Calc calc = new MyCalculator();
・ 클래스를 상속받을 때 extends를 사용했던 것과 다르게, 인터페이스를 상속받을 때는 implements를 사용한다.
・ 하위클래스에서 하나의 상위클래스만 상속받을 수 있던 것과 다르게 ,를 사용해 여러 인터페이스를 상속 받을 수도 있다.
ex) pulic class [하위클래스] implements [인터페이스1], [인터페이스2]
・ 일반클래스와 인터페이스를 동시에 상속받는 것도 가능하다. 단 이때에도 인터페이스가 아닌 일반 클래스는 1개만 상속받을 수 있다.
ex) public class [구현되는하위클래스] extends [상속받을상위클래스] implements [상속받을인터페이스1], [상속받을인터페이스2]
・ 인터페이스 간에도 상속이 가능하다.
ex) public interface testInterface extends aInterface, bInterface { }
java 8에서 추가된 내용
- 인터페이스에 구현된 private 메서드는 인터페이스 내부에서 기능을 제공하기 위해 사용된다.
- 디폴트 메서드(default )
: 기본 구현을 가지는 메서드로, 인터페이스를 상속받은 하위클래스에서 재정의도 가능하다.
- 정적메서드
: 인터페이스는 본래 new를 통해 인스턴스를 생성하지 못하고, 인터페이스 내에 생성된 메서드를 직접적으로 사용하지 못했는데, static을 통해 기능을 구현하여 해당 인스턴스명을 통해 메서드를 사용할 수 있다.
- 반면에 default를 통해 구현한 경우에는 해당 인터페이스를 상속받은 하위클래스를 인스턴스로 생성하여 사용할 수 있다.
public interface IMyInterface {
//public static final String Message = "User define constant";
String Message = "User define constant";
default void defaultMethod() {
System.out.println("defined Method");
}
public static void staticMethod() {
System.out.println("static Method");
}
}
public class MyClass implements IMyInterface{}
public class AbstractAssist {
public static void main(String[] args) {
IMyInterface.staticMethod();
// static으로 선언된 메서드의 경우 인터페이스명만을 통해서도 접근 가능하다.
//IMyInterface.defaultMethod();
// default로 선언된 메서드에 인터페이스명을 통해 직접 접근시 에러가 난다.
MyClass myClass = new MyClass();
myClass.defaultMethod();
// default로 선언된 메서드는 해당 인터페이스를 상속받은 하위클래스를 인스턴스객체로 만든 후 , 해당 인스턴스 객체를 통해서만 접근할 수 있다.
}
}
ex) 인터페이스에서 만들어준 메서드는 해당 인터페이스를 상속받은 하위클래스에서 반드시 재정의되어야 한다.
public interface IBehavior {
public abstract void play();
}
public class Sport {}
public class Soccer extends Sport implements IBehavior {
@Override
public void play() {
System.out.println("playing soccer~~");
}
}
ex) Calc 클래스
- Calc 인터페이스를 상속받은 하위클래스
출처
'JAVA' 카테고리의 다른 글
[ Java ] - jsp 기본 문법 / jsp 라이프사이클 (0) | 2022.09.15 |
---|---|
[ Java ] -JSP 활용 기본 (0) | 2022.09.14 |
[ Java ] - 추상클래스 / 템플릿 메서드 (0) | 2022.09.05 |
[ Java ] - Static과 final 키워드 (0) | 2022.09.05 |
[ Java ] - 상속과 다형성 (0) | 2022.09.04 |