- 일종의 추상클래스
- 추상클래스보다 추상화 정도가 높음
- 실제 구현된 것이 전혀 없는 기본 설계도(알맹이가 없는 껍데기)
- 추상메서드와 상수만을 멤버로 가질 수 있음
- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용됨
- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용됨
- class대신 interface를 사용한다는 것 외에는 클래스 작성과 동일하다
- but, 구성요소(멤버)는 추상메서드와 상수만 가능하다
- 인터페이스도 클래스처럼 상속이 가능하다(클래스와 달리 다중상속 허용)
- 인터페이스는 object클래스와 같은 최고 조상이 없다.
- 인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다 (다만, extends대신 implements를 사용)
- 인터페이스에 정의된 추상메서드를 완성해야 한다.
- 상속과 구현이 동시에 가능하다
- 인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다
- 인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
1. 개발시간을 단축시킬 수 있다.
2. 표준화가 가능하다.
3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
4. 독립적인 프로그래밍이 가능하다.
인터페이스의 이해
- 인터페이스에 새로운 메서드를 추가하면?
이 인터페이스를 구현한 기존의 모든 클래스가 이 메서드를 구현해야 함
- 이 문제를 해결하기 위해 '디폴트 메서드'를 고안
- 디폴트 메서드는 추상메서드의 기본 구현을 제공함
- 몸통{}을 가지고 있고, 앞에 'default'를 붙이고 항상 public이다(생략가능)
사람을 예시로 해보았다.
주석으로 설명..
package ch07;
// 인터페이스는 '기능'을 의미
// 여러 클래스에 적용될 수 있다
interface 입{
void cry();
}
interface 눈{
void see();
}
interface 날개{
void fly();
}
class Cat implements 입, 눈{
@Override
public void cry() {
System.out.println("야옹");
}
@Override
public void see() {
System.out.println("고양이가 봅니다.");
}
}
// 인터페이스들이 모이면 종족의 특성이 될 수 있다
abstract class 사람 implements 입, 눈{
}
class 홍길동 extends 사람{
@Override
public void cry() {
}
@Override
public void see() {
}
}
class 천사 extends 사람 implements 날개{
@Override
public void cry() {
}
@Override
public void see() {
}
@Override
public void fly() {
}
}
// 인터페이스는 클래스에서 여러개를 구현할 수 있다
class Dog implements 입, 눈{
@Override
public void cry() {
System.out.println("멍");
}
@Override
public void see() {
System.out.println("강아지가 봅니다.");
}
}
public class S08 {
public static void main(String[] args) {
}
}
스마트폰을 예시로 문제를 풀어보았다
주석으로 설명..
package ch07;
// 인터페이스 / 추상클래스 / 클래스를 이용해서
// 스마트폰
// 갤러시 / 아이폰
// 갤럭시 - 통화 / 문자 / 빅스비
// 아이폰 - 통화 / 문자 / 시리
// 갤럭시 - s23
// 아이폰 - IPhone14
interface 통화{
void call();
}
interface 문자{
void massage();
}
interface 빅스비{
void bigsb();
}
interface 시리{
void siri();
}
abstract class 스마트폰 implements 통화, 문자{
}
class S23 extends 스마트폰 implements 빅스비{
@Override
public void call() {
System.out.println("삼성 ceo 이재용");
}
@Override
public void massage() {
System.out.println("안녕하신가");
}
@Override
public void bigsb() {
System.out.println("어떤 것을 도와드릴까요?");
}
}
class Iphone extends 스마트폰 implements 시리{
@Override
public void call() {
System.out.println("잡스");
}
@Override
public void massage() {
System.out.println("hello");
}
@Override
public void siri() {
System.out.println("Can I help you?");
}
}
public class S08Quiz {
public static void main(String[] args) {
S23 galuxyS23 = new S23();
Iphone appleIPhone = new Iphone();
}
}
스마트폰을 예시로 문제를 풀어보았고 다른 방식으로 푼 코드이다.
주석으로 설명..
package ch07;
// 인터페이스 / 추상클래스 / 클래스를 이용해서
// 스마트폰
// 갤럭시 / 아이폰
// 갤럭시 - 통화 / 문자 / 빅스비
// 아이폰 - 통화 / 문자 / 시리
// 갤럭시 - S23
// 아이폰 - IPhone14
interface 통화 {
void 통화수신(String data);
String 통화송신();
}
interface 문자 {
void 문자수신(String data);
String 문자송신();
}
interface 빅스비 {
void search(String question);
}
interface 시리 {
void search(String question);
}
abstract class 스마트폰 implements 통화, 문자 {
}
abstract class 갤럭시 extends 스마트폰 implements 빅스비 {
}
abstract class 아이폰 extends 스마트폰 implements 시리 {
}
class S23 extends 갤럭시 {
@Override
public void search(String question) {
System.out.println("검색 : " + question);
}
@Override
public void 통화수신(String data) {
System.out.println(data);
}
@Override
public String 통화송신() {
return "안녕하세요";
}
@Override
public void 문자수신(String data) {
System.out.println(data);
}
@Override
public String 문자송신() {
return "당근에서 연락드립니다.";
}
}
class IPhone14 extends 아이폰 {
@Override
public void search(String question) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'search'");
}
@Override
public void 통화수신(String data) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method '통화수신'");
}
@Override
public String 통화송신() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method '통화송신'");
}
@Override
public void 문자수신(String data) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method '문자수신'");
}
@Override
public String 문자송신() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method '문자송신'");
}
}
public class S08QuizEx {
public static void main(String[] args) {
}
}