'인터페이스(interface)'에 해당되는 글 1건

  1. 2012.07.28 인터페이스(interface)

* interface

* abstract는 class가 가진 것 모두 가질수 있다.
* 인터페이스는 컴파일 시점에 오로지 부모 타입의 역할만 하지만 abstract는 메소드도 만들어 사용도 가능하다.
* interface(기본적으로 abstract와 같으나 부모의 역할만 하고 type의 역할만하고 객체를 생성할수는 없으나(abstract), interface는 추상메소드와 static final 변수만 가질 수 있다. 생성자도 없고, 구현된 메소드없고 타입 역할만 하는 것이다. )
- interface : 완벽히 추상화된 구조.
- 역할 :  상위 Type으로서의 역할 - 자식(하위)클래스에 대한 type과 template을 위한 구조.
- 구문 : [접근제한자] interface 이름[extends 인터페이스,...] <- 인터페이스만 상속받을 수 있고, 인터페이스 끼리는 다중 상속이 된다.
 {
  구현 :  [ public static final ] 변수 = 값;   //[]안에 내용은 생략가능 자동으로 컴파일러가 넣어준다. 무조건 있어야 하므로
   [ public abstract ] 메소드 선언;
 }

-> 접근제한자에는 : publc과 package friendly만 올 수 있다. (인터페이스는 누구든 접근 가능해야 하므로 대부분 public 을 쓴다.)


* interface

- class에서 interface 상속 - 다중상속 가능
  - 구문
    [제한자] class 이름 extends class명 implements interface명, interface명, ....
    {

    }

    public class A extends B implements interfaceA, interfaceB, interfaceC{

    }

* uml

B            <<interface>>          <<interface>>
             interfaceA             interfaceB
^
|                 ^                     ^
                  |                     |
A----------------------------------------

* 기본적으로 자바에서 단일 상속을 지원하는 이유
  A            B
----          ----
go()          go()
 ^             ^
 |             |
 |--------------
        C
       ----
       go()

* interface는 상위 클래스에는 추상화 된 구문만 받아오므로 아래 C에서 go()를 불러도 오버라이딩 된 C의 메소드가 불릴 것이기 때문에 다중 상속이 가능하다.


C                                      A<<interface>>
--------                              ---------------
+void go(){}      ----------------->   void go();
+void come(){}
                                          |
                                          |
                                          V
                                      B<<interface>>
                                      ----------------
                                      +void come();

* class에서 interface 상속 - 다중상속가능
class ->(가 class를 상속할때) class : extends, 단일 상속
interface -> interface : extends, 다중상속
class -> interface : implements, 다중상속

- 역할 : 상위 type - 하위 class가 정의할 메소드 선언(추상)(반드시 오버라이딩하게 만들어 둠)
                   - 다형성에서 하위 객체를 대입할 변수의 type

- public static final 변수 = 값; (여러 곳에서 사용할 수 있는 코드값, 불변의 값을 만들때 사용)
- program의 다른 class들에서 사용할 상수값 선언->코드값, 불변의 값

- 크게 관계 없는 class들을 하나의 type으로 묶을 때 사용.
ex :                                                                       수퍼히어로
                이동수단                 Flyer                               ^                                                 
                                           ^                                  |
                    ^                      |                --------------------------------------
                    |                      |----------------|                 |                  |
-------------------------------------------                슈퍼맨        스파이더맨        배트맨
|                   |                     |               
자동차              배               비행기           

 

* 공통적인 동작을 뽑아서 만든 인터페이스에는 Able을 뒤에 붙인다. (ex : FlyerAble)

*
project : day18
package : interfacetest
class : InterfaceTest
interface : InterfaceA
interface : InterfaceB <- InterfaceA를 상속
interface : interfaceC


package interfacetest;

public class InterfaceTest {
 public static void main(String[] args) {
  SubClass1 s1 = new SubClass1();
  InterfaceA s2 = new SubClass1();
  InterfaceB s3 = new SubClass1();
  
  s2.methodA();
  //s2.methodB();
  s3.methodA();
  s3.methodB();

 }

}


--------

package interfacetest;

public interface InterfaceA {
 public static final int CONST_A = 10;
 //int CONST_A = 10;//public static final을 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.
 public abstract void methodA();
 //void methodA(); //public abstract를 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.(컴파일러가 자동 생성해 주는 이유는 무조건 필요하기 때문이다.
 
}

---------
package interfacetest;

public interface InterfaceB extends InterfaceA {
 public abstract void methodB();
}

------
package interfacetest;

public interface InterfaceC {
 public abstract void methodC();
}


-----
package interfacetest;


public class SubClass1 implements InterfaceB {

 @Override
 public void methodA() {
  System.out.println("SubClass1.methodA()");

 }

 @Override
 public void methodB() {

  System.out.println("SubClass1.methodB()");

 }

}


--------
================================================================================================

* interface는 class가 아니고 타입의 역할만 하는 거다. 객체화 되지 않는다.
* 추상화class는 class 되고 객체화 되고, 타입의 역할도 한다.

package interfacetest;

public class InterfaceTest {
 public static void main(String[] args) {
  SubClass1 s1 = new SubClass1();
  InterfaceA s2 = new SubClass1();
  InterfaceB s3 = new SubClass1();
  
  s2.methodA();
  //s2.methodB();  //InterfaceB에 선언된 메소드 이므로 컴파일 에러
  s3.methodA();
  s3.methodB();
  SubClass2 su1 = new SubClass2();
  InterfaceA su2  = new SubClass2();
  InterfaceB su3 = new SubClass2();
  InterfaceC su4 = new SubClass2();
  
 }

}


---------

package interfacetest;


public class SubClass1 implements InterfaceB {

 @Override
 public void methodA() {
  System.out.println("SubClass1.methodA()");

 }

 @Override
 public void methodB() {

  System.out.println("SubClass1.methodB()");

 }

}


--------

package interfacetest;


public class SubClass2 implements InterfaceB, InterfaceC {

 @Override
 public void methodA() {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void methodC() {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void methodB() {
  // TODO Auto-generated method stub
  
 }
 
}

--------

package interfacetest;

public interface InterfaceA {
 public static final int CONST_A = 10;
 //int CONST_A = 10;//public static final을 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.
 public abstract void methodA();
 //void methodA(); //public abstract를 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.(컴파일러가 자동 생성해 주는 이유는 무조건 필요하기 때문이다.
 
}

-------

package interfacetest;

public interface InterfaceB extends InterfaceA {
 public abstract void methodB();
}

--------

package interfacetest;

public interface InterfaceC {
 public abstract void methodC();
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

5개의 로또번호 출력하기 - collection실습  (0) 2012.07.28
컬렉션(collection)  (0) 2012.07.28
추상화(abstract)  (0) 2012.07.28
다형성 - 실습  (0) 2012.07.28
다형성(polymorephism)  (0) 2012.07.28
Posted by 조은성
,