일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Inbound
- dbeaver
- identityHashCode
- has-a
- arraycopy
- Wrapper class
- generic programming
- Java
- down casting
- finalize
- 얕은 복사
- 내부클래스
- Stream
- 파이참
- 엔드포인트
- Up Casting
- node.js
- constructor
- extends
- shebang
- access modifier
- lambda
- 깊은 복사
- 자바
- pycharm
- parameter group
- 셔뱅
- 스트림
- public static final
- singletone
- Today
- Total
٩(๑•̀o•́๑)و
20200307 - 인터페이스 본문
인터페이스 vs 일반 클래스
-> 인터페이스는 껍데기. 인터페이스는 추상 메서드로만 이루어져 있다. 구현 코드가 들어가지 않음. new 될 수 없음 & 변수가 있어 보이긴 하지만 new 할 수 없기 때문에 인터페이스에 선언되어있는 모든 변수는 상수임 & 디폴트 메서드, 정적 메서드, private 메서드는 인터페이스를 구현하는 여러 클래스에서 중복으로 구현하는 것을 막기 위해 기본적으로 제공되는 메서드.
인터페이스 : 어떤 객체(Object)에 대한 명세. 이 객체가 어떤 메서드들을 제공하고, 어떤 역할을 하는 객체임을 설명하는 명세. 주로 설계단계에서 만든다. class가 아닌 interface로 쓴다. 컴파일되면 .class파일이 된다.
반환 값함수 이름(함수의매개변수)까지 인터페이스에서 메서드가 정의되는 형태를 함수의 시그니처 라고함. 이를 안다는 것은 대략의 구현을 알고 있다는 의미가 됨=> 인터페이스를 작성하는 이유.
인터페이스의 요소
- 추상 메서드 - 인터페이스 내의 모든 메서드는 추상메서드. 인터페이스 내에서 메서드에 abstract를 선언하지 않아도 인터페이스에서 선언한 메서드는 컴파일 과정에서 모두 추상 메서드로 변환됨.
- 상수 - 인터페이스에서 선언한 모든 변수는 컴파일 과정에서 상수로 변환됨(public static final이 붙음). 따라서 메모리는 상수 area를 사용
- 디폴트 메서드 - 기본 구현을 가지는 메서드. 구현하는 클래스에서 재정의할 수 있음 (java8에서 추가)
- 정적(static) 메서드 - 인스턴스 생성과 관계없이 인터페이스 타입으로 호출하는 메서드 (java8에서 추가)
- private 메서드 - 인터페이스 내에서 사용하기 위해 구현한 메서드. 디폴트 메서드나 정적 메서드 내에서 사용하기 위하여 구현. 구현하는 클래스에서 재정의, 사용 할 수 없음 (java9에서 추가)
인터페이스를 구현한다 = 선언된 메서드들을 구현함 => 다이어그램에서 점선으로 표현(상속은 실선)
역시 인터페이스를 일부만 구현하면 추상클래스가됨. (내부에 구현된 메서드와 추상 메서드가 혼재된 상태. 이땐 abstract뿐 아니라 implements까지 함께 붙여서 클래스 선언을 해야 함)
==> 인터페이스 -> 일부만 구현 : 추상 클래스 -> 추상 클래스를 상속받아 모두 구현 : concrete class
혹은 인터페이스 -> 전부 구현 : concrete class와 같은 흐름이 가능함
==> 실제 구현하는 클래스에서는 extends 가 아닌 implements를 사용 & 인터페이스에 정의된 모든 추상 메서드를 오버라이딩을 통하여 구현
하나의 인터페이스를 정의하고 이를 여러 클래스에서 구현할 것 = 다형성의 과정 => 사용자 입장에서는 구현 코드와 관계없이 명세만 보고 사용이 가능해짐 ==> 인터페이스의 중요 역할 중 하나
Calc calc = new CompleteCalc();
인터페이스를 구현한 클래스는 인터페이스 타입으로 변수를 선언하여 인스턴스를 생성할 수 있음. ==> 다형성을 위해 주로 이렇게 사용
위의 소스상에서 Calc형 변수와 Calculator형 변수는 add(), substract(), times(), devide() 사용하능 & CompleteCalc형 변수는 여기에 showInfo()까지 추가로 사용이 가능
인터페이스 자체는 구현 코드가 없기 때문에 타입 상속이라고도 함. (디폴트, 정적, private 메서드는 구현 코드가 있으나 인스턴스 생성과는 관계가 없고 공유를 위하여 일부 제공해주는 용도이기에 인터페이스 자체는 구현코드가 없다고 봐야 함)
인터페이스의 역할
- 클라이언트 프로그램에 어떤 메서드를 제공하는지 알려주는 명세(specification) 또는 약속 - 클라이언트 프로그램은 인터페이스를 보고 어떤 파라미터를 갖고 어떤 메소드를 호출하면 어떤 타입의 리턴값을 주는지, 즉 어떻게 가져다 쓰는지를 확인하고 이를 호출
- 한 객체가 어떤 인터페이스의 타입이라 함은 그 인터페이스의 메서드를 구현했다는 의미
- 클라이언트 프로그램은 실제 구현 내용을 몰라도 인터페이스의 정의만 알면 그 객체를 사용할 수 있음
- 인터페이스를 구현해 놓은 다양한 객체를 사용함. 실제 수행되는 구현부는 어떤 인스턴스가 대입되었는지에따라서 달라짐 = 다형성 (ex. JDBC를 구현한 오라클, MSSQL 라이브러리 등)
- ex. JDBC (Java DB Connectivity) : 자바 프로그램이 db와 연결하여 어떻게 쓸건지를 정의해둔 내용. Connection, Statement(쿼리 날릴때 사용)과 같은 객체가 필요함 -> 이런 것들이 자바에 선언되어있다. (Interface Connection , Interface Statement, ...) ==> 전부 인터페이스이기때문에 구현코드가 없다. 이를 구현해주는건 우리가 아님. oracle, mysql, mssql 등의 서드파티사들이 구현을 하고 이를 라이브러리(jar file)로 제공을 해줌. 따라서 우리는 jar파일을 임포트해서 사용하면됨 & 이때 우리는 실제 사용시 jar파일을 까서 보지 않고 interface정의서에 있는 메서드들을 보고 사용을 한다. ==> 인터페이스는 일종의 스펙이다!
추상 클래스 vs 인터페이스
- 추상클래스는 공통되는 모듈이 있을수도 있고, 없을 수도 있음 & 클래스이기때문에 1개만 상속을 받는다
- 인터페이스는 순수하게 명세만 되어있기 때문에 여러개를 상속받을 수 있다 & 디폴트 메서드 같은 개념이 추가되면서 재정의 해야하는 부분이 있기도 함.
==> 인터페이스와 strategy pattern : 인터페이스를 활용하면 다양한 정책이나 알고리즘을 프로그램의 큰 수정 없이 적용&확장할 수 있음
private static void myStaticMethod(){
System.out.println("private static method");
}
private static 메서드도 선언이 가능하다. 이 경우에는 인터페이스 내의 static 메서드 내에서 사용이 된다. (cf. static메서드에서 일반 메서드 호출 불가)
private method부터는 자바9부터 지원이 된다.
여러개의 인터페이스 구현하기
- 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스를 구현할 수 있음 - 자바에서 extends 뒤에는 클래스가 하나밖에 올 수 없지만(다이아몬드 problem 때문. 구현의 중복이 일어날 수 있음) 인터페이스의 경우에는 구현코드가 없기에 여러개를 구현해도 상관이 없음. 하지만 여러개의 인터페이스를 구현하다보면 중복이 생길 수 있음.
- 디폴트 메서드의 이름이 중복되는 경우에는 재정의함
인터페이스 상속
- 인터페이스 간에도 상속이 가능함
- 구현이 없으므로 extends 뒤에 여러 인터페이스를 상속받을 수 있음
- 구현 내용이 없으므로 타입 상속(type inheritance)라고 함
인터페이스 구현과 클래스 상속을 함께 사용할 수도 있다.
public class BookShelf extends Shelf implements Queue{}
업캐스팅 역시 가능
'Java' 카테고리의 다른 글
20200308 - String, Wrapper Class (0) | 2020.03.08 |
---|---|
20200307 - Object Class (0) | 2020.03.07 |
20200306 (0) | 2020.03.06 |
20200305 (0) | 2020.03.06 |
20200304 (0) | 2020.03.05 |