본문 바로가기

Java/Java 기초

내부 클래스, 익명 클래스, 람다식

1. 내부클래스(Inner Class)


클래스 내부에서 선언된 클래스를 내부클래스라고 한다
내부클래스를 가진 클래스를 외부 클래스라고 한다
클래스를 구성하는 멤버는 변수(필드), 메소드, 생성자, 클래스가 있다
만약 B클래스를 A클래스에서만 사용한다면 B클래스를 내부 클래스로 만들어서 사용한다
외부클래스가 메모리에 할당되어야만 내부클래스의 객체화가 가능하기 때문에 B를 별도로 사용하지 못한다
내부클래스는 외부클래스의 멤버이기 때문에 외부 클래스의 멤버를 상속없이 사용할 수 있다


(1) 내부클래스를 사용하는 이유


코드의 가독성과 유지보수성을 향상시키기 위해, 외부 클래스의 멤버에 쉽게 적용가능하기 때문에 사용한다
- 캡슐화 : 내부클래스는 외부 클래스 내부에서만 사용이 가능하므로 외부 클래스의 내부 구현을 숨기고 캡슐화할 수 있다
- 코드 정리 : 관련 있는 클래스를 논리적으로 그룹화하여 코드를 구조화하고 유지보수성을 용이하게 만든닫
- 코드 재사용 : 내부 클래스를 사용하면 특정 외부 클래스에서만 사용하는 클래스를 정의하고 재사용할 수 있다


(2) 내부클래스의 종류


1) 인스턴스 내부 클래스 : 다른 클래스 내부에서 선언되는 클래스
외부 클래스의 인스턴스와 연관되어 있다
인스턴스 내부클래스의 필드, 메소드외에도 외부 클래스의 인스턴스 변수에 접근 가능

2) 스태틱 내부클래스 : 다른 클래스 내부에서 선언되는 클래스
외부 클래스의 인스턴스와 상관없이 독립적으로 사용될 수 있다
외부 클래스의 필드, 메소드에 접근 가능

3) 로컬 내부 클래스 : 메소드나 초기화 블록 내부에서 선언되는 클래스
선언된 블록에서만 사용 가능

- 인스턴스 내부 클래스는 외부 클래스의 인스턴스가 있어야만 생성가능하다
(내부 클래스의 인스턴스를 생성할 때는 외부 클래스의 인스턴스를 먼저 생성한 후 그 인스턴스를 이용해 내부 클래스의 인스턴스를 생성해야한다)
- 스태틱 내부 클래스는 외부 클래스의 인스턴스 없이도 생성가능하다
(외부 클래스의 인스턴스를 먼저 생성하지 않아도 된다)


2. 익명클래스(Annoymous Class)


이름이 없는 클래스
미구현된 멤버를 구현하여 일회성으로 객체를 생성하기 위해 사용한다
익명클래스는 클래스 내부에서 선언하며, 객체를 생성할 때 바로 구현해주는 방식으로 사용된다


3. lambda(람다식) : 익명메소드


자바 8버전부터 사용가능하다
메소드를 하나의 식으로 표현한다
람다식을 매개변수로 전달 가능하며, 반환도 가능하다
함수형인터페이스는 추상 메소드가 한개만 선언되기 때문에 람다식으로 재정의할 때는 메소드 이름이 필요 없다


(1) 람다식문법


매개변수 -> 바디
lambda 패키기지의 lambdaTest.java 참고

//람다식으로 변경
// 자료형 메소드명(){출력문}
// void printHello(){System.out.println("안녕하세요");}
// 1. 이름을 없애고 -> 를 추가한다
// void ()-> {System.out.println("안녕하세요");}
// 2. 반환타입은 추론이 가능하므로 생략한다
// () -> {System.out.println("안녕하세요");}
// 3. 명령문이 1줄이면 중괄호와 세미콜론을 생략가능하다(선택)
// () -> System.out.println("안녕하세요")


// 람다식으로 변경
// 1. 이름을 없애고 -> 추가
// int(int num) -> {return num + 10;}
// 2. 반환타입은 추론이 가능하므로 생략한다
// (int num) -> {return num + 10;}
// 3. 매개변수 타입은 추론이 가능하므로 생략가능하다(선택)
// (num) -> {return num + 10;}
// 4. 매개변수가 1개라면 ()를 생략가능하다(선택)
// 단, 자료형을 생략하지 않았다면 소괄호를 생략할 수 없다
// num -> {return num + 10;}
// 5. 중괄호와 세미콜론을 생략가능하다(선택)
// 단, 중괄호와 세미콜론을 생략하면 return도 생략해야한다
// 바디의 결과가 값이라면 자동으로 return된다
// 단, 바디에 명령문이 1개어야만 한다
// num -> num + 10


//1. 이름없애고 -> 추가
//2. 반환타입 추론가능하므로 생략
//3. 매개변수가 2개 이상이므로 () 생략 불가
//4. 매개변수 타입으로 추론가능하므로 생략한다
//5. 명령어가 2개 이상이므로 {} 와 ; 생략 불가
//6. 반환할 값이 존재한다면 return 사용하기
// (num1,num2) -> {System.out.println(num1 + "+" + num2 + "=" +(num1 + num2)); return num1 + num2;}

 


(2) 함수형 인터페이스(Functional interface)


단 하나의 추상메소드를 가지고 있는 인터페이스
@FunctionalInterface 어노테이션을 명시해주면 하나의 추상 메소드만 선언할 수 있도록 제한 할 수 있다

'Java > Java 기초' 카테고리의 다른 글

Object , Wrapper 클래  (0) 2024.01.02
예외처리, API  (0) 2023.12.26
추상클래스와 인터페이스  (0) 2023.12.21
Casting (형변환)  (0) 2023.12.20
상속 세부개념 및 접근 제한자  (0) 2023.12.19