GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

Interface 에 숨겨진 비밀

Backcoder 2022. 6. 30. 18:09

< interface > 

인터페이스는 메소드들을 abstract ( 구현하지 않은 상태 ) 로 선언만 해두고, 

뒷방에서 열일하는 클래스들이 인터페이스를 implements 해서 실제로 구현시킨다. 

 

서비스를 제공할 때, 고객들에게는 이 interface 만을 제공하고, 실제 class 는 숨겨놓을 수 있는,

객체지향의 특징 중에 하나이기도 하다. 

 

"고객님은 그저 편하게 쓰세요! 뒷방에서 뭔 일이 벌어지는지는 신경 안쓰셔도 됩니다! " 

 

- interface 에서는 
1. 메소드  [ abstract + public ] 

( interface 메소드에는 자동으로 "abstract public" 숨어서 붙어있다 )

abstract => 메소드는 선언만 해둔다. (구현 X) 
  
- public   => 기본이 public 레벨이므로 
 => 상속해서 override 할 때 "public" 꼭 붙여줘야 한다. 
        ( override 는 modifier 범위 같거나 더 넓어야함 ) 

2.  변수    [ public + static + final ]

( interface 변수에는 자동으로 "public static final" 숨어서 붙어있다.) 

- final => interface 안에서 값을 꼭 줘야 한다. (선언 + "할당") 
(public static final) Double pi = 3.14;   

- static => 기본이 static 으로 만들어지므로, Interface명으로 직접 소환가능 ( 객체 생성X )  
  static 이므로 구분할필요없을 땐, 그냥 변수명 그대로 가져다 쓰면되고, 
  변수명 겹쳐서 구분 해야할때는, Interface명으로 직접 소환해서 구분 
(public static final) String name = "June"; 


3. 정상적 class 에서 implements 로 "상속" 한다.   ( implements 는 "상속" + "구현" ) 
   interface 에 있는 메소드들은 반드시 모두 구현해야 한다. (@override) 
   + 추가로 만들고 싶은거 만들기  

4. interface 특징 

- interface 는 객체 생성 X ( 상속=>구현 은 필수 ) 

- 생성자가 아예없다. ( 기본생성자도 X ) 

- class 입장에서 다른 클래스 상속하면서, 동시에 인터페이스 implements 할 수 있다. 
   class A extends B implements C{ }     ( 쉼표없이 띄어쓰기로 잇는다. ) 

- class 는 interface 여러개를 implements 할 수 있다. 
  각 interface 의 모든 메소드를 구현해야 겠지.
 
- 하나의 interface 를 여러 class 들이 각자 implements 할 수 있다. 
   => 각자 다르게 구현 => 다형성 

- interface는 다른 interface를 extends 상속할 수 있고, 다중상속 할 수 있다.
      

 

 

--- 

 

 

 


(참고) 
// jdk 1.8 이상 인터페이스 문법 추가 
< interface 인데, 메소드 구현해놓는 문법 > 
interface A{ 
void ma( );   // 오버라이딩 구현 필수 
default void mb( ){ 이건 니들이 다 공통으로 쓸 것 같다. 
여기서 구현해놀게 가져다 써라. 
단, 오버라이딩 하고싶으면 바꿔서 쓰고 } 
=> 이 기능이 1.8 이후에 가능해졌다. (아직 1.8 안된 환경 많음 ) 

static void mc( ){ 스태틱으로 줘도 가능 } 

class B implements A{ 
 public void ma( ) { 구현 필수 } 
 main{ 

B b1 = new B( ) ; 
b1.mb( ) ;  ( O )
b1.ma( ) ;   ( O ) 
B가 인터페이스 A를 implements(상속)한거니까, 
미리 구현해놓은 interface 메소드 사용 가능 

static 으로 구현해둔거는 
sout ( B.mc( ); ) class로 바로 소환가능 

 

//