옝옹
냠
옝옹
전체 방문자
오늘
어제
  • 분류 전체보기 (84)
    • [LG유플러스]유레카 SW (5)
    • React (20)
    • JS (17)
    • TypeScript (5)
    • CSS & HTML (1)
    • 알고리즘 (11)
    • JAVA (20)
    • GIT (1)
    • 자격증 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ==
  • 코드스플리팅
  • toFixed
  • useRef
  • sort() 메서드
  • Node.js
  • join() 메서드
  • join()
  • break문
  • template literal
  • 템플릿리터럴
  • useMemo
  • While문
  • 화살표함수
  • 변수선언
  • 혼자 공부하는 자바
  • indexOf()
  • 접근제한자
  • 함수선언
  • switch문
  • 혼자공부하는자바
  • continue문
  • 자바스크립트
  • js
  • map
  • TypeScript
  • 자바
  • java.lang패키지
  • 자바스트립트
  • 타입변환
  • JavaScript
  • 노마드코더
  • 인스턴스멤버
  • map() 함수
  • useEffect
  • reduce
  • useCallback
  • do-while문
  • java.util패키지
  • 정적멤버
  • 기본api클래스
  • 백준
  • java
  • fillter
  • reverse() 메서드
  • 리액트를다루는기술
  • 리액트
  • 타입스크립트
  • match()
  • useState

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
옝옹

냠

익명 객체
JAVA

익명 객체

2022. 11. 15. 16:03

익명 객체

이름이 없는 객체

<익명 객체를 만들기 위한 조건>

- 어떤 클래스를 상속하거나 인터페이스를 구현해야한다.

  • 익명 객체를 생성할 때에는 클래스 이름이 없음
  • 부모 클래스 변수는 이름이 없는 자식 객체를 참조
  • 인터페이스 변수는 이름이 없는 구현 객체를 참조

익명 자식 객체 생성

  • 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우 사용

익명 자식 객체 생성 방법

  • ‘부모클래스(매개값, ...){… }' : 부모클래스를상속해서 중괄호{} 와같이 자식 클래스를 선언하라 
    • new 연산자 : 선언된 자식 클래스를 객체로 생성
    • ‘부모클래스(매개값, ...)' : 부모 생성자를 호출하는 코드, 매개값은 부모 생성자의 매개 변수에 맞게 입력하면 된다.
    • 중괄호 {} 내부 : 필드와 메소드를 선언하거나 부모 클래스의 메소드를 재정의하는 내용 작성
  • 익명 자식 객체에 새롭게 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근 불가능
    • 익명 자식 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용할 수 있기 때문

필드를 선언할 때 초기값으로 익명 자식 객체를 생성해서 대입하는 예
메소드 내에서 로컬 변수를 선언할 때 초기값으로 익명 자식 객체를 생성해서 대입하는 예
메소드의 매개 변수가 부모 타입일 경우 메소드를 호출하는 코드에서 익명 자식 객체를 생성해서 매개값으로 대입하는 예
메소드의 매개 변수가 부모 타입일 경우 메소드를 호출하는 코드에서 익명 자식 객체를 생성 해서 매개값으로 대입하는 예

익명 구현 객체 생성

  • 구현 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우 사용

익명 구현 객체 생성 방법

  • 인터페이스() { ... } : 인터페이스를 구현해서 중괄호 {}와 같이 클래스를 선언하라는 뜻
    • new 연산자 : 선언된 구현 클래스를 객체로 생성
    • 중괄호 {} : 인터페이스에 선언된 모든 추상 메소드의 실체 메소드를 작성(재정의)

필드를 선언할 때 초기값으로 익명 구현 객체를 생성해서 대입하는 예
메소드 내에서 로컬 변수를 선언할 때 초기값으로 익명 구현 객체를 생성해서 대입하는 예
메소드의 매개변수가 인터페이스 타입일 경우 메소드를 호출하는 코드에서 익명 구현 객체를 생성해 매개값으로 대입하는 예

익명 객체의 로컬 변수 사용

  • 매개 변수나 로컬 변수는 메소드 실행이 끝나면 스택 메모리에서 사라지기 때문에 익명 객체에서 지속적으로 사용할 수 없음

          ↓  이 문제를 해결하기 위해 ↓

  • 컴파일 시 익명 객체에서 사용하는 매개 변수나 로컬 변수의 값을 익명 객체 내부에 복사해두고 사용한다.
  • 매개변수나 로컬 변수가 수정되어 값이 변경되면 익명 객체에 복사해 둔 값과 달라지므로 매개 변수나 로컬 변수를 final 로 선언해야 함.

[확인 문제]

package yeong.verify.exam01;
public class Anonymous {
	Worker field = new Worker() {
	@Override
    public void start() {
	    System.out.println("디자인을 합니다.");
    }
};

void method1() {
    Worker localVar = new Worker() {
        ©Override
        public void start() {
        	System.out.println("개발을 합니다.");
        }
    };
	localVar.start();
}

void method2(Worker worker) { 
    worker.start();
    }
}
package yeong.verify.exam01;
public class AnonymousExample {
    public static void main(String[] args) { 
    Anonymous anony = new Anonymous();
    //익명 객체 필드 사용
    anony.field.start();
    //익명 객체 로컬변수 사용
    anony.methodl();
    //익명 객체 매개값 사용
    anony.method2(
        new Worker() {
        @Override
        public void start() {
        	System.out.println("테스트를 합니다.");	
		}
   		} 
	);
	
    }
}

package yeong.verify.exam02;

public class Anonymous {
    Vehicle field = new Vehicle() {
        @Override
        public void run() {
            System.out.println('자전거가 달립니다.');
        }
    };
    
    void method1() {
    Vehicle localVar = new Vehicle() { 
        @Override 
        public void run() {
            System. out. println("승용차가 달립니다."); 
        }
    };
    localVar.run();
    }
    
    void method2(Vehicle v) { 
    	v.run();
    }
}
package yeong.verify.exam02;

public class AnonymousExample {
    public static void main(String[] args) { 
    Anonymous anony = new Anonymous();
    //익명 객체 필드 사용
    anony.field.run();
    //익명 객체 로컬변수 사용
    anony.method1();
    //익명 객체 매개값 사용
    anony.method2(
        new VehicleO {
            @Override
            public void run() {
            System.out.println("트럭이 달립니다.");
            }
        }
    );
    
    }
}

package yeong.verify.exam03;

public class CheckBoxExample {
    public static void main(String[] args) {
    	CheckBox checkBox = new CheckBox();
    	checkBox.setOnSelectListener(new CheckBox.OnSelectListener() { 
    		@Override
            public void onSelect() {
            	System.out.println("배경을 변경합니다.");
            }
    	});
    checkBox.select();
    }
}
저작자표시 비영리 변경금지 (새창열림)

'JAVA' 카테고리의 다른 글

java.util 패키지  (0) 2022.11.30
java.lang 패키지  (3) 2022.11.30
중첩 클래스와 중첩 인터페이스  (1) 2022.11.15
타입 변환과 다형성  (0) 2022.11.09
인터페이스  (1) 2022.11.09
    'JAVA' 카테고리의 다른 글
    • java.util 패키지
    • java.lang 패키지
    • 중첩 클래스와 중첩 인터페이스
    • 타입 변환과 다형성
    옝옹
    옝옹

    티스토리툴바