@Eeap
velog
@Eeap
전체 방문자
오늘
어제
  • 전체 (168)
    • osam (1)
    • Cloud (21)
      • Docker (2)
      • AWS (13)
    • AI & Data (7)
    • Algorithm (76)
      • Baekjoon (75)
      • Codeforces (1)
    • Language (18)
      • Java (18)
    • Back-end (17)
      • Spring (3)
      • JSP & Servlet (12)
      • Go (2)
    • 일상 (4)
    • 기타 (8)
    • git (1)
    • Infra (9)
      • Apache Kafka (5)
      • Kubernetes (4)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • SageMaker
  • bedrock api
  • flink
  • bedrock agent
  • converse api
  • sagemaker unified studio
  • 심폴릭링크
  • CLASS
  • AWS CodeStar
  • Agent
  • Python
  • AWS CodeArtifact
  • bedrock
  • invokemodel api
  • java
  • 오블완
  • 티스토리챌린지
  • knowledge bases
  • AWS CodeCatalyst
  • 인터페이스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
@Eeap

velog

Language/Java

Java 익명 객체

2022. 6. 12. 16:10
반응형
익명 객체

클래스 이름이 없는 객체를 익명 객체라고 부르고 어떤 클래스를 상속하거나 인터페이스를 구현해야한다.

//이름이 있는 객체의 상속
public class Class_Name extends Main_C {}
Main_C var = new Class_Name();
//익명 객체의 상속
Main_C var = new Main_C() {}; //괄호 안에는 익명 객체의 내용이 들어감
//이름이 있는 객체의 구현
public class Class_N implements I {}
I var = new Class_N();

//익명 객체의 구현
I var = new I() {};

 

익명 자식 객체의 사용

 - 필드 선언할 때  초기값으로 익명 자식 객체를 생성하여 대입!

public class Main {
 Parent field = new Parent(){
  int childField;
  void childMethd(){}
  //부모 객체의 메소드 재정의
  @Override
  void parentMethd(){}
 };
}

- 메소드 내에서 로컬 변수 선언 시 초기값으로 대입!

public class Main {
 void methd(){
  Parent local = new Parent(){
  int childField;
  void childMethd(){}
  //부모 객체의 메소드 재정의
  @Override
  void parentMethd(){}
  };
 }
}

 - 매개 변수의 매개값으로 익명 자식 객체를 생성하여 대입!

public class Main {
 void methd1(Parent parent){}
 void methd2(){
  methd1(
  new Parent(){
   int childField;
   void childMethd(){}
   //부모 객체의 메소드 재정의
   @Override
   void parentMethd(){}
   }
  );
 }
}

 

추가로 익명 자식 객체의 경우에 내부에서 선언한 필드나 메소드는 외부에서 사용할 수 없고 오직 부모 객체가 갖고 있는 필드와 메소드만 외부에서 사용이 가능!

public class Main {
 Parent field = new Parent(){
  int childField;
  void childMethd(){}
  //부모 객체의 메소드 재정의
  @Override
  void parentMethd(){}
 };
 void method(){
  field.childField=1; //접근 불가능
  field.childMethd(); //접근 불가능
  fieled.parentMethd(); //익명 객체에서 재정의한 내용이 불러와짐
 }

}

 

익명 구현 객체 사용

- 필드 선언 시 초기값으로 익명 구현 객체를 생성하여 대입하는 경우

public class Main {
 //Interface라는 이름을 가진 인터페이스의 익명 구현 객체
 Interface field = new Interface(){
  //인터페이스 내에 있는 메소드 재정의
  @Override
  void test(){}
 };
}

- 메소드 내에서 로컬 변수 선언시 초기값으로 익명 구현 객체 생성하여 대입

public class Main {
 void method(){
  //Interface라는 이름을 가진 인터페이스의 익명 구현 객체
  Interface local = new Interface(){
  //인터페이스 내에 있는 메소드 재정의
  @Override
  void test(){}
  };
 }
}

- 매개 변수의 매개값으로 대입하는 경우

public class Main {
 void method1(Interface interface){}
 void method2(){
  method1(
  //Interface라는 이름을 가진 인터페이스의 익명 구현 객체
   new Interface(){
   //인터페이스 내에 있는 메소드 재정의
   @Override
   void test(){}
   }
  );
 }
}

 

추가로 메소드의 매개변수나 로컬 변수를 익명 객체 내부에서 사용할 때 이 변수들은 final 특성을 갖게 된다.

그 이유는 메소드가 종료되어도 익명 객체는 계속 실행 상태로 존재할 수 있기 때문에 그 값들이 변경되면 안됨!

public class Main {
 public void method(final int arg1, int arg2){
  final int var1=0;
  int var2=1;
  Parent sum = new Parent(){
  //부모 객체의 메소드 재정의
   @Override
   void parentMethd(){int res = arg1+arg2+var1+var2;}
  };
  // 아래처럼 변수의 값을 바꾸는것이 안됨!
  arg1=1;
  arg2=2;
  var1=1;
  var2=2;
  }
 }

 

 

# 참고로 익명 자식 객체나 익명 구현 객체의 경우 특정 위치에서 사용될 때 주로 사용된다!

반응형
저작자표시

'Language > Java' 카테고리의 다른 글

Java 예외 처리  (0) 2022.06.12
Java 예외 클래스  (0) 2022.06.12
Java 중첩 클래스와 중첩 인터페이스  (0) 2022.06.11
Java 타입 변환과 다형성  (0) 2022.06.06
Java 인터페이스  (0) 2022.05.30
    'Language/Java' 카테고리의 다른 글
    • Java 예외 처리
    • Java 예외 클래스
    • Java 중첩 클래스와 중첩 인터페이스
    • Java 타입 변환과 다형성
    @Eeap
    @Eeap

    티스토리툴바