티스토리 뷰
기본적으로 인터페이스는 함수 내용이 없는 추상 메서드만 선언할 수 있습니다.
인터페이스는 오직 설계만을 위한 구조로 봅니다.
그래서 클래스가 부르지 않습니다.
인터페이스(interface)
어떤 기능을 제공하는지에 대한 명세서, 기본설계도라고 보면 됩니다.
상속받는 클래스는 인터페이스의 모든 기능을 사용하여야 합니다.
인터페이스의 기능은 여러 클래스에서 받아와 커스텀하여 다형성을 이용할 수 있습니다.
다형성: 하나의 객체가 다양한 형상이나 기능을 가짐
기본적으로 내용물들에 abstract, static 키워드가 있어야 하지만
컴파일 시 자동으로 변환해주는 걸로 알고 있습니다.
인터페이스는 추상 정도가 추상 클래스보다 높습니다.
- 다중 상속 가능
- 추상 메서드만 선언 가능(java8로 넘어오면서 default, static 함수를 선언할 수 있습니다.)
- 상수 변수만 선언 가능(final 키워드를 명시하지 않아도 상속된 변수는 상수로 취급되어집니다.)
- 상수, 추상 메서드의 집합
default 키워드는 상속하는 클래스들이 공통적으로 들어갈 기능에 사용하면 됩니다.
추상 클래스(abstract class)
기능 제공을 위한 미완성 설계도라고 볼 수 있습니다.
추상 클래스(abstract class)
- 다중 상속 불가능
- 일반 메서드, 추상 메서드 함께 사용 가능
- 확장 후 추상 클래스 내의 변숫값 할당 가능
- 부모가 되는 추상 클래스의 추상 메서드(abstract method)는 자식이 모두 구현해야 한다.
인터페이스(interface)와 추상 클래스(abstract class)의 사용상 차이점
1
인터페이스는 able이라고 볼 수 있고
추상 클래스는 is a로 볼 수 있습니다.
추상 클래스로 객체의 구분을 명시하고
인터페이스로 할 수 있는 것을 정합니다.
2
10개의 클래스가 부모에서 같은로직의 기능이 필요합니다.
인터페이스로 메서드로 상속받아 사용하면 10개마다 같은로직을 작성해야 합니다.
이럴 때는 추상 클래스로 로직을 미리 작성해 자식 클래스에서 그대로 사용합니다.
interface, abstract class 활용해보기
전자기기(abstract class) | ||||
노트북(abstract class) | 스마트폰(abstract class) + Carriable(interface) |
|||
맥북(class) | 그램(class) + Carriable(interface) |
아이폰(class) |
public abstract class Electronics {
private String name;
public Electronics(String name) {
this.name = name;
}
public abstract void turnOn();
@Override
public String toString() {
return "name: " + name;
}
}
제일 상위 클래스인 Electronics입니다.
모든 하위 클래스에 동일하게 사용될
필드 : name
함수 : turnOn(전원 켜기), toString
을 선언하였습니다.
toString()은 모든 자식들이 같은 로직을 사용하기 때문에
내용을 최상위에서 선언하였고
turnOn은 노트북과 스마트폰에서 다르게 동작하기 때문에
abstract method로 선언하였습니다.
public abstract class NoteBook extends Electronics{
public NoteBook(String name) {
super(name);
}
@Override
public void turnOn() {
System.out.println("노트북 전원버튼을 눌러 켜기");
}
public void play3DGame() {
System.out.println("노트북으로 3D 게임을 합니다.");
}
}
생성자로 부모 클래스의 생성자를 불러옵니다.
super(name)
turnOn을 노트북 계열에서는 "노트북 전원 버튼을 눌러 켜기"로 하였습니다.
noteBook class를 확장하면
turnOn이 "노트북 전원버튼을 눌러 켜기"으로 오버 라이딩된 버전으로 사용됩니다.
그리고 노트북만의 기능으로 play3 Dgame을 선언하였습니다.
모든 노트북 관련 클래스들은 3D 게임이 가능합니다.
public abstract class SmartPhone extends Electronics{
public SmartPhone(String name) {
super(name);
}
@Override
public void turnOn() {
System.out.println("스마트 전원버튼을 눌러 켜기");
}
public void call() {
System.out.println("전화걸기");
}
}
스마트폰은 turnOn() 함수의 내용이
"스마트폰 전원 버튼을 눌러 켜기"로 되어있습니다.
앞으로 노트북 클래스를 확장하면
"노트북 전원 버튼을 눌러 켜기"을 사용하게 되고
스마트폰 클래스를 확장하면
"스마트폰 전원 버튼을 눌러 켜기"를 사용합니다.
스마트폰만의 기능 call을 넣었습니다.
스마트폰을 확장하여야만 사용할 수 있습니다.
public class Gram extends NoteBook implements Carriable{
public Gram(String name) {
super(name);
}
@Override
public void carry() {
System.out.println("그램은 가벼워서 들고다닐수 있습니다.");
}
}
노트북을 확장한 gram노트북입니다.
extends NoteBook을 하여
abstract class NoteBook의 모든 기능을 사용할 수 있습니다.
추가로 Carriable인터페이스를 사용하여
Gram 노트북에서는
들고 다닐 수 있는 기능이 적용되어있습니다.
public interface Carriable {
public void carry();
}
public class MacBook extends NoteBook{
public MacBook(String name) {
super(name);
}
}
하지만 맥북에는 Carriable 인터페이스를 사용하지 않았습니다.
이렇게 상속도의 말단에 따로따로 줄 수도 있습니다.
public abstract class SmartPhone extends Electronics implements Carriable{
public SmartPhone(String name) {
super(name);
}
@Override
public void turnOn() {
System.out.println("스마트 전원버튼을 눌러 켜기");
}
public void call() {
System.out.println("전화걸기");
}
@Override
public void carry() {
System.out.println(super.name + "은 가볍기 때문에 들고다닐수 있습니다.");
}
}
스마트폰에서는 Carriable을 SmartPhone에서 사용하였습니다.
노트북은 무거운 노트북, 가벼운 노트북이 있기 때문에
기종에 따라 주었지만
스마트폰은 모두 가볍기 때문에 모든 스마트폰에
적용될 기능이기 때문에
모든 스마트폰의 부모 클래스에 사용하였습니다.
이렇게 하면 모든 스마트폰은 들고 다니는 기능이 적용됩니다.
'Java & Kotlin' 카테고리의 다른 글
java 직렬화(Serialize) (0) | 2021.10.20 |
---|---|
자바 Collection (0) | 2021.10.19 |
apache와 tomcat (0) | 2021.09.30 |
java logback Library (0) | 2021.09.27 |
sql_mode=only_full_group_by (0) | 2021.08.30 |
- Total
- Today
- Yesterday
- 개발자채용
- 알고리즘
- 자사서비스
- 백엔드
- jre11
- mappedby
- Spring
- springboot
- JDK8
- JPA
- 관계설정
- jre
- 스타트업
- 프로그래머
- 스택
- 다대일
- ㅃ
- 백준 제로 자바
- 문제
- 코딩테스트
- JDK
- java8
- jdk11
- boot
- jvm
- jre8
- 자바
- 백준 제로
- boot 일대다
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |