[Java] 중첩 클래스와 람다식
글 작성자: _rian
contents
1. 내부 클래스와 내부 인터페이스
2. 무명 클래스
3. 람다식
중첩 클래스와 중첩 인터페이스
중첩 클래스
클래스 멤버로 선언된 클래스
class ClassName{
class NestedClassName{ //중첩 클래스
}
}
중첩 인터페이스
- 클래서 멤버로 선언된 인터페이스
- 그래픽 프로그래밍에서 이벤츠 처리할 때 자주 활용
class ClassName{
interface NestedInterfaceName{ //중첩 인터페이스
}
}
중첩 클래스나 중첩 인터페이스의 특징
- 중첩 클래스(nested class)나 중첩 인터페이스(nested interface)는 외부로부터 스스로를 감추며, 외부 클래스와 밀접한 관계를 가짐.
- 중첩 클래스는 외부 클래스(outer class)의 private 멤버를 비롯해 모든 멤버에게 자유롭게 접근 가능
- 따라서 일반적으로 프로그램을 유지, 보수하기가 쉽고 프로그램이 간단해지지만 중첩 클래스가 복잡할 경우 가독성 저하
중첩 클래스 종류
클래스 생성 시 바이트 코드가 따로 생성된다.
중첩 클래스 및 중첩 인터페이스 구조
일반적으로 인스턴스 멤버 클래스를 내부 클래스(inner class)라 부른다.
컴파일 결과 파일
- 중첩 클래스와 중첩 인터페이스도 컴파일하면 별도의 바이트 코드 파일 생성
- 외부 클래스 이름, 달러 기호($), 숫자, 중첩클래스 이름과 연결하여 만들어짐.
내부 클래스가 외부 클래스를 참조하려면
외부클래스.this
멤버 클래스의 객체 생성
외부클래스.인스턴스멤버클래스 변수 = 외부클래스의객체변수.new 인스턴스멤버생성자();
외부클래스.정적멤버클래스 면수 = new 외부클래스.정적멤버클레스생성자();
인스턴스 멤버 클래스
정적 멤버 클래스
지역 클래스
무명 클래스
- 한번만 사용하기 때문에 이름이 없는 클래스
- 단독 생성 불가 : 클래스 상속하거나 인터페이스 구현해야만 생성 가능
무명 클래스 예제
//부모로 사용할 샘플 클래스
public class Bird{
public void move(){
System.out.println("새가 움직인다~~");
}
}
public class Anonymous1Demo{
Bird e = new Bird() {
public void move() {
System.out.println("독수리 난다~~~");
}
public void sound() {
System.out.println("휘익~~");
}
}
public static void main(String[] args){
Anonymous1Demo a = new Anonymous1Demo();
a.e.move();
a.e.sound();
}
}
무명 멤버 클래스에 새롭게 정의된 필드와 메소드
- 무명 멤버 클래스 내부에서만 사용
- 외부에서는 무명 객체의 필드와 메소드에 접근할 수 있음
- 무명 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용 가능
람다식
정렬 메서드의 인수로 코드블록이나 메서드를 사용할 수 있다면....
람다식의 의미
하나의 코드 블록만 정의할 수 있기 때문에 모든 인터페이스의 구현 객체를 람다식으로 표현할 수 없음
단지 1개의 추상 메소드로 구성된 인터페이스 구현 객체만 람다식으로 표현 가능 => 이 인터페이스를 함수형 인터페이스라고 함.
- JDK 8부터 도입한 함수형 프로그래밍 기법 중 하나
- 자바는 무명 구현 객체 대신에 람다식을 메서드의 인수로 사용하도록 허용
- 람다식은 메서드를 감싼 무명 구현 객체를 자바가 전달할 수 있는 코드 블록처럼 흉내낸 것
- 자바는 무명 구현 객체를 람다식으로 표현해 함수형 프로그래밍을 모방한 것
- 람다식을 사용하면 무명 객체보다 프로그램의 간결성 및 가독성 향상
형식
- 매개변수 타입 생략 가능
- 매개변수가 하나 있다면 괄호를 생략 가능, 없으면 괄호가 꼭 필요
- 실행문이 하나라면 중괄호와 세미콜론을 생략 가능. 단, 실행문이 return 문이면 return 키워드도 생략
- 반환 타입을 표현하지 않음
다양한 방식의 람다식 표현 예
//함수형 인터페이스
interface Negative{
int neg(int x);
}
public class Lambda2Demo{
public static void main(String[] args){
// 모두 동일한 의미의 람다식 표현
Negative n;
n = (int x) -> {return -x;);
n = (x) -> {return -x;};
n = x -> {return -x;};
n = (int x) -> -x;
n = (x) -> -x;
n = x -> -x;
}
}
메서드 참조
- 전달할 동작을 수행하는 메서드가 이미 정의된 경우에 표현할 수 있는 람다식의 축약형
- 람다식에 아직 남아있는 불필요한 정보까지 없애기 때문에 람다식에 비해 더욱 간결하고 가독성 제고
람다식과 대응하는 메서드 참조
종류 | 람다식 | 메서드 참조 |
정적 메서드 참조 | (a) -> ClassName.staticMethod(a) | ClassName::staticMethod |
인스턴스 메서드 참조 | (a, b) -> a.instanceMethod(b) (단, a는 ClassName 타입이다.) |
ClassName::instanceMethod |
(a) -> obj.instanceMethod(a) | obj::instanceMethod | |
생성자 참조 | (a) -> new Constructor(a) | Constructor::new |
배열 생성자 참조 | (a) -> new Type[a] | Type::new |
메서드 참조 활용
'Computer Engineering > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map (0) | 2019.12.16 |
---|---|
[Java] 제네릭 프로그래밍 (0) | 2019.12.16 |
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류 (0) | 2019.12.15 |
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends (0) | 2019.12.11 |
[Java] 추상클래스와 인터페이스 (0) | 2019.11.22 |
댓글
이 글 공유하기
다른 글
-
[Java] 제네릭 프로그래밍
[Java] 제네릭 프로그래밍
2019.12.16 -
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
2019.12.15 -
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
2019.12.11 -
[Java] 추상클래스와 인터페이스
[Java] 추상클래스와 인터페이스
2019.11.22