ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 인터페이스
    개발 강의 정리/JAVA 2021. 6. 24. 12:43

    인터페이스

     

    인터페이스란?

    개발자가 개발한 코드와 힙에 생성된 객체간의 접점 역할을 한다. 

    즉, 인터페이스는 객체 사용 설명서라고 한다. 어떠한 객체가 주어졌을때 어떻게 사용해야하는가를 알려준다. 

     

    인터페이스는 추상클래스와 마찬가지로 규격을 정의하고 그 규격 을 "강제"하는 역할을 한다. 

    추상클래스와 인터페이스의 의미는 상호호환된다. 

     

     

    구현클래스의 이름 관례 : 이름 뒤에 Impl 을 붙인다

    인터페이스의 이름 관례 : 인터페이스임을 알리기 위해 앞에 I 를 붙인다. 

     

    인터페이스의 역할

     

    1. 개발코드가 객체에 종속되지 않게 -> 객체를 교체할 수 있도록 하는 역할! 

     

    ex) 타이어의 규격을 정해두면 A회사 타이어나 B회사의 타이어로 교체할 수 있지만, A회사의 타이어라고 객체를 만들어두면 A회사의 타이어만 사용가능하다. 

     

    2. 개발 코드 변경 없이 리턴값 또는 실행 내용이 다양해질 수 있음. (다형성) 

    인터페이스역시 다형성의 전제조건이 된다. implements 키워드 역시 상속이기 때문에! 

     

    <추상 클래스와 인터페이스의 차이>

    추상클래스는 new연산자 사용불가하다는 공통점만 있지 인스턴스 필드, static 필드, 추상메서드, 인스턴스 만들 수 있음. class 에 추가할 수있는 것은 다 추가할 수 있음. 

     

    그런데 왜 인터페이스 사용?  

    => 모델링 입장에서 봐야함. 

     

    강제성을 부여하는 것은 인터페이스와 추상클래스 모두 동일하지만 인터페이스는 "객체 사용 설명서"라는 차원에서 만들기 때문에 규격다운 규격은 인터페이스라고 할 수 있다. 

    추상 클래스는 규격의 기능을 가지고 있지만! 규격과 상관 없은 필드도 가질 수 있기에 규격다운 규격은 아님! 

     

    <인터페이스의 구성 멤버>

     

    1. public static final 상수 

     

    => 그냥 상수 불가. 인터페이스는new연산자로 객체를 생성할 수 없기 때문에 static 키워드가 붙지 않은 final상수는 불가능하다. 

     

    <상수 선언 규칙>

    -인터페이스에 선언된 필드는 모두 public static final(자바 컴파일러에서 대신 바이트 코드에 넣어주지만 절대 생략 하지 말아라! )

    -대문자로 작성

    -서로단어로 구성되어 있을 경우에는 언더바. 

    -선언과 동시에 초기값 지정. (왜? static initializer 사용 불가하기 때문에!-클래스에서만 사용 가능! ) 

     

    2. 추상메소드 

     

    : 규격을 강제해주는 역할! 

    인터페이스에서 가장 중요한 부분! 

     

    public abstract 키워드를 생략해도 컴파일러가 자동으로 넣어주지만 생략하지 말라! 

     

    3. 디폴트 메소드(인스턴스 메소드)

     

    자바8에서 새롭게 추가된 인터페이스의 새로운 멤버

     

    실행 블록을 가지고 있는 메소드

    [public] default 리턴타입 메소드명(매개변수) {...}

    인스턴스 메소드이지만 인터페이스를 implements하고 있는 자식 클래스(implementation class) 객체의 인스턴스 멤버가 된다!

     

    인터페이스의 성격과 맞지않는 이 디폴트 메서드를 왜 도입했는가? 

    => 기능의 확장 때문에

     

    ex) interface에 A,B,C라는 추상 메서드가 있다고 하자. D라는 메서드를 추가하고 싶은데 인터페이스에 추상메서드 D를 추가하면 나머지를 다 고쳐 오버라이딩해야 한다.=> 번거로움. 그래서 나온 것이 default 메서드와 static 메서드이다. 

    기능 확장을 조금 더 쉽게 하기 위해! 어거지로 만든 것! 가능하면 쓰지 않음! 

     

     

    4. static 메소드 

     

    자바8에서 새롭게 추가된 인터페이스 멤버

    : 인스턴스 메소드와 다르게 "공유"를 목적으로 할때 static 메소드로 정의한다. 

     

    [public] static 리턴타입 메소드명(매개변수){....}

    public 키워드 생략하지 말아라! 

     

    satatic 메소드는 원래 재정의 할 수 없다! 

     

     

    <인터페이스의 익명구현객체>

     

    클래스의 익명자식객체와 동일하다. 

    다만 인터페이스는 생성자가 없으므로 소괄호 안에 아무것도 넣지 않고 생성한다. 

     

    인터페이스타입 변수 = new 인터페이스타입(){
        실체메소드
    };

     

     

    this는 인스턴스 객체의 주소를 담고 있는 것이기 때문에 클래스 객체 소속인 static 메소드에서 this를 찍을 수 없다. 

     

     

    인터페이스의 익명구현객체에서도 클로져 현상이 발생한다. 

     

    *클로져란? 

     

    생명주기가 다른 두 변수가 상호(일방) 참조할때, 

    생명주기가 짧은 변수가 파괴되고 나서 생명주기가 긴 참조변수에서

    파괴된 변수의 값을 참조(=사용)함으로서 발생하는 문제이다. 

     

    해결책 

    => 생명주기가 짧은 변수를 final 상수로 만들어서, 메소드 영역에 있는 Clazz 객체의 상수풀(Constatnt Pool)에 넣는다.

    한마디로 생명주기가 짧은 변수의 생명주기를 더 길게 만드는 것이다. 

     

     

     

    인터페이스의 다중상속

     

     

    1. extends 키워드 사용

    인터페이스는 다중 상속을 받을수 있다. 인터페이스를 상속 받을때는 extends 키워드를 사용한다! 

    구현클래스(implementation class)에서는 상속받은 인터페이스의 추상 메소드를 모두 다 구현해야한다! 

     

    2. implements 키워드 사용

    구현클래스(implementation class)에서 implements 키워들 사용해 여러개의 인터페이스를 상속받는다. 

     

     

     

     

     

     

Designed by Tistory.