Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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 31
Archives
Today
Total
관리 메뉴

오버플로

[Java] Inner Class / Nested Class / Local Class / Anonymous Inner Class 본문

Java

[Java] Inner Class / Nested Class / Local Class / Anonymous Inner Class

NACO 2021. 7. 27. 21:47

1. Inner Class

- 안쪽 클래스를 instance variable처럼 사용할 때 쓰임

- 안쪽 클래스의 접근지정자는 public으로 설정

- 안쪽 클래스는 바깥 클래스의 자원을 마음대로 사용하나,

  바깥 클래스는 안쪽 클래스의 자원을 사용하기 위해 반드시 객체화를 하여 사용

- Compile 후 byte code :  바깥클래스명.class

                                  바깥클래스명$안쪽클래스명.class

- 객체화 방법 :

  1) 바깥 클래스를 객체로 생성 : 바깥클래스명 객체명 = new 바깥클래스생성자();

  2) 안쪽 클래스를 객체로 생성 : 바깥클래스명.안쪽클래스명 객체명 = 바깥클래스의 객체명.new 안쪽클래스생성자();

 

2. Nested Class

- 안쪽 클래스를 static 변수처럼 사용할 때 쓰임

- 안쪽 클래스 / 내부 변수 / method는 static을 붙여서 만듦
   (중첩클래스의 자원은 객체화없이 바로 사용 가능하도록 static으로만 구성함)

- 안쪽 클래스에서 바깥 클래스의 instance 영역은 사용할 수 없음!

   (instance영역을 사용하고 싶으면 객체화하여 사용하는 inner class를 쓰자)

- Compile 후 byte code : inner class와 같음

- static 방식으로 사용) 클래스명.변수명, 클래스명.method명

 

3. Local Class – 지역클래스

- 클래스를 method의 지역변수처럼 사용할 때 (클래스를 method안에서 생성하고 사용할 때 씀)

- 생성된 class는 method 호출이 종료되면 메모리에서 사라짐

- 안쪽 클래스와는 다르게 method 외부에서는 지역 클래스를 절대로 사용할 수 없음

- Compile 후 byte code : 바깥클래스명.class

                                 바깥클래스명$1지역클래스명.class

                                 (여기서 1은 method명. method명은 byte code에 반영되지 않음)

- 객체화 방법 : method 안에서 Local Class를 객체화

                   : Local class명 객체명 = new Local Class 생성자()

 

4. Anonymous Inner Class

- class를 arguments(method의 입력 값, 인수)로 사용

- 참조형 데이터형이 매개변수로 된 method를 호출할 때 사용

- 별도의 클래스를 작성하지 않아도 참조형데이터형을 매개변수로 선언한 method 호출 가능

- 문법) method명 ( new 부모클래스생성자() {

                                  method Override { } ,,, 

                                   } 

                         )//method

- Compile 후 byte code : 바깥클래스명.class

                                 바깥클래스명$1.class


# 오늘의 코딩 #

Anonymous Inner Class 연습!

package test;

/**
 * 부모클래스 : 상속 및 abstract <br>
 * @author user
 */
public abstract class AbsParents {

	public AbsParents() {
		System.out.println("부모클래스 생성자");
	}// AbsParents

	/**
	 * 집에서 밥을 먹는 method - 자식에 의해 구현될 method<br>
	 */
	public abstract void eat(); 

}//class

- 간단하게 어제 사용했던 abstract method의 부모 클래스를 가져왔다. anonymous class 에서 구현될 abstract method는 집에서 밥먹기!

 

 

package test;

/**
 * Anonymous Inner Class 구현할 Class<br>
 * AbstractParents의 메소드를 자식클래스 생성 없이 바로 구현<br>
 * @author user
 */
public class UseAnonyClass {

	public void anonyTest(AbsParents ap) {
		ap.eat(); // 집에서 밥먹는 abstarct method
	}// anonyTest

	public static void main(String[] args) {

		UseAnonyClass anony = new UseAnonyClass();
        
		anony.anonyTest(new AbsParents() {
			@Override
			public void eat() {
				System.out.println("집에서 밥을 먹자");
			}
		});// method

	}// main
}// class

- 자식클래스 파일을 별도로 만들지 않고 사용하는 클래스 내에서 anonymous class 를 구현했다. 

- Use Class에서 부모 추상 클래스를 매개변수로 받고(참조형 데이터형)

  method 호출을 위해 부모인 추상 클래스의 method를 Override하였다. 

 

# 출력 결과 #

부모클래스 생성자
집에서 밥을 먹자

 

>> 부모인 추상 클래스와 method가 생성되어 잘 구현되는거 확인!

 

 

'Java' 카테고리의 다른 글

[Java] Date Class / SimpleDateFormat Class / Locale Class  (0) 2021.08.01
[Java] StringTokenizer  (0) 2021.07.30
[Java] Math Class  (0) 2021.07.29
[Java] Interface  (0) 2021.07.28
[Java] Overloading / Overriding / Annotaion / Abstract Class  (0) 2021.07.26
Comments