아무거나

인터페이스 본문

Java & Kotlin/Java

인터페이스

전봉근 2019. 8. 8. 14:23
반응형

[인터페이스]

1. 인터페이스란?

   - 객체와 객체의 소통 수단

   - 작업 명세서 - 앞으로 이렇게 만들어요

   - 다형성 - java에서 다형성을 가능하게 함

     ex) A -> S (상속)

         A a = new A();

         S a = new A();

 // 위의 상속은 A랑 S밖에 두가지 타입밖에 안되는데 

 // 만약 인터페이스를 사용한다면 여러가지 타입을 지정할 수 있다.

public interface InterfaceEx {
    public static final int CONSTANT = 10;
    public void inMethod();
    pubiic void inMethod2();
}

   - 실제 개발에 적용시키기는 쉽지 않음

   - 디자인 패턴이나 프레임워크를 통해 습득하는 것을 권장

   - 객체를 부속품화

 

2. 인터페이스 문법

   - 실제 기능이 없다. (추상메소드와 상수만이 존재 한다.)

   - 접근제한자 private은 안된다.

   - 메소드는 무조건 추상 메소드만 존재

   - 객체타입 : 인터페이스는 객체는 아닙니다. 다만, 객체타입으로만 사용된다.

     ex) A a = new A();   // 타입은 A

         S a = new A();   // 타입은 S

   - 구현은 실행 되는 객체의 메소드에서 한다. ( implement하는 클래스에서 오버라이드해서 사용이 되어진다. )

 

   ex) 클래스안에 몇 가지의 기능들을 만들려 할때

       먼저 인터페이스를 기능별로 생성 후 

       그 인터페이스들을 다중으로 implements해서 할 수 있다.

 

3. 다형성

   - 말 그대로 객체가 다양하게 변할 수 있다고 생각하면 된다.

     인터페이스를 만들기전 참고할 표)

     배우    |                   경찰관               |  소방관                   |  요리사

               |     범인을 찾을 수 있다.           |  불을 끌수 있다.        |  피자를 만들 수 있다.

               |  잃어버린 물건을 찾을 수 있다.  |  사람을 구할수 있다.  |  스파게티를 만들 수 있다.

     (1) 경찰, 소방관, 요리사의 기능을 인터페이스로 구현

     (2) 배우는 상황에 따라서 변해야 하기 때문에 3개(경찰관, 소방관, 요리사) 즉, 총 6개의 기능을 재정의를 하여 구현한다.

     ex) Actress actress = new Actress();  // 타입이 Actress일 경우는 6개의 기능이 다 가능하지만

         예를 들어 PoliceMan actressP = new Actress();  // 타입이 PoliceMan일 경우에는 경찰기능인 2개만 가능하다.

 

4. 인터페이스와 다중상속

   - java는다중상속이 불가한다. 

     ex) public class ChildClass extends ParentClass1, ParentClass2, ParentClass3 {

              // ParentClass1 만 단일상속은 가능한다 그 이상은 안된다.

         }

   - 다중 구현은 가능하다.

     ex) public class ChildClass implements iFunction1, iFunction2, iFunction3 { }

 

   * Main -> AirPlaneToyClass implements Missile, Light 

     (public interface Missild extends Toy, public interface Light extends Toy)

     (public interface Toy)

     이런식으로도 상속 및 구현이 가능하다.

 

5. 인터페이스와 추상클래스

   - 공통점

     # 추상메소드를 가지고 있다. -> 즉, 추상메소드를 가지고 있어 하위 클래스에서 구현해야 한다.(오버라이딩)

     # 데이터 타입이 목적이다. (객체생성이 목적이 아닌 데이터 타입을 정의하는 것이 목적)

     # 객체 생성은 anonymose를 이용해야 한다.

       * anonymose란? 

         - 익명 클래스

Test t1 = new Test(){ 
    public int num = 10; 

    @Override 
    public int getNum(){ 
    	return this.num; 
    } 
}; 

 

바로 위의 소스코드랑은 비슷하면서도 다른점이 있다. 다른점은 인스턴스 옆에 블럭이 있다는 점이겠다.

언뜻 보면 new Test()라는 소스코드 때문에 이 인스턴스는 Test의 이름을 가질 것 같지만,

결코 아니다. 이 인스턴스야 말로 정말 어떠한 이름도 없는 인스턴스 인 것이다.

해당 주장이 맞는 주장인지 근거를 제시해보겠다.

먼저, 해당 인스턴스의 블럭안에는 @Override 어노테이션 주석이 존재한다. 즉, 원래의 Test 클래스에

존재하던 getNum 메서드가 아닌 재정의된 메서드 인점,

또한, 이 인스턴스의 this.num을 출력했을 경우 10이 나온다는 점이다. 

오히려 이 인스턴스는 Test 클래스를 상속받은 클래스라고 바꿔 말해도 될 것이다. 

평소에 자바언어를 사용하는 사용자라면, 상속을 어떻게 쓰는지 알 것이다.

클래스명 extends 상속받을 클래스     구조로 사용하는데 위의 소스 코드는 클래스명이 존재 하지 않고

무명의 어떠한 클래스가 부모클래스로 부터(Test) 상속을 받은 인스턴스 인 것이다.

즉 이름이 없으므로 생성자를 선언 할 수도 없는것이다.

 

   - 차이점

     # 상속, 구현 : 추상메소드는 상속을 통한 사용이고, 인터페이스는 구현을 통한 사용입니다.

     # 구성요소 차이 - 추상클래스는 일반 클래스와 동일하게 변수, 메소드의 모든 기능을 사용할 수 있지만, 인터페이스는 상수와 추상메소드만이 존재 한다.

     # 단일상속, 다중구현 : 추상클래스는 상속이므로 단일 상속만 지원하고, 인터페이스는 다중구현이 가능하다.

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

스트레티지 패턴  (0) 2019.08.12
싱글턴 패턴(Singleton Pattern)  (0) 2019.08.09
추상클래스(abstract)  (0) 2019.08.08
super 키워드  (0) 2019.07.04
오버라이드  (0) 2019.07.04
Comments