티스토리 뷰
추상 클래스와 항상 따라다니는 인터페이스!!
이어서 인터페이스에 대해서 살펴보도록 하겠습니다~!
1. 자바에서 인터페이스가 생겨난 배경
인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하는데
클래스와 다르게 여러개의 인터페이스로부터 다중상속(구현)이 가능하다.
💡 다중상속이 먼가요?
다중 상속을 지원하게 되면 하나의 클래스가 여러 부모 클래스로부터 상속 받을 수 있다.
BUT ! 자바는 IS-A 관계(상속관계)로 하나만 상속이 가능하다.
자식 클래스가 여러 부모 클래스를 상속받는다면 다양한 부모 클래스의 메서드를 가져올 수 있어서 좋지 않을까? 싶지만
부모의 메서드 중 동일한 메서드가 있다면 자손에서 충돌나는 문제를 방지하기 위해서 자바에서는 다중 상속을 지원하지 않는다.
이를 '다이아몬드 문제'라고 한다.
class GrandMother {
void myMethod(){
System.out.println("GrandFather");
}
}
class MotherA extends GrandFather {
@Override
void myMethod(){
System.out.println("FatherA");
}
}
class MotherB extends GrandFather {
@Override
void myMethod(){
System.out.println("FatherB");
}
}
class Son extends MotherA, MotherB{
@Override
void myMethod() {
super.myMethod(); //MotherA를 출력해야 할까? MotherB를 출력해야 할까?
}
}
➕ C++, 파이썬 등 다중상속을 지원하는 다른 언어들은 이렇게 동일한 메소드를 상속받는 경우 우선순위등을 적용하여 해결한다.
이는 객체지향 프로그래밍에서 큰 제약이기 때문에 자바에서는 인터페이스를 사용해서 다중 상속을 가능하게 한다.
2. 그래서 인터페이스란?
인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 "일종의 추상 클래스"라고 할 수 있다.
3. 인터페이스 사용방법
인터페이스는 class대신 interface 키워드를 통해 선언한다.
일반 클래스에서는 implements 키워드를 통해 인터페이스를 구현할 수 있다.
(이 구현을 통해서 미완성된 설계도인 인터페이스를 완성시키는 느낌이다.)
4. 인터페이스의 구성멤버
public interface 인터페이스명 {
//상수
(public) (static) (final) 상수명 = 값;
//추상 메소드
(public) (abstract) 메소드명(매개변수, ... );
//디폴트 메소드
default 타입 메소드명(매개변수, ... ){//구현 내용 필요함}
//정적 메소드
static 타입 메소드명(매개변수) {//구현 내용 필요함}
}
인터페이스가 다른 클래스들에게 이렇게 말합니다 😉
- 상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해라. (절대적)
- 추상메소드 : 가이드만 줄테니 추상메소드를 오버라이딩해서 재구현해라. (강제적)
- 디폴트메소드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써라. (선택적)
- 정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용해. (절대적)
💡 인터페이스는 모든 메서드가 추상 메서드이고 상수만을 포함할 수 있다.
자바 8 부터 인터페이스에서도 default 키워드를 통해 일반 메서드도 구현이 가능해졌다.
1. 상수
인터페이스는 데이터를 저장할 수 없기 때문에 데이터를 저장할 인스턴스 또는 static 필드를 선언할 수 없다.
⇒ 선언과 동시에 초기값을 지정해주어야 한다.
(public static final) 타입 상수명 = 값;
변수는 public static final 예약어를 쓰지 않아도 컴파일 과정에서 자동으로 값이 변하지 않는 상수로 변환된다.
2. 추상메서드
인터페이스의 메서드는 어차피 구현객체에서 실행되니까 추상 메서드로 선언한다.
5. 인터페이스의 특징
- 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있다.
- 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract을 적지 않는다.
- 인터페이스는 static final 필드만 가질 수 있다.
💡 public static final을 사용하는 이유?
클래스 멤버 변수를 final로 지정한다!
클래스에서 사용할 해당 멤버 변수의 데이터와 그 의미, 용도를 고정시키겠다는 것이다.
해당 클래스를 쓸 때 변하지 않고 계속 일관된 값으로 쓸 것을 멤버 상수로 지정하는 의미이다.
📢 그래서 [ 추상메서드-인터페이스 ] 둘의 차이점은 무엇인가요?
추상클래스는 일부 메소드를 추상화하여서 만든 클래스이고
인터페이스는 모든 메소드를 추상화하여서 만든 클래스라고 할 수 있다.
그냥 추상클래스로 다 표현하면 되는데 인터페이스를 왜 굳이 구분지어 놓았을까?
💡 추상 클래스와 인터페이스의 차이점
1. 상속 형태가 다르다
추상 클래스 ( 단일상속 ) / 인터페이스 ( 다중상속 )
2. 목적이 다르다
추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 것
인터페이스는 모든 메소드를 다 구현해야한다.
➡ "구현을 강제했다"는 것이다.
따라서 인터페이스는 함수의 구현을 강제함으로써 ⇒ 구현 객체와 같은 동작을 보장하기 위해 사용한다.
💡 공통점
1. 스스로 객체를 생성할 수 없다.
2. 상속 관계에서만 존재한다. 따라서 구현을 목적으로 한다.
'language > java' 카테고리의 다른 글
Java 8 Stream : map 함수 (0) | 2023.04.18 |
---|---|
정적 팩토리 메서드 (Static Factory Method) 사용하기 (2) | 2023.04.05 |
추상 클래스란? (0) | 2021.07.22 |
이차원 배열 dimensional array (0) | 2021.02.03 |
배열 array _1 (0) | 2021.02.03 |
- Total
- Today
- Yesterday
- Git
- MongoDB
- ChatGPT
- spring boot 3
- Linux
- n+1
- Java
- port
- addFilterBefore
- array
- 오블완
- MultipleBagFetchException
- 스프링오류
- 배열
- FetchJoin
- 추상클래스
- bucket4j
- JPA
- 자바 어플리케이션 실행 과정
- Cannot construct instance of
- Kotlin
- 스프링 스케줄링
- QueryDSL
- 티스토리챌린지
- redisson 분산락
- junit5
- checkout
- Spring Security
- dto 클래스 생성자
- jvm warm-up 전략
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |