Recent Posts
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 |
Tags
- JanusWebRTCGateway
- 코루틴 컨텍스트
- taint
- JanusGateway
- tolerated
- 자원부족
- PytestPluginManager
- Spring Batch
- mp4fpsmod
- 개성국밥
- VARCHAR (1)
- 달인막창
- kotlin
- python
- JanusWebRTCServer
- 깡돼후
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- preemption #
- k8s #kubernetes #쿠버네티스
- terminal
- 오블완
- 겨울 부산
- pytest
- JanusWebRTC
- Value too long for column
- 코루틴 빌더
- table not found
- vfr video
- PersistenceContext
- 티스토리챌린지
Archives
너와 나의 스토리
[Java] 익명 객체(Anonymous Object) 본문
반응형
익명(Anonymous) 객체
- 익명 객체는 단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다.
- Parent라는 부모 클래스와, 이를 상속받은 Child라는 자식 클래스가 있다고 하자.
class Child extends Parent {
}
- 이를 다음과 같이 사용할 수 있다.
Parent field = new Child();
- 이때 자식 클래스가 재사용되지 않고, 오로지 초기값으로만 사용하는 경우 익명 자식 객체를 생성해서 사용하는 것이 좋은 방법이다.
- 익명 자식 객체 생성 방법:
Parent field = new Parent() {
int childField;
void childMethod() {}
@Override
void parentMethod() {
childField = 3;
childMethod();
}
}
- 즉, child같은 완전한 클래스를 생성하는 것 대신 처음 지정한 값으로만 사용할 익명 객체를 만드는 것이다.
- 외부에서는 이 익명 객체의 필드와 메서드에 접근할 수 없다.
- 위의 예제 코드의 경우, childMethod()는 해당 자식 객체 내부에서만 접근이 가능하다.
- parentMethod()는 접근 가능하고 override한 결과가 반영된다.
- Parent가 class일 수도 Interface일 수도 있다.
- 매겨변수로 부모 클래스를 받아오는 경우도 다음과 같이 사용할 수 있다.
class A {
void method1(Parent p) {}
void method2(int param){
int var2 =3;
//method1() 호출
method1(
new Parent(){
@Override
void parentMethod() {}
}
)
}
}
익명 객체의 로컬 변수 사용
- 익명 객체 내부에서는 바깥 클래스의 필드나 메서드를 제한 없이 사용할 수 있다.
- 하지만 메서드의 매개 변수(param)나 로컬 변수(var2)를 익명 객체에서 사용할 때 문제가 생길 수 있다.
- 메서드 내에서 생성된 익명 객체는 메서드 실행이 끝나도 힙 메모리에 존재해서 계속 사용할 수 있다.
- 하지만 매개 변수나 로컬 변수는 메서드 실행이 끝나면 스택 메모리에서 사라지기 때문에 익명 객체에서 사용할 수 없게 되므로 문제가 발생한다.
- 이러한 문제를 해결하기 위해서 Java 8 이후부터는, 익명 객체 내부에서 메서드 매개 변수나 로컬 변수를 사용할 경우, 자동으로 이 변수들은 final 특성을 가지게 된다.
- 중첩 클래스에서 발생한 문제 및 문제 해결법이 동일하다.
출처:
- [이것이 자바다]
반응형
'Programming Language > Java' 카테고리의 다른 글
[Java] 코드 내에서 File 실행 권한 주기 (0) | 2021.04.26 |
---|---|
[Java Exception] 예외와 예외 클래스 / 예외 처리 (0) | 2021.04.21 |
[Java] 중첩 클래스와 중첩 인터페이스 (0) | 2021.04.19 |
[Java] static vs final vs static final (0) | 2021.04.16 |
[Java] 추상 클래스 / 인터페이스 (2) | 2021.04.13 |
Comments