인터페이스

이승준·2021년 7월 25일
1

Java Study

목록 보기
11/12

인터페이스는 왜 쓰는가?


  • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
  • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미
  • 인터페이스를 구현한 다양한 객체를 사용함으로써 다형성 특징을 활용할 수 있다.

인터페이스의 여러가지 요소


상수

  • 모든 변수는 상수로 변환 됨.
  • public static final 이 변수 앞에 붙지만, 생략 가능. 컴파일 과정에서 생성 됨.

추상 메서드

  • 모든 선언된 메서드는 추상 메서드.
  • public abstract 생략 가능. 컴파일 과정에서 생성 됨.

디폴트 메서드 (자바 8이후)

  • 구현을 가지는 메서드
  • 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
  • default 키워드 사용
public interface A {
    default void description() {
        /*내용 구현*/
    }
}

정적 메서드 (자바 8이후)

  • 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드
public interface B{
    static int total(int[] arr) {
	int total = 0;
	for(int i: arr) {
		total += i;
	}
	mystaticMethod();
	return total;
    }
}

인터페이스 상속


  • 자바에서 다중 상속이 안되는 이유는 "다이아몬드 문제" 라는 모호성 때문에 안되고 있다.

    다이아몬드 문제 :  같은 조상 클래스를 상속 받는 두 개의 부모 클래스가 서로 하나의 메서드를 오버라이드 한경우, 자식 클래스가 두 부모 클래스를 다중 상속 받을 경우, 어떤 메서드 사용해야할지 모호해지는 문제

  • 인터페이스는 implements된 클래스에서 해당 메서드를 구현하기 때문에 interface A, interface B가 같은 메서드를 갖고 있다고해도, 해당 클래스에서 구현하면 됨으로 다이아몬드 문제같은 모호한 문제가 발생하지 않는다.
  • 따라서 인터페이스는 다중으로 implements를 할 수 있다.
  • 인터페이스 간의 상속에서는 다중 상속이 가능.
public interface A {
    void a();
}

public interface B {
    void b();
}

public interface C extends A, B {
    void c();
    
}

public class MyClass implements C {
    @Override
    public void a() {}
    @Override 
    public void b() {}
    @Override 
    public void c() {}
    public void hello() {}
}

MyClass mc = new MyClass();
B b = mc;
A a = mc; //mc는 A,B,C interface를 implements를 했지만, Type이 A 이기 때문에 a() 메서드 밖에 사용 불가. but, 구현 내용은 mc 에서 구현한 내용이다.
b.b();
a.c();
mc.a();
mc.b();
mc.c();
mc.hello();
  • 디폴트 메서드가 중복되는 경우는 구현 하는 클래스에서 재정의를 해주어야 한다.

인터페이스의 장점


1. 개발시간을 단축시킬 수 있다.

  • 일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능.
  • 메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문이다.
  • 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하게 한다.
  • 이렇게 되면 인터페이스를 구현하는 클래스가 작성될때까지 기다리지 않고도 양쪽에서 동시에 개발을 진행 할 수 있다. (사용측 : 인터페이스 타입을 사용하는 더미클래스로 예측 값을 테스트로 사용 가능)

2. 표준화가 가능하다.

  • 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.

3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

  • 서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

4. 독립적인 프로그래밍이 가능하다.

  • 인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램을 작성하는 것이 가능하다.
  • 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.
interface I { 
    public abstract void method(); 
}     
class B implements I { 
    @Override 
    public void method(){ 
        System.out.println("[class B] method"); 
    } 
} 
class A { 
    // public void callClassB_Method( B b ){  
    //    b.method();  
    // }                                      
    public void callClassB_Method( I i ){ 
        i.method(); 
    } 
} 
  • 이렇게 되면, B클래스의 의존성이 떨어진다.
profile
끊임없이 생각하는 주니어 웹 개발자입니다.

0개의 댓글