728x90
🟩 Ch09. 인터페이스/람다식/패키지
09-1. 인터페이스 개요
[인터페이스]
- 클래스 간 상호작용의 표준 규격
- 규격 안에 합의된 추상 메소드 작성
- 인터페이스 내부에는 기본적으로 추상 메소드, 상수만 선언 가능(자동 처리됨)
[구현 클래스]
- implement 키워드
- 인터페이스를 구현한 클래스 내부에는 반드시 인터페이스의 추상 메소드 전부를 재정의
- 이후 실행 메소드에서 구현 객체 생성하여 사용 O
[인터페이스 VS 추상클래스] : 자체로 객체 생성 불가능
- 추상 클래스 : 하위 실체 클래스들의 공통 속성들을 내부에 선언해둔 클래스
: 내부에 (공통 속성이기만 하면) 인스턴스(일반) 필드, 메소드도 정의할 수 O
- 인터페이스 : 기본적으로 내부에 추상 메소드와 상수변수만 선언 허용함
<추상 클래스 사용>
- 관련된 클래스 사이에서 공통 필드, 메소드 수 많은 경우 추상 클래스로 통일해서 사용 多
- 정적 아닌 필드, 상수 아닌 필드 선언해서 내부 작성할 때(vs 인터페이스)
<인터페이스 사용>
- 관련 없는 클래스도 인터페이스를 구현하기 원할 때 사용 O
- 다중 상속 가능한 성질 이용할 때
09-2. 인터페이스의 다형성
[인터페이스 다형성]
- 인터페이스 타입 변수에 하위 구현 객체들을 대입하면,
해당 구현 객체에서 재정의해놓은 메소드들이 호출 가능해져서 실행 결과 다양해짐
- 인터페이스 타입으로 선언된 자리에 구현 객체 대입 시 자동 타입 변환되어
해당 인터페이스의 추상 메소드를 재정의한 구현 객체의 다양한 실체 메소드 내용 호출됨
→ 실행 결과 다채로워짐
09-3. 인터페이스 다중 상속
- 기존 인터페이스에 확장된 메소드 작성 시-> 연결되어 있던 모든 구현 클래스 동작 X
- 해결: 기존 인터페이스는 건들이지 않고, 기존 인터페이스를 상속받은 인터페이스에 추가 기능 메소드 선언해서 사용 O
→ 이 경우, 인터페이스 사용자들은 업데이트 선택권 생김
[인터페이스를 이용→ 클래스 다중 상속 구현]
- 기본적으로 인터페이스는 다중 상속 가능 O / 클래스는 다중 상속 불가능X
- 하나의 클래스를 상속받을 수 있는 상태에서 인터페이스도 함께 상속받아 다중상속 효과O
(1) 여러 개의 인터페이스 구현 -> 다중 상속 효과 O
public class 구현클래스 implement 인터페이스1, 인터페이스2, 인터페이스3 ... {}
(2) 하나의 클래스 상속받고, 동시에 인터페이스도 구현 -> 다중 상속 효과 O
public class 클래스 extends 부모 implements 인터페이스 {}
09-4. JDK 8 버전부터 추가.
**인터페이스 내부에 선언 가능한 메소드 : 디폴트 메소드, 정적 메소드**
[디폴트 메소드]
- default 키워드
- 인터페이스 내부에는 기본적으로 추상 메소드(내용 구현X)만 선언 가능했지만,
업데이트 이후) 구현 클래스에서도 따로 재정의 없이 사용 가능한 디폴트 메소드(내부구현O)를 추가
- 등장 이유: 기존 인터페이스에 추가 기능 메소드를 디폴트 메소드로 추가하여
(인터페이스 상속 없이도) 기존에 연결되어있던 구현 클래스들 코드 수정 없이 추가 메소드 사용O
[정적 메소드]
- static 키워드
- 구현 클래스에서 따로 재정의없이도 바로 인터페이스.메소드()로 접근해서 호출 사용O
- 기존 인터페이스에 새로운 메소드 추가할 경우,
정적 메소드로 추가되면 기존 구현 객체들 코드 수정없이(재정의X) 해당 메소드 사용이 가능O
09-5. 익명 객체 (무명 객체)
[익명 객체] : 이름 없는 객체
- 클래스를 정의하는 동시에 객체를 생성
- 재사용X 특정 위치에서만 사용할 기능에 대해서 익명 객체로 구현 多
[익명 자식 객체]
부모타입 변수 = new 부모생성자(매개값) { ... };
[익명 구현 객체]
인터페이스타입 변수 = new 인터페이스() { ... };
<사용>
**(부모,인터페이스 타입) 으로 선언된 변수 ← 즉시 대입시켜서 바로 기능 연결 구현 O**
- 필드 변수 <- 바로 익명 객체 대입
- 메소드 내 로컬 변수 <- 바로 익명 객체 대입
- 메소드의 매개변수 <- 익명 객체 대입
09-6. 람다식
[람다식]
- 이름 없는 메소드 (간결 작성 메소드)
- 다른 메소드의 매개변수로 ‘메소드’ 전달할 경우, 람다식으로 간단히 전달 가능
- 메소드 한 번만 사용 + 내용 짧은 경우에 유용
- 매개변수로 람다식 대입 -> 해당 메소드 실행 내부에서 바로 람다식 기능 사용 O
- ?: 객체를 매개값으로 받는 메소드의 매개변수에 람다식 연결 시 → 람다식(메소드) 전달되어 해당 객체 실행된다.
<기본 구조>
(매개변수1, 매개변수2...) -> { 실행부(반환값처리) };
[람다식 특징]
>> 매개변수
- 0개 이상 가짐
- ()괄호로 묶여서 쉼표로 구분함
- () : 매개변수 없음
- 단일 매개변수의 경우 괄호 생략 가능O
>> 람다식 본문 { } 실행부
- 0개 이상의 문장 가짐
- 단일 문장은 {}중괄호 생략 가능O
- 하나 이상의 문장은 반드시 {}중괄호 묶음
09-7. 함수 인터페이스와 람다식
[함수 인터페이스 ]
- 하나의 추상 메소드만 선언해 놓은 인터페이스
ex) Runnable 인터페이스 안에는 run() 추상메소드 1개만 선언됨 : 함수 인터페이스
- 함수 인터페이스 타입 변수 ← 람다식 대입 시, 람다식은 함수 인터페이스 타입으로 자동 타입 변환되어 main에서 해당 인터페이스의 추상 메소드 호출할 때 람다식 내용이 실행됨
interface MyInterface { //함수 인터페이스
void sayHello(); //추상 메소드 1개
}
public class LamdaTest {
public static void main(String[] args) {
MyInterface a = () -> System.out.println(“Hello Lamda!”);
a.sayHello(); //추상메소드 호출 -> 대입된 람다식 내용이 호출됨
}
}
728x90
'Java > [학교] Java_GUI' 카테고리의 다른 글
자바_프로젝트_스윙_(리듬게임) (0) | 2021.12.12 |
---|---|
ch12. 스윙 컴포넌트들 (0) | 2021.10.05 |
ch11. 그래픽 프로그래밍 (0) | 2021.09.28 |
ch10. 사용자 이벤트 처리 (0) | 2021.09.14 |
ch08. 그래픽 사용자 인터페이스 (0) | 2021.09.05 |