티스토리 뷰
▶인터페이스(interface)에 대해 알아보자
🔎 인터페이스(interface)란?
자식 클래스가 여러 부모를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것입니다.
예를 들어 동물이라는 부모 클래스가 있고 강아지, 호랑이, 곰, 소 라는 자식 클래스가 있을 때
이 자식 클래스를 분류하고 싶어서 육식 동물, 초식 동물, 잡식 동물이라는 클래스를 만들어 또 상속을 해주면 다양한 동작을 수행할 수 있을 것입니다.
하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어서
자바에서는 클래스를 통한 다중 상속을 지원하지 않습니다.
하지만 다중 상속의 이점을 버릴 수는 없기에
자바스크립트에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.
인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.
자바에서 추상 클래스는 추상 메소드뿐만 아니라 일반 생성자, 변수, 메소드들도 포함이 가능했죠?
하지만 인터페이스에서는 오로지 추상 메소드와 상수만을 포함할 수 있습니다.
→ ✨ 인터페이스는 기본이 되는 틀을 제공, 추상메소드와 상수만을 포함
인터페이스는 추상 클래스를 고도화한 개념이라고 생각할 수 있는데요.
오로지 상수랑 추상 메소드만 사용할 수 있는 인터페이스는 즉 "여기서 구현하지마"
그런데 추상 메소드만 있기 때문에 이 인터페이스를 바로 메모리에 올릴 수는 없습니다. (구현이 되어 있지 않기 때문에)
그런데 상수는 바로 사용할 수 있어야 하기 때문에 final static 키워드를 사용하여 틀에 바로 접근이 가능하도록 합니다.
📌 인터페이스의 선언
자바에서 인터페이스를 선언하는 방법은 클래스를 작성하는 방법과 같은데요.
인터페이스를 선언할 때에는 접근 제어자와 함께 interface 키워드를 사용하면 됩니다.
자바에서는 다음과 같이 인터페이스를 선언합니다.
접근제어자 interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
...
public abstract 메소드이름(매개변수목록);
...
}
단, 클래스와는 달리 인터페이스의 모든 필드는 public static final이어야 하며,
모든 메소드는 public abstract 이어야 합니다.
이 부분은 모든 인터페이스에 공통으로 적용되는 부분이므로 이 제어자는 생략할 수 있습니다.
이렇게 생략된 제어자는 컴파일 시 자바 컴파일러가 자동으로 추가해 줍니다.
📌 인터페이스의 구현
인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수는 없습니다.
따라서 인터페이스가 포함하고 있는 추상 메소드를 구현해 줄 클래스를 작성해야만 합니다.
class 클래스이름 implements 인터페이스이름 {...}
만약 모든 추상 메소드를 구현하지 않았다면, abstract 키워드를 사용하여 추상 클래스로 선언해야 합니다.
다음 예제는 인터페이스를 구현하는 예제입니다.
interface Animal {
public abstract void cry(); // 선언부만. 구현부X
}
class Cat implements Animal {
public void cry() {
System.out.println("야옹야옹!");
}
}
class Dog implements Animal {
public void cry() {
System.out.println("멍멍!");
}
}
public class Test {
public static void main(String[] args) {
Cat c = new Cat();
Dog d = new Dog();
c.cry(); // 야옹야옹!
c.cry(); // 멍멍!
}
}
📌 상속과 인터페이스 구현을 동시에
자바에서는 다음과 같이 상속과 구현을 동시에 할 수 있습니다.
class 클래스이름 extends 부모클래스이름 implements 인터페이스이름 {...}
또한 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며,
여러 인터페이스를 상속받을 수 있습니다.
다음 예제는 인터페이스를 사용한 다중 상속의 예제입니다.
interface Animal {
public abstract void cry();
}
interface Pet {
public abstract void play();
}
class Dog implements Animal, Pet {
public void cry() {
System.out.println("야옹야옹!");
}
public void play() {
System.out.println("쥐 잡기 놀이");
}
}
public class Test {
public static void main(String[] args) {
Cat c = new Cat();
c.cry(); // 야옹야옹!
c.play(); // 쥐 잡기 놀이
}
}
위 예제에서는 Cat 클래스가 각각 Animal과 Pet이라는 두 개의 인터페이스를 동시에 구현하고 있습니다.
📌 인터페이스의 장점
인터페이스를 사용하면 다중 상속이 가능할 뿐만 아니라 다음과 같은 장점을 가질 수 있습니다.
1. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능합니다.
2. 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축할 수 있습니다.
3. 클래스와 클래스 간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍이 가능합니다.
'백엔드 > Java' 카테고리의 다른 글
[Java] 자바 어댑터(Adapter) 패턴 (0) | 2023.02.03 |
---|---|
[Java] 내부 클래스(Inner Class) & 익명 클래스(Anonymous Class) (0) | 2023.02.02 |
[Java] 추상 클래스(Abstract Class) (0) | 2023.02.02 |
[Java] Casting - 업캐스팅(Up Casting)과 다운캐스팅(Down Casting) (0) | 2023.02.02 |
[Java] 자바에서의 접근 권한 제어자(Access Modifier) (2) | 2023.02.02 |
- Total
- Today
- Yesterday
- 디프만
- 리액트
- react-query
- 자바
- 프론트엔드 기초
- TypeScript
- rtl
- 파이썬
- JSP
- 스타일 컴포넌트 styled-components
- react
- 타입스크립트
- 딥러닝
- frontend
- 프론트엔드 공부
- 인프런
- 프론트엔드
- CSS
- 자바스크립트
- jest
- 자바스크립트 기초
- 리액트 훅
- testing
- Python
- HTML
- 데이터분석
- 프로젝트 회고
- 머신러닝
- styled-components
- next.js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |