Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 드론
- jsp
- 서울시여성가족재단
- 2024우먼테크위크
- Spring Security
- 2023 ICT R&D 주간
- 자율주행자동차
- transaction
- spring boot
- Cos Pro
- 도서관 수업
- html
- js
- 스마트리움
- 뚜루뚜루
- 알티노
- 초등학생 겨울방학 놀이
- 핑퐁로봇
- 이것이 자바다
- Java
- 콜백함수
- 코딩수업
- spring
- 초등학생 코딩수업
- 은평구립도서관
- 2024겨울방학 코딩부트캠프
- 자바
- 초등학교 코딩수업
- 코딩부트캠프
- CSS
Archives
- Today
- Total
블로그
[JAVA] 중첩 클래스, 익명 클래스 본문
선언 위치에 따른 분류 | 선언 위치 | 객체 생성 조건 | |
멤버 클래스 | 인스턴스 멤버 클래스 | class A { class B { ... }} | A 객체를 생성해야만 B 객체를 생성할 수 있음 |
정적 멤버 클래스 | class A { static class B { ··· }} | A 객체를 생성하지 않아도 B 객체를 생성할 수 있음 | |
로컬 클래스 | class A { void method() { class B { · · · }} | method가 실행할 때만 B 객체를 생성할 수 있음 |
멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스
로컬 클래스 : 메소드 내부에서 선언되는 중첩 클래스
인스턴스 멤버 클래스

- B 객체는 A 클래스 내부 어디에서나 생성할 수는 없고, 인스턴스 필드값, 생성자, 인스턴스 메소드에서 생성할 수 있다.
- A 객체가 있어야 B 객체도 생성할 수 있기 때문이다.
정적 멤버 클래스

- 정적 멤버 클래스 B는 A 클래스 내부에서 사용되기도 하지만,
- A 클래스 외부에서 A와 함께 사용되는 경우가 많기 때문에 주로 default 또는 public 접근 제한을 가진다.
- B 객체는 A 클래스 내부 어디든 객체를 생성할 수 있다.
로컬 클래스

- 로컬 클래스는 생성자와 메소드가 실행될 동안에만 객체를 생성할 수 있다.
- 로컬 클래스 B 내부에는 일반 클래스와 같이 필드, 생성자, 메소드 선언이 올 수 있다.
- (정적 필드, 정적 메소드는 Java 17부터 선언 가능)
- 로컬 변수(생성자 또는 메소드의 매개변수 또는 내부에서 선언된 변수)를 로컬 클래스에서 사용할
- 경우 로컬 변수는 final 특성을 갖게 되므로 값을 읽을 수만 있고 수정할 수 없게 된다.
- 그 이유는 로컬 클래스 내부에서 값을 변경하지 못하도록 제한하기 때문이다.
- Java 8 이후부터는 명시적으로 final 키워드를 붙이지 않아도 된다
중첩 인터페이스

- 중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스를 말한다.
- 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위해서이다.
- 중첩 인터페이스는 안드로이드와 같은 UI 프로그램에서 이벤트를 처리할 목적으로 많이 활용된다.
- 예를 들어 버튼을 클릭했을 때 이벤트를 처리할 객체는 중첩 인터페이스를 구현해서 만든다.
익명 클래스(Anonymous class)
말 그대로 이름이 없는 클래스이다.
익명 클래스는 인스턴스 생성과 상속을 한번에 처리한다.
public class C01AnonymousClass {
public static void main(String[] args) {
// C01MyClass obj = new C01MyClass(); // 불가능
// C01MyClass obj = new C01Child(); // 불가능
// 추상클래스는 객체를 만들지 못한다
// 익명클래스의 객체
C01Parent obj = new C01Parent(){};
// 클래스와 인스턴스를 동시에 만든다.
}
}
abstract class C01Parent {}
//class C01Child extends C01MyClass{} //익명클래스에선 상속클래스를 생략한다
- 클래스의 선언과 객체의 생성이 동시에 이루어진다
추상클래스 안에 메소드가 있을 경우, 익명클래스에서 재정의(Override)를 꼭 해야 한다.
public class C03AnonymousClass {
public static void main(String[] args) {
C03Parent obj = new C03Parent() {
// 추상메소드 꼭 재정의하기
@Override
void method() {
System.out.println("C03AnonymousClass.method");
}
};
obj.method();
}
}
abstract class C03Parent {
abstract void method(); // 메소드 존재
}
클래스가 아닌 인터페이스로도 가능하다. 이는 람다식으로 표현할 수 있다.
public class C06AnonymousClass {
C06MyInterface o = new C06MyInterface() {
@Override
public void method1() {
System.out.println("C06AnonymousClass.method1");
}
@Override
public void method2() {
System.out.println("C06AnonymousClass.method2");
}
};
}
interface C06MyInterface {
void method1(); //추상 메소드
void method2();
}
public class C08Lamda {
public static void main(String[] args) {
C08MyInterface obj = () -> System.out.println("재정의");
obj.method();
}
}
// 추상 메소드가 하나인 인터페이스의
// 익명클래스 객체 생성시 람다 표현식으로
// 코드를 간단하게 작성 가능하다
interface C08MyInterface {
void method(); //추상 메소드가 있으면 위에서 꼭 재정의 해야 함
}
출처 : 이것이 자바다
'개발자 준비과정 > JAVA' 카테고리의 다른 글
[JAVA] Object 클래스, 포장 클래스(Wrapper class) (1) | 2024.03.14 |
---|---|
[JAVA] 람다식 (0) | 2024.03.13 |
[JAVA] instanceof 연산자 (0) | 2024.03.11 |
[JAVA] 객체 배열... (3) | 2024.03.07 |
[JAVA] Class String, Arrays 주요 메소드 (1) | 2024.03.06 |