일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ibsheet
- athena
- jQuery
- naver smartEditor
- aws lambda
- Java
- 인텔리J
- 환경구성
- #jQuery
- JavaScript
- 로그 데이터
- Git
- AWS Athena
- java8
- Log
- 자바
- intellij
- aws S3
- s3
- db
- 환경 구성
- function
- 자바스크립트
- 카이호스트만
- AWS SQS
- 자바8
- Study
- AWS Glue
- 아이비시트
- AWS
- Today
- Total
애매한 잡학사전
[자바8] 인터페이스 java 8 interface - 1장 본문
'카이 호스트만의 코어 자바 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
'DEV > JAVA' 카테고리의 다른 글
[자바8] 람다 표현식 - 2장 (0) | 2022.02.15 |
---|---|
[자바8] 람다 표현식 - 1장 (0) | 2022.02.13 |
[자바8] 인터페이스 java 8 interface - 2장 (0) | 2022.01.27 |
AWS Personalize putUsers 처리 Importing users incrementally (0) | 2021.10.26 |
Java8 Portable version 만들기 (6) | 2017.12.03 |