본문 바로가기
JAVA

JAVA_인터페이스

by haheaven 2021. 8. 2.

 

 

인터페이스(interface)

- 추상메서드의 집합, 구현부가 없는 설계도, 모든 멤버는 public 이여야 함 

 

* 추상클래스 VS 인터페이스 

추상클래스 : 일반클래스(iv, 생성자 가능)에 추상메서드 존재 (미완성설계도)

  ex) 의자 만들 때 의자 설계도, 의자 재료, 의자 색상은 정했으나 다리나, 등받이 등 각 객체의 자세한 디자인을 하지 않음 

인터페이스 : 추상메서드만 있으며 구현된 것이 없음(iv,생성자 없음)(기본설계도)

  ex) 의자 만들 때 의자 설계도만 있음

 

- 선언방법 

 

interface 인터페이스 이름 {
    public static final 타입 상수이름 = 값;            <- 상수 / 변수 xxx
    public abstract 메서드이름(매개변수목록);      }     <- 추상메서드

* 모든 인터페이스의 멤버의 메소드는 public 이고, abstract 라 생략가능 * 모든 인터페이스 멤버 public, 메서드는 {}없는 추상메서드

* 모든 인터페이스이 멤버인 상수는 public static final 이기 때문에 생략가능 (일부생략도가능)

 

 

 

 

- 인터페이스의 상속 

① 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상아님)

② 다중상속가능(조상이 여러개) : 인터페이스는 추성메서드의  집합으로 구현부가 없기 때문에 충돌해도 에러 없다.

 

 


 

 

- 인터페이스 구현 

인터페이스에 정의된 추성 메서드 완성하기(이러한 완성작업 하는 일을 '구현'이라고 함) (추상메서드 {} 만듦)

class 클래스 이름 implements 인터페이스이름 {    }

 


 

 

- 인터페이스를 이용한 다형성 

① 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능 

class interfaceChild implement interfaceparent {
  public void go() {
    System.out.println("간다~");
     }
  public void stop(interfaceparent p) {
    System.out.println("멈춘다~");
   }
}
interface interfaceparent {
  void go();
  void stop(interfaceparent p);   
// void stop(interfaceparent p)의 매개변수로 인터페이스가 있다. 이는 인터페이스를 구현한 클래스의 객체만 가능하다는 것이다.

 

② 인터페이스를 메서드의 리턴타입으로 지정 가능 

interpaceparent method() {.         
  interfaceChild c = new interfaceChild();
  return c;            // ====> = return new interfaceChild();
}

class interfaceChild implement interfaceparent {
  public void go() {
    System.out.println("간다~");
    }
  public void stop(interfaceparent p) {
    System.out.println("멈춘다~");
    }
}

-> 메서드를 호출할 때는 인터페이스 타입의 구현객체로 호출해야함 ex) interfaceparent c = method(); -> 메서드의 반환타입이 인터페이스다. 그럼 반환은 인터페이스를 구현한 객체로 반환해야함

 

 


- 인터페이스 장점 

선언, 구현 분리시킬 수 있다.

① 코드변경에 유리

② 개발시간 단축

③ 표준화 가능 

④ 관계없는 클래스 관계맺기 가능 

class A {
 public void methodA() {
  I i = InstanceManager.getInstance();
  i.methodB();
  System.out.println(i.toString());
  }
}

interface I {
 public abstract void methodB();
 }
 
class B implements I {
  public void methodB() {
    System.out.println("methodB in B class");     }
  public String toString() { 
	  return "B class";       }
  }
  class InstanceManager {
   public static I getInstance() {
    return new B();
    }
  }
  
public class interfaceTest{
 public static void main(String[] args){
    A a = new A();
    a.methodA();      // "methodB in B class" %n "B class
	 }
  }

-> interface I를 통해 methodB()를 분리시켰고,  인터페이스 메소드를 통해 해당 틀에서 만들고 싶은 객체를 만들수 있다.

  위의 코드에선 B 클래스가 인터페이스를 구현하고 있다.

  원하는 객체 C, D가 있다면 추상메서드를 변경하여 만들면 된다. 이때 인터페이스 I는 B,C,D 클래스의 표준화를 만든다.

 

 

 

 

 

 

참고 : 자바의 정석(남궁성) 

'JAVA' 카테고리의 다른 글

JAVA_날짜와 시간  (0) 2021.08.04
JAVA_예외처리  (0) 2021.08.03
JAVA_추상화  (0) 2021.08.01
JAVA_다형성  (0) 2021.08.01
JAVA_제어자  (0) 2021.07.31

댓글