상세 컨텐츠

본문 제목

자바_이보다 더 쉬운 인터페이스 (interface)는 없다

java_자바

by 쫑메이 2020. 6. 22. 00:35

본문

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

인터페이스(interface)


 

 

 

인터페이스 (interface)?

서로 다른 두 시스템, 장치, 소프트웨어 따위를 이어 주는 부분 또는 장치

[네이버 지식백과]

 

 

사물과 사물 사이 또는 사물과 인간 사이의 경계에서,

상호 간의 소통을 위해 만들어진 물리적 매개체나 프로토콜을 말한다

[네이버 지식백과]

 

 

 

 

 

 


 

자바에서 인터페이스(interface) 키워드


 

접점, 인터페이스(interface)의 사전적 의미는 두 시스템 간에 만나는 접점이라는 의미가 있다.

흔히 쓰는 사람과 상호작용하는 것을 두고

cui (Character User Interface) 캐릭터 유저 인터페이스

gui(Graphic User Interface) 그래픽 유저 인터페이스라고 한다.

 

 

 

 

 

 

 

 

 

 

 

 

자바에서 인터페이스(interface)가 등장한 이유

 


 

 

자바는 단일 상속만 가능, 즉 슈퍼 클래스(super class)가 2개 이상이 되면 안 된다.

두 개 이상의 클래스(class)로부터 다중 상속 불가능

 

 

 

 

 

 

 

 

 

메서드를 호출했을 때,

 

 

고래상어가 상어와 고래 둘 다 상속했을 때 문제가 생긴다

 

 

어느 객체의 번식 메서드(고래냐? 상어냐?)를 호출해야 하는지 혼동을 주기 때문에

 

다중 상속 금지한다

 

 

 

 

 

 

 

 

 

하지만 다중 상속이 되도록 하기 위해 인터페이스(interface)를 만들었다

 

 

 


 

 

 

 

인터페이스(Interface)에서 핵심 키워드는 '상수와 추상 메서드'

 

 

 

 

 

 

 

 

그렇다면 도대체 상수가 뭘까?

 

상수_ 키워드


 

 

상수는 변하지 않는 데이터(변수)를 말한다

 

 

보통 클래스 내에서 상수를 선언할 때 보통 public static final 형태로 선언한다

 

 

 


잠깐 여기서, public과 statci과 final이 뭔지 짚고 넘어가자!

 

 

public은?

어느 클래스에서나 접근이 가능하다

 

 


 

 

static의 특징은?

 

클래스 로딩 시 함께 로딩되어 인스턴스 생성과 무관함

클래스명만으로 접근하며, 모든 인스턴스가 변수의 데이터를 공유한다

 

 

 


 

 

final은?

데이터 변경 불가하다. 즉 상수라는 뜻

 

 

 

 

 

 

 

그래서 "나 상수야" 하고 공표할 때는 public static final 형태 로티를 낸다는 말!

 

 

 

 

 

 

public static final을 쓰는 이유?

 


 

 

publicstaticfinal를 쓰는 이유는

public에 의해 어디서든 접근이 가능하며

static에 의해 클래스명만으로 인스턴스 생성 없이 접근 가능하며

final에 의해 데이터가 유지되기 때문이다

 

 

 

 

특정 클래스 내에서 사용되는 데이터를 상수로 제공하면

문자열의 오타나, 정수형 사용 시 어려움 등을 해결할 수 있다

 

 

 

 

 

특히 파라미터로 뭘 집어넣어야 할지 모를 때,

class 명. 을 쓰고 컨트롤+스페이스바를 찍어보면

static이 붙은 것들이 보이는데 이것이 바로 상수다.

 

 

 

 

 

 

 

 

 

 

 

간단하게 추상 메서드 정리

 


 

미완성 클래스,

메서드 바디(=구현부)가 없는 메서드

메서드 리턴 타입 앞에 abstract 키워드를 사용, 구현부{ } 대신 세미콜론(;)을 찍는다

구현부가 없어서 외부에 호출되면 안 되는 메서드

 

 

 

추상 메서드가 있으면 반드시 그 클래스는 추상 클래스로 정의되어야 한다

하지만 추상 클래스는 추상 메서드, 일반 메서드, 생성자, 인스턴스 변수를 가질 수 있다

인스턴스 생성은 불가능하지만 상속은 가능, 다형성 활용도 가능

 

 

 

 

중요한 사실은

추상 클래스를 상속받는 서브클래스는 반드시 추상 메서드를 오버 라이딩해야 함

추상 메서드에 대한 구현을 강제함으로 코드의 강제성 및 통일성을 제공한다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

다시 인터페이스로 돌아와서.....

인터페이스(Interface)를 살펴보면

 


 

1) 선언부의 class 대신 interface으로 시작한다

 

2) 인터페이스(Interface)에 선언된 모든 메서드는 public abstract 여야 한다.

 

즉 추상 메서드라는 이야기다

 

3) 모든 멤버 변수는 반드시 public static final _즉 상수라는 말이다

 

 

 

 

< 인터페이스 정의 기본 문법 >

 

[접근 제한자] interface 인터페이스명 {

상수

추상 메서드

}

 

 

 

- class 대신 interface 키워드 사용

- 인터페이스(interface) 내의 멤버 변수= 모두 상수

- public static final로 취급됨. 생략 가능

(static이 붙으면 글자가 기울어진다)

 

 

 

 

 

 

 

 

인터페이스(Interface)_특징 정리

 


 

 

1) 클래스가 아니다

그래서 선언부에 class가 아닌 interface 키워드를 사용한다

 

 

 

2) 인터페이스(interface)가 가질 수 있는 요소

①상수(public static final)

②추상 메서드 (public abstract)

생성자나 그 외의 것들은 가질 수 없음

 

 

 

 

3) 객체 생성 불가능, 상속 전용

대신 참조형 타입으로 사용 가능하며, 다형성 활용 가능

 

 

 

4) 서브클래스에서 인터페이스(interface)를 상속받을 때 클래스와 달리

extends(확장)이 아닌 implements(구현) 키워드를 사용해 다중 상속이 가능하게 함

 

 

 

5) 인터페이스(interface)끼리 상속할 extends 키워드를 사용하며, 다중 상속 가능

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

인터페이스 : extends/ implements

 


 

1) interface를 상속받는 서브 인터페이스 정의 시 extends 키워드 사용 가능

 

즉, 인터페이스(interface)끼리는 extends(상속) dl 가능하며, 다중 상속도 가능하다

 

 

 

 

2) interface를 상속받는 서브 클래스 정의 시 extends 키워드가 아닌 implements 키워드를 사용

 

 

 

 

 

 


 

 

예제와 함께 살펴보면서.. 한 방에 이해가 되길 바라며..

 

 

 

 

 


 

 

1) 인터페이스(interface)도 인스턴스 생성이 불가능하다

 

동물 동물=new동물( );

 

 

 

 

2) 하지만 고래와 상어는 인스턴스 생성이 가능하다

 

고래상어 고래상어=new 고래상어( );

고래상어. 번식( );

 

고래상어 고래상어 = new 고래상어();

고래상어. 번식();

 

 

 

 

3) 클래스 자리에 interface를 썼다

 

interface 동물{

public abstract void 번식 ( );}==> 인터페이스 내의 모든 메서드는 추상 메서드

public abstract가 생략 가능함

 

 

 

 

 

 

 

 

4) 인터페이스(interface)를 상속받는 서브 인터페이스 정의 때 extends 사용 가능

즉, 인터페이스끼리는 상속(extends)이 가능하며, 다중 상속도 가능

 

 

 

 

interface고래 extends동물 { }

interface상어 extends동물 { }

class고래상어 implements고래, 상어 {

@Override

public void 번식() {

System.out.println("알을 낳아 번식!");

}

 

 

 

인터페이스(interface)를 상속받는 서브클래스 정의 때

extends 키워드가 아닌 implements 키워드 사용

 

즉, 클래스는 인터페이스(interface)를 구현(implement) 하며, 다중 구현도 가능

 

 

 

 

 

인터페이스(interface) 내에서는 슈퍼클래스의 모든 메서드가 추상 메서드이므로

중복되는 메서드에 대한

혼란이 없음( 왜? 구별 없이 직접 오버 라이딩을 하면 되기 때문)

 

 

 

 

 

인터페이스(interface) 만들기

 


 

 

 

인터페이스(interface)를 생성할 때 보이는 화면!!!! 클래스 생성과 다르다

 

 

 

 

 

 

 

 

 

인터페이스(interface)를 사용하면

강제성 및 통일성 제공한다!!!

 

 

 

 

추상 메서드보다 강력한 강제성을 부여한다

왜? 상수에다 추상 메서드, 딱 정해진 것만 써야 하기 때문이다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

인터페이스(interface)를 통한 다형성 활용

 


 

 

SuperMan, Bird, Airplane 인스턴스를 Flyer 인터페이스(interface) 타입으로

 

업 캐스팅하여 공통된 변수를 통해 공통된 메서드를 호출 가능 = 코드의 통일성 제공

 

 

 

 

 

 

 

 

 

 

 

다형성을 활용해서 배열 타입

 


 

for 문을 사용하여 각배 열 요소의 인스턴스에 있는 메서드 3개 호출

 

2가지 종류의 for 문

1) 일반 for 문

2) 향상된 for 문

 

 

 

 

 

 

 

 

 

 

 

 

인터페이스(interface)의 필요성


 

1) 구현의 강제로 표준화

2) 인터페이스(interface)를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원

3) 서로 상속 관계가 없는 클래스들에게 인터페이스(interface)를 통한 다형성 확장

4) 모듈 간 독립적 프로그래밍으로 개발 시간 단축

 

 

 

 

 

 

 

 

인터페이스 필요성_ 상속 관계가 없는 클래스들에게 인터페이스를 통한 다형성 확장

 

 


 

 

아무런 상속 관계가 없는 디지털카메라와 핸드폰 클래스는

공통부분이 없어 object 타입으로만 업 캐스팅이 가능함

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 되면 실제 인스턴스 기능을 사용하려면

instanceof연산자를 통해 인스턴스 타입을 판별한 후

다운 캐스팅을 통해 해당 인스턴스 멤버에 접근할 수 있음

(이렇게 되면 코드가 길어짐)

 

 

 

 

 

 

 

 

 

 

 

 

 

이것을 카메라와 디지털카메라의 공통인 부분인 충전할 수 있는 것을

따로 인터페이스(interface)로 꺼내서 두 개를 연결해 주는 역할을 한다

 

 

 

 

 

 

 

 

 

 

 

인터페이스(interface)를 사용하여 공통된 멤버를 갖는 상속관계를 부여하면

별도의 다운 캐스팅 없이 업 캐스팅된 상태로 멤버에 접근이 가능해짐

그래서 코드가 절약됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

인터페이스의 필요성_ 손쉬운 모듈 교체 지원

 


 

 

 

인터페이스(interface)를 활용해서 손쉬운 모듈 교체의 예를 살펴보자

 

 

 

 

모든 프린터의 공통 기능인 Printer 인터페이스 정의

Printer 인터페이스를 LasserPrinter와 DotPrinter 생성

 

 

 

 

 

 

 

 

 

 

각 프린터들을 Printer 인터페이스 타입으로 다루는 PrintClient 클래스 정의

Printer 인터페이스 타입의 변수 선언

private 지정했고, 외부로부터 인스턴스를 전달받아 저장할 Setter 정의

Printer 타입 인스턴스의 printer( ) 메서드 호출할 prinThis( ) 메서드 정의

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


인터페이스(interface)_핵심 키워드

 

 

 

 

 

 

 

 

 

 

 

 


ㅣ읽느라 수고 많으셨어요~ㅣ

 


 

 

 

 

 

 

 

 


 

 

부족한 글을 읽어주셔서 감사드립니다

아직 부족한 게 많으니

틀린 곳이 있다면

조언의 말씀 꼭 부탁드립니다!!!!

 

반응형

관련글 더보기