애매한 잡학사전

[자바8] 인터페이스 java 8 interface - 1장 본문

DEV/JAVA

[자바8] 인터페이스 java 8 interface - 1장

거대한 개발자 2022. 1. 24. 22:22
반응형
'카이 호스트만의 코어 자바 8'을 기준으로 정리하였습니다.

 

 

인터페이스 (interface)

- 객체지향 개발 5대 원칙 (SOLID) 을 지켜줄 수 있는 도구

- 개발 소스 코드의 수정을 최소화 하고 유지보수성을 높이기 위한 도구

- 다형성을 극대화 할 수 있는 도구

- 구성 요소

    1. 상수 필드 (Constant Field)

    2. 추상 메서드 (Abstract Method)

    3. 디폴트 메서드 (Default Method)

    4. 정적 메서드 (Static Method)

 

 : SOLID - 1. SRP ( 단일 책임의 원칙 : Single Responsibility principle )

              2. OCP ( 개발 폐쇄의 원칙 : Open close principle )

              3. LSP ( 리스코브 치환의 원칙 : The Liskov substitution principle )

              4. ISP ( 인터페이스 분리의 원칙 : Interface segregation principle )

              5. DIP ( 의존성 역전의 원칙 : Dependency inversion principle )

 : 다형성(Polymorphism) - 하나의 타입 변수에 대입되는 객체에 따라서 실행 결과가 다양한 타입의 형태로 나오는 성질로 여러 개의 개별적인 클래스를 하나의 부모 클래스 객체로 통합 관리할 수 있는 특성을 나타낸다


1. 인터페이스 선언

[public] interface IntSequence {
    [public] [abstract] boolean hasNext(); /* 다음 요소가 있는지 검사하는 method */
    [public] [abstract] int next();        /* 다음 요소를 얻는 method */
}

- 접근 제어자는 생략하거나 public 으로만 선언.

    : 생략할 경우 해당 패키지 내에서만 사용 가능

- 인터페이스 메소드의 제어자는 생략해도 컴파일 단계에서 자동으로 적용됨 ([public][abstract])

    : 기본 메서드나 정적 메서드는 제외


2. 인터페이스 구현

public class SquareSequence implements IntSequence {
    private int i;
    
    // 인터페이스의 모든 메서드를 구현하고 항상 public 으로 선언
    @Override
    public boolean hasNext(){
        return true;
    }
    
    // 인터페이스의 모든 메서드를 구현하고 항상 public 으로 선언
    @Override
    public int next(){
        i++;
        return i * i;
    }
}

- 구현 클래스는 인터페이스의 모든 메서드를 구현해야 하고 반드시 public으로 선언해야 한다.

    : 기본 메서드, 정적 메서드 제외

- 인터페이스 메서드 중 일부만 구현하려면 아래 예제처럼 해당 클래스를 abstract 제어자로 선언하면 된다.

public abstract class SquareSequence implements IntSequence{
    @Override
    public int next(){
        return 0;
    }
}

 

2.1 인터페이스 구현 객체 사용

SquareSequence squares = new SquareSequence();	// IntSequence 인터페이스를 구현한 객체 생성
double avg = average(squares, 100); // average 함수 호출

/* SquareSequence 클래스를 abstract으로 선언했을때 객체 생성을 하면.. */
SquareSequence squaresAbstract = new SquareSequence(){
    @Override
    public int hasNext(){    /* IntSequence 인터페이스의 나머지 메서드를 구현해야 한다. */
        return true;
    }
}

- IntSequence 를 구현한 SquareSequence 객체 생성 후 아래 예제의 average 메서드를 호출할 때 파라미터로 사용하면

인터페이스에 있는 메서드(hasNext(), next())를 사용할 수 있다.

public static double average(IntSequence seq, int n){
    int count = 0;
    double sum = 0;
    while (seq.hasNext() && count < n) {
        count++;
        sum += seq.next();
    }
    return count == 0 ? 0 : sum / count;
}

3. 인터페이스 타입으로 변환

public class DigitSequence implements IntSequence {
    private int number;
    
    public DigitSequence(int n){
        number = n;
    }
    
    @Override
    public boolean hasNext(){
        return number != 0;
    }
    
    @Override
    public int next(){
        int result = number % 10;
        number /= 10;
        return result;
    }
    
    public int rest(){
        return number;
    }
}

- IntSequence 인터페이스를 구현하는 클래스는 인터페이스 메서드 이외에 추가로 필요한 메서드를 작성할 수 있다.

 

// ex1
IntSequence digits = new DigitSequence(1729);
double avg = average(digits, 100);

// ex2
IntSequence squareSequence = new SquareSequence();
double avg2 = average(squareSequence, 100);

- IntSequence 타입 변수는 IntSequence 인터페이스를 구현한 어떤 클래스의 객체도 참조 가능

  : 서브타입의 모든 값을 변환 없이 슈퍼타입 변수에 할당할 수 있으면 타입 S는 타입T(서브타입)의 슈퍼타입이다.

- 구현한 인터페이스 타입으로 변수 선언, 객체를 할당할 수 있다.

- 인터페이스 타입으로 생성한 객체는 해당 인터페이스를 기대하는 메서드에 파라미터로 전달할 수 있다.

- 변수를 인터페이스 타입으로 선언할 수 있지만, 타입이 인터페이스 자체인 객체는 만들 수 없다.

 

IntSequence sequence = ...;
DigitSequence digits = (DigitSequence) sequence;
System.out.println(digits.rest());

- 슈퍼타입을 서브타입으로 변환할 경우에는 타입 변환을 해야한다.

- rest() 메서드는 IntSequence 인터페이스 메소드가 아니기 때문에 DigitSequence 로 타입 변환을 해야 사용할 수 있다.

- 객체는 실제 클래스나 해당 클래스의 슈퍼타입으로만 타입을 변환할 수 있다. 

- 타입 변환 시 변환이 불가능할 경우 클래스 캐스트 예외가 발생한다.

  : 예외 발생을 피하려면 instanceof 연산자로 객체가 원하는 타입인지 먼저 검사해야 한다.

/* 객체 instanceof 타입 */
if(sequence instanceof DigitSequence){
    DigitSequence digits = (DigitSequence) sequence;
    ...
}

4. 인터페이스 확장

/* 예외가 일어날 때 리소스를 닫는 인터페이스 */
public interface Closeable {
    void close();
}

/* 인터페이스 확장 */
public interface Channel extends Closeable{
    boolean isOpen();
}

- 인터페이스는 또 다른 인터페이스를 확장해서 추가 메서드를 제공할 수 있다.

- Channel 인터페이스를 구현하는 클래스는 반드시 두 메서드 모두를 구현해야 한다.


5. 여러개 인터페이스 구현

/* FileSequence 클래스는 IntSequence와 Closeable 인터페이스가 슈퍼타입이 된다. */
public class FileSequence implements IntSequence, Closeable {
    ...
}

- 클래스는 인터페이스를 몇 개든 구현할 수 있다.

 

 

 

 

[자바8] 인터페이스 java 8 interface - 2장

'카이 호스트만의 코어 자바 8'을 기준으로 정리하였습니다. [자바8] 인터페이스 java 8 interface - 1장 '카이 호스트만의 코어 자바 8'을 기준으로 정리하였습니다. 인터페이스 (interface) - 객체지향 개

dev-gabriel.tistory.com

 

 

 


[참고자료]

- 카이 호스트만의 코어 자바 8

 

 

객체지향 개발 5대 원칙 (SOLID)

모든 개발이 그렇듯 프로젝트 초반에는 완벽하게 설계가 된것 같고 견고하게 구조를 다듬어 나아가는듯하게 개발이 되지만 개발을 하면 할수록 나의 코드와 구조의 틀이 점점 어긋나기 시작합

velog.io

 

 

자바 인터페이스(Java Interface)는 무엇인가?

개요 "자바 인터페이스(Java Interface)는 무엇인가?" 이런 궁금점을 가지고 있는 Java Programmer가 많습니다. 저는 "객체 지향 개발 5대 원칙 - SOLID"을 만족시켜줄 수 있어서라고 생각합니다. 그러면 "왜

interconnection.tistory.com


 

Comments