티스토리 뷰
jdk8 기준으로 작성되었고,
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html 번역한 글입니다.
Anonymous Classes (익명 클래스)
- 익명 클래스를 사용하면 코드를 좀더 간결하게 만들수 있다.
- 이 클래스를 이용하여 동시에 클래스를 선언하고 인스턴스와 할 수 있다.
- 이름이 없다는 것을 제외하고는 로컬 클래스와 같다.
- 로컬 클래스를 한 번만 사용해야 하는 경우에 사용해야한다.
이 절에서는 다음 주제를 다룬다.
- Declaring Anonymous Classes (익명 클래스 선언)
- Syntax of Anonymous Classes (익명 클래스의 구문)
- Accessing Local Variables of the Enclosing Scope, and Declaring and Accessing Members of the Anonymous Class (둘러싼 범위의 로컬 변수 엑세스 및 익명 클래스의 멤버 선언 및 엑세스)
- Examples of Anonymous Classes (익명 클래스의 예)
Declaring Anonymous Classes (익명 클래스 선언)
- 로컬 클래스의 경우에는 클래스 선언이지만, 익명 클래스는 표현식이므로, 다른 표현식에서 클래스를 정의해야한다.
- 아래 예제인 HelloWorldAnonymousClasses는 지역변수 frenchGreeting와 spanishGreeting의 초기화를 익명 클레스에서 하지만 변수 englishGreeting의 초기화는 로컬 클래스에서 하고 있다.
public class HelloWorldAnonymousClasses {
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
public void sayHello() {
class EnglishGreeting implements HelloWorld {
String name = "world";
public void greet() {
greetSomeone("world");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hello " + name);
}
}
HelloWorld englishGreeting = new EnglishGreeting();
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
HelloWorld spanishGreeting = new HelloWorld() {
String name = "mundo";
public void greet() {
greetSomeone("mundo");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hola, " + name);
}
};
englishGreeting.greet();
frenchGreeting.greetSomeone("Fred");
spanishGreeting.greet();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp =
new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
-
실행 화면
Hello world Salut Fred Hola, mundo
Syntax of Anonymous Classes (익명 클래스의 구문)
- 앞에서 언급했듯이 익명 클래스는 표현식입니다.
- 익명 클래스 표현식의 구문은 코드 블록에 클래스 정의가 포함되어 있다는 점을 제외하고는 생성자 호출과 같습니다.
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
- 익명 클래스 표현식은 다음과 같이 구성됩니다.
- 새 연산자
- 구현할 인터페이스의 이름 또는 확장 할 클래스의 이름입니다. 이 예제에서 익명 클래스는 HelloWorld 인터페이스를 구현합니다.
- 일반 클래스 인스턴스 생성 식과 마찬가지로 생성자에 대한 인수가 포함 된 괄호 참고 : 인터페이스를 구현할 때 생성자가 없으므로이 예에서 빈 괄호 쌍을 사용합니다.
- 클래스 선언 본문 인 본문입니다. 보다 구체적으로, 본문에서는 메소드 선언이 허용되지만 명령문은 허용되지 않습니다.
- 익명 클래스 정의는 표현식이므로 명령문의 일부 여야합니다. 이 예제에서 익명 클래스 표현식은 frenchGreeting 객체를 인스턴스화하는 명령문의 일부입니다. (이것은 닫는 중괄호 뒤에 세미콜론이있는 이유를 설명합니다.)
Accessing Local Variables of the Enclosing Scope, and Declaring and Accessing Members of the Anonymous Class (둘러싸는 범위의 로컬 변수 액세스 및 익명 클래스의 멤버 선언 및 액세스)
-
로컬 클래스와 마찬가지로 익명 클래스는 변수를 캡처 할 수 있습니다. 이들은 범위를 둘러싸는 지역 변수에 동일한 액세스 권한을 갖습니다.
- 익명의 클래스는 그 둘러싸는 클래스의 멤버에 액세스 할 수 있습니다.
- 익명 클래스는 최종 범위 또는 유효 최종 변수로 선언되지 않은 해당 범위에서 로컬 변수에 액세스 할 수 없습니다.
- 중첩 클래스와 마찬가지로 익명 클래스의 유형 선언 (변수와 같은)은 동일한 이름을 가진 둘러싼 범위의 다른 선언을 모두 음영 처리합니다. 자세한 정보는 음영을 참조하십시오.
-
익명 클래스는 멤버에 대한 로컬 클래스와 동일한 제한 사항을가집니다.
- 익명 클래스에 정적 이니셜 라이저 또는 멤버 인터페이스를 선언 할 수 없습니다.
- 익명 클래스는 상수 변수를 제공하면 정적 멤버를 가질 수 있습니다.
-
익명 클래스에서 다음을 선언 할 수 있습니다.
- 필드
- 추가 메서드(슈퍼 타입의 메소드를 구현하지 않더라도)
- 인스턴스 초기화
- 지역 클래스
-
그러나 익명 클래스에서는 생성자를 선언 할 수 없습니다.
Examples of Anonymous Classes (익명 클래스의 예)
-
익명 클래스는 그래픽 사용자 인터페이스 (GUI) 응용 프로그램에서 주로 사용됩니다.
-
JavaFX 예제 HelloWorld.java (Hello World, JavaFX 시작하기에서부터 JavaFX 스타일 섹션 참조)를 고려하십시오. 이 샘플에서는 'Hello World'라고 말한 프레임이 포함 된 프레임을 만듭니다. 익명 클래스 표현식이 강조 표시됩니다.
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
-
이 예제에서 메소드 호출 btn.setOnAction은 'Hello World'라고 말하면 무슨 일이 발생하는지 지정합니다.
-
이 메서드에는 EventHandler 유형의 객체가 필요합니다.
-
EventHandler 인터페이스에는 처리 방법이 하나만 포함되어 있습니다.
-
예제에서는 새 클래스로이 메서드를 구현하는 대신 익명의 클래스 식을 사용합니다.
-
이 표현식은 btn.setOnAction 메소드에 전달 된 인수입니다.
-
EventHandler 인터페이스에는 하나의 메서드 만 있기 때문에 익명 클래스 식 대신 람다 식을 사용할 수 있습니다. 자세한 정보는 람다 식을 참조하십시오.
-
익명 클래스는 둘 이상의 메소드가 포함 된 인터페이스를 구현하는 데 이상적입니다.
-
다음 JavaFX 예제는 UI 컨트롤 사용자 정의 섹션의 예제입니다.
-
강조 표시된 코드는 숫자 값만 허용하는 텍스트 필드를 만듭니다.
-
TextInputControl 클래스에서 상속 된 replaceText 및 replaceSelection 메서드를 재정 의하여 익명 클래스를 사용하여 TextField 클래스의 기본 구현을 재정의합니다.
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class CustomTextFieldSample extends Application {
final static Label label = new Label();
@Override
public void start(Stage stage) {
Group root = new Group();
Scene scene = new Scene(root, 300, 150);
stage.setScene(scene);
stage.setTitle("Text Field Sample");
GridPane grid = new GridPane();
grid.setPadding(new Insets(10, 10, 10, 10));
grid.setVgap(5);
grid.setHgap(5);
scene.setRoot(grid);
final Label dollar = new Label("$");
GridPane.setConstraints(dollar, 0, 0);
grid.getChildren().add(dollar);
final TextField sum = new TextField() {
@Override
public void replaceText(int start, int end, String text) {
if (!text.matches("[a-z, A-Z]")) {
super.replaceText(start, end, text);
}
label.setText("Enter a numeric value");
}
@Override
public void replaceSelection(String text) {
if (!text.matches("[a-z, A-Z]")) {
super.replaceSelection(text);
}
}
};
sum.setPromptText("Enter the total");
sum.setPrefColumnCount(10);
GridPane.setConstraints(sum, 1, 0);
grid.getChildren().add(sum);
Button submit = new Button("Submit");
GridPane.setConstraints(submit, 2, 0);
grid.getChildren().add(submit);
submit.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
label.setText(null);
}
});
GridPane.setConstraints(label, 0, 1);
GridPane.setColumnSpan(label, 3);
grid.getChildren().add(label);
scene.setRoot(grid);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
'[JAVA]' 카테고리의 다른 글
[java] Cannot resolve symbol 'Resource' 에러 (0) | 2022.09.19 |
---|---|
[java] mulityKeyMap get 사용시 주의점 (0) | 2020.11.17 |
[java] for문 조건문 내 함수 사용시 주의 사항. (0) | 2020.11.15 |
[java] servlet 등록 방법 (0) | 2020.11.04 |
[java8] CompletableFuture 에러 처리 (0) | 2019.05.23 |
- Total
- Today
- Yesterday
- spring
- Mockito
- IntelliJ
- hot-deploy
- spring-security
- JetBrains Mono
- chmod
- sgw
- codepoint
- Executor
- 파스칼 표기법
- 한글깨짐
- 확인창
- JAVA8
- JUnit
- gradle
- ThreadPool
- Jenkins
- 카멜 표기법
- JPA
- jdk13
- junit5
- jdk12
- aspectj
- Visual Studio 2022
- java11
- thread priority
- Redis
- java
- Thread
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |