인터페이스의 정의는 사물과 사물 등 두 장치를 연결해주는 매개체를 말한다. 자바에서는 이 사물을 객체라고 생각하고 보면 된다.
인터페이스
- 객체들을 연결해주는 역할 (객체a와 객체b가 있을 때, a가 인터페이스 메소드 호출을 통해 b메소드 호출의 결과를 받아올 수 있다.)
- interface 키워드를 사용한다.
- 객체를 생성할 수 없고, 따라서 생성자도 가질 수 없다. (추상 메소드를 가지고 있어 미완성인 코드가 존재할 수 있기 때문)
- 클래스처럼 접근 제한자로 public , defalut만 사용할 수 있다.
- 클래스와 달리 상수필드와 추상메소드, defalut 메소드, private메소드 , public 메소드만 가질 수 있다.
- 다중 상속이 가능하다. (껍데기만 존재하는 것과 같아 클래스와 달리 다중상속으로 인한 문제가 없음)
- 인터페이스의 부모는 인터페이스만 가능하다.
interface 인터페이스명 {
...
}
구현 클래스 (인터페이스를 상속받은 클래스)
class 클래스명 implements 인터페이스명 {
...
}
변수의 타입(참조타입)으로는 사용 가능하다. 인터페이스에서 객체 생성은 불가능하기 때문에 인터페이스를 구현한 객체의 번지(구현 객체)를 대입한다.
인터페이스명 변수명 = new 구현클래스명();
인터페이스 사용 이유
- 객체a와 객체b가 있을 때, a가 인터페이스 메소드 호출을 통해 b메소드 호출의 결과를 받아올 수 있다.
- -> 객체 b가 객체 c로 바뀌어도 객체 a는 수정할 필요 없다.
- 같은 인터페이스 메소드로 다른 결과를 가져옴 -> 다형성 실현
인터페이스가 가질 수 있는 멤버
- 상수 필드 - 인터페이스는 모든 필드가 public static final라서 생략 가능
- 객체 생성과 관계없는 필드로 구현 객체 생성 없이 바로 접근할 수 있다.
public interface 인터페이스명{
public static final double PI = 3.14;
int price = 10000; //public static final생략해도 컴파일 과정에서 붙음
}
- 추상 메소드 - 선언은 되었지만 코드가 미완성인 메소드로 public abstract 생략 가능
- 반드시 자식 클래스에서 재정의 해야 한다.
public interface 인터페이스명{
public abstract void run(); //추상 메소드
void print(); //public abstract 생략 가능
}
- default 메소드 - dafalut 키워드를 반드시 붙여야 하고 중괄호 부분이 있어야 한다.
- 상속받은 자식 클래스에서 재정의할 수 있다. 이때, default를 생략하고 public 접근 제한자를 붙여야 한다. (인터페이스의 디폴트 메소드 접근 제한은 public으로 지정되어 있음)
public interface 인터페이스명{
default void print() {
System.out.println("디폴트 메소드");
}
}
- private 메소드 - private 키워드를 붙여야 하고, 중괄호 부분이 있어야 한다.
- 인터페이스내에서만 호출 가능, 인터페이스내에 중복 코드를 줄이기 위해 사용
public interface 인터페이스명{
private void print() {
System.out.println("private 메소드");
}
private static void run() { //객체 생성 없이 바로 접근 가능
System.out.println("private 정적 메소드");
}
}
- static 메소드 - static 키워드를 붙여야 하고, 중괄호 부분이 있어야 한다.
- 상수 필드와 마찬가지로 구현 객체 생성 없이 바로 접근할 수 있다.
- 접근 제한자가 생략되면 public으로 컴파일과정에서 붙는다. private으로 지정할 수도 있다.
public interface 인터페이스명{
static void run() {
System.out.println("정적 메소드");
}
}
인터페이스 사용 예시
interface ComputerInterface {
int price = 10000; //상수필드 - public static final 생략
void run(); //추상 메소드 - public abstract 생략
default void off() { //default 메소드
System.out.println("전원을 끕니다.");
}
default void defaultOn() { //default 메소드 - private 메소드 호출
on();
}
private void on() { //private 메소드
System.out.println("전원을 켭니다.");
}
static void print() { //static 메소드
System.out.println("출력합니다.");
}
}
class Computer implements ComputerInterface{
@Override
public void run() { //추상 메소드 오버라이딩
System.out.println("실행합니다.");
}
@Override
public void off() { //default 메소드 오버라이딩 - public으로 작성
System.out.println("(재정의)전원을 끕니다.");
}
}
public class Solution {
public static void main(String[] args) {
ComputerInterface ci; //인터페이스 변수 선언
//상수 필드 객체생성없이 바로 호출
System.out.println("컴퓨터 가격: "+ComputerInterface.price);
//정적 메소드 객체생성없이 바로 호출
ComputerInterface.print();
ci = new Computer(); // 구현 객체 생성
//Computer객체 run() 호출
ci.run();
//Computer객체 off() 호출
ci.off();
//defaultOn()을 통해 private 메소드인 on() 호출
ci.defaultOn();
}
}
//결과
//컴퓨터 가격: 10000
//출력합니다.
//실행합니다.
//(재정의)전원을 끕니다.
//전원을 켭니다.
인터페이스의 다중 구현
- 인터페이스는 추상클래스와 달리 다중 상속이 가능하다. (-> 구현 클래스가 여러개의 인터페이스를 상속받을 수 있다.)
- implements 키워드 뒤에 인터페이스명을 나열한다.
- 구현 클래스는 implements한 인터페이스의 모든 메소드를 재정의해야 한다.
class 클래스명 implements 인터페이스명, 인터페이스명 { ... }
인터페이스간의 상속
- 인터페이스도 다른 인터페이스를 상속할 수 있고, 다중 상속도 가능하다.
- extends 키워드 뒤에 인터페이스명을 나열한다.
- 자식 인터페이스는 부모 인터페이스의 모든 추상 메소드를 재정의해야 한다.
interface 부모인터페이스명 extends 자식인터페이스명, 자식인터페이스명 { ... }
봉인된 인터페이스(sealed interface)
- Java 15부터 사용 가능
- 인터페이스 상속을 제한하기 위해 등장 (무분별한 사용 막기 위해)
- sealed 키워드로 선언된 인터페이스는 permits 키워드 다음에 오는 인터페이스에만 상속이 가능하다.
- 봉인된 클래스를 상속받은 자식클래스는 sealed나 non-sealed, final 키워드를 사용해서 선언해야 한다.
- non-sealed : 자식 인터페이스에게 상속이 가능하다.
- sealed : 봉인 인터페이스 선언
public sealed interface 부모인터페이스몉 permits 자식인터페이스명 { ... }
인터페이스와 추상 클래스
- 공통점
- 객체를 생성할 수 없고(new 연산자 사용 불가능), 다형성 실현이 목적이다.
- 추상 메소드를 가질 수 있다. (구현 내용이 없는 메소드)
- 추상 메소드는 반드시 자식 클래스에서 재정의되어야 한다. (메소드 오버라이딩)
차이점 | 인터페이스 | 추상 메소드 |
키워드 | interface | abstract |
생성자 | 가질 수 없음 | 가질 수 있음 |
필드 | 상수 필드만 포함 가능 | 일반 필드도 포함 가능 |
메소드 | 추상메소드, default 메소드,private메소드, static 메소드만 가능 | 일반 메소드도 포함 가능 |
다중 상속 | O | X |
목적 | 설계, 구현 | 복제, 확장 |
- 목적 (인터페이스)
- 인터페이스에 작성된 메소드를 구현 클래스에서 목적에 따라 구현 내용을 작성함 (다형성 실현)
- 목적 (추상클래스)
- 자식 클래스가 공통으로 가져야 하는 기능은 작성하되, 자식클래스에서만 구현해야 하는 기능을 추상 메소드를 선언 -> 자식 클래스에 같은 메소드의 구현 내용이 달라짐 (다형성 실현)
- 추상클래스 구현 내용을 자식 클래스가 복제하고, 원하는 기능 구현 -> 확장
'JAVA' 카테고리의 다른 글
[JAVA] 제네릭(Generic) (0) | 2024.11.22 |
---|---|
[JAVA(자바)] 오류 Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0+ 해결 방법 (0) | 2023.02.28 |
[JAVA(자바)] 배열 복사, 배열 특정 구간 복사(copyOf, copyOfRange) (0) | 2023.01.21 |
[JAVA(자바)] 추상 클래스(abstract)와 봉인된 클래스(sealed) (0) | 2023.01.20 |
[JAVA(자바)] 업캐스팅과 다운캐스팅 (feat. 다형성, instanceof) (0) | 2023.01.19 |
댓글