[JAVA] 자바 - 인터페이스 (interface) 정의 (1)
by mini_min[JAVA]
자바 - 인터페이스 (interface)
✔️ 인터페이스란?
클래스를 위한 템플릿으로 기능을 수행하는 추상 클래스의 한 종류다. 인터페이스는 interface 키워드 사용한다.
선언만 있고 정의는 없는 것이 특징이다. 인터페이스 내의 필드는 상수 선언만 가능하다. (상수: 한 번 정해지면 절대 변하지 않는 값)
❌ 필드값 절대 변경불가(final)
🏷️ 인터페이스 특징
- 인터페이스 필드는public static final 만 가능하다! public static final 을 생략해도 알아서 public static final 로 취급한다.
- 인터페이스의 메소드는 public abstract 만 가능하다! 마찬가지로 생략해도 알아서 public abstract 취급한다.
- 클래스 간의 결합도를 낮출 수 있다.
- 표준화가 가능하다.
- 개발 시간을 단축할 수 있다.
✔️ 인터페이스 구현하기
인터페이스를 구현한 클래스가 추상 클래스가 아닌 경우, 인터페이스의 모든 메소드를 정의해야한다. 인터페이스를 구현한 클래스와 구현 클래스는 상하 관계이다.
⭕ 반대로 인터페이스 구현한 클래스가 추상 클래스이면 모든 메소드를 정의할 필요가 없다!
// 인터페이스 작성
interface Demo1 {
// 인터페이스 필드는 public static final 만 가능
public static final int A = 10;
int B = 20; // 필드는 public static final 을 붙이지 않아도 public static final
// 인터페이스 메소드는 public abstract 만 가능
public abstract void disp();
void print(); // public abstract 안붙여도 public abstract
// public void write() { } // 컴오류. 메소드를 구현하면 오류 발생
}
// 인터페이스 구현
// 인터페이스 구현한 클래스에서는 추상클래스가 아닌 경우 인터페이스의 모든 메소드를 정의해야 한다.
// 인터페이스를 구현한 경우 인터페이스와 구현 클래스는 상하관계이다.
class Test1 implements Demo1 { //2개의 추상 메소드를 구현 안하면 오류가 발생
@Override
public void disp() {
System.out.println("disp - 인터페이스 메소드 재정의");
}
@Override
public void print() {
System.out.println("print - 인터페이스 메소드 재정의");
}
public void sub() {
System.out.println("클래스에 정의된 메소드");
}
}
💡 인터페이스 메소드를 재정의한 것 뿐만 아니라 구현한 클래스(하위클래스) 자신만의 메소드도 존재할 수 있다.
//Demo1 dd = new Demo1(); // 컴파일 오류
//인터페이스는 추상클래스의 일종으로 객체 생성이 불가능
Demo1 obj = new Test1(); //up-casting Demo가 아버지꼴
// 인터페이스는 구현클래스의 상위클래스와 유사하다.
// obj.sub(); // 컴오류. Demo1 에 sub() 메소드가 없으므로
((Test1)obj).sub(); //다운 캐스팅하면 Test 메소드로 사용이 가능
💡 인터페이스는 객체 생성이 불가하다! 꼭 하위클래스를 통해 구현해야하며, 구현 클래스의 상위클래스와 유사하다. (up-casting)
Demo1 obj = new Test1();
sub() 메소드를 호출하고 싶어도 up-casting 한 상태에서 Demo1에 없는 sub() 메소드를 호출할 수 없다. 이럴 땐 다운 캐스팅해서 Test1 에 있는 sbu() 메소드를 호출할 수 있다.
✔️ 2개 이상의 인터페이스 구현
클래스는 2개 이상의 인터페이스를 받아서 구현할 수 있다!
ex) class DemoImpl2 implements Ademo2, Bdemo2 {}
- 당연하게도 2개 이상의 인터페이스를 구현한 클래스의 객체를 생성하면, 재정의된 메소드를 호출한다.
interface Ademo2 {
public void disp();
}
interface Bdemo2 {
public void write();
}
// 클래스는 2개 이상의 인터페이스를 구현할 수 있다.
// 다중상속이 되지 않는 것을 보완.
class DemoImpl2 implements Ademo2, Bdemo2 {
@Override
public void write() {
System.out.println("Bdemo2 메소드 구현");
}
@Override
public void disp() {
System.out.println("Ademo2 메소드 구현");
}
public void sub() {
System.out.println("클래스에 정의된 메소드");
}
}
✔️ up-casting !
인터페이스를 구현한 클래스 -> 인터페이스로 up-casting 도 가능하다.
아래와 같이 up-casting 해서 인터페이스A 의 메소드를 호출할 경우, 재정의된 메소드가 호출된다. (이미 인터페이스를 구현한 클래스가 객체 생성되며 메소드가 정의됐기 때문에)
다만, up-casting 하는 경우, 인터페이스를 구현한 하위 클래스의 메소드는 호출할 수 없다. 호출하기 위해서는 다시 down-casting 하여 원래대로 돌려야한다.
DemoImpl2 ob = new DemoImpl2();
ob.disp();
ob.write();
ob.sub();
Ademo2 ob2 = new DemoImpl2(); //업캐스팅
Bdemo2 ob3 = new DemoImpl2(); //업캐스팅
ob2.disp();
// ob2.sub(); //컴오류. 다운캐스팅 해야함
((DemoImpl2)ob2).sub();
// ob3.disp(); // 데모 B 에는 디스플레이가 없어서 사용 못한다.
((Ademo2)ob3).disp(); //Ademo2 와 Bdemo2 모두 구현되어 있기 때문에 가능은 하다.
}
💡 2개 이상의 인터페이스를 구현한 클래스도 당연히. 자기 자신의 메소드를 가질 수 있다. 하지만, up-casting 했을 때 구현한 클래스의 메소드는 사용할 수 없으니, down-casting이 필요하다.
'Java' 카테고리의 다른 글
[JAVA] 자바 - 익명 구현(anonymous) (인터페이스 익명 구현) (0) | 2022.07.27 |
---|---|
[JAVA] 자바 - 인터페이스와 추상 클래스 (2) (0) | 2022.07.26 |
[JAVA] 자바 - 추상화 클래스(abstract 클래스) (0) | 2022.07.26 |
[JAVA] 자바 - 참조형 변수의 다형성, 업 캐스팅(up-casting) (0) | 2022.07.25 |
[JAVA] 자바 - 메소드 오버라이딩(Method Overriding) ⭐⭐ (0) | 2022.07.25 |
블로그의 정보
개발자 미니민의 개발로그
mini_min