본문 바로가기
Hello World/JAVA

JAVA - 중첩 선언과 익명 객체 NestedClass/ InnerClass / Anonymous [개발스터디 기몬]

by 기몬 2023. 4. 14.
728x90
반응형

중첩 선언과 익명 객체 
: 중첩 클래스 - 인스턴스 클래스 - 정적 멤버 클래스 - 로컬 클래스 
- 바깥 멤버 접근 - 중첩 인터페이스 - 익명객체. => 람다식.

중첩 클래스 
- 클래스 내부에 선언한 클래스. 클래스의 멤버를 쉽게 사용할 수 있고 
외부에는 중첩 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있음
- 멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스 
- 로컬 킅래스 : 메소드 내부에서 선언 되는 중첩 클래스 

인스턴스 멤버 클래스 객체 생성 조건  A 객체를 생성해야만  B 객체를 생성할 수 있음 
class A {
class B {
정적 멤버 클래스 객체 생성 보건 A 객체를 하지 않아도  B 객체를 생성할 수 있음 
class A {
  static class B {

인스턴스 멤버 클래스 
- A 클래스의 멤버로 선언된 B 클래스 
[public] class A {
    [public : private] class B { // 인스턴스 멤버 클래스 
    }
}

 

package com.example;
/*
 * 클래스 - 필드 / 로컬 
 * 인스턴스 멤버 클래스 / 정적 멤버 클래스 
 */
public class NestedClassExample {
	int outNum;
	static int outNum2;
	
	
	
	// 인스턴스 클래스
	class A {
		int num;
		static int num2;
		
		static {
			
		}
		
		void xxx() {
			outNum = 10;
			outNum2 = 20;
		}
		
		static void yyy() {
			
		}
	}
	
	
	static void outerMethod() {	// 정적 메소드 
//		outNum = 10;	// (X) static 에서 인스턴스 필드 접근이 불가. 
		
		outNum2 = 10;
	}
	
	
	// 정적 클래스 
	static class B {	// 정적 메소드와 같은 특성을 가지고 있다. 
		int num;
		static int num2;
		
		static {
			
		}
		
		void xxx() {
//			outNum = 10;	 // (X) outer의 요소가 static 이 아니기 때문에 접근 불가 . 
			outNum2 = 20;		// outer static 접근 가능. 
		}
		
		static void yyy() {
			
		}
		
	}
	public static void main(String[] args) {
		// 로컬 클래스
		class C {
			int num; 
			static int num2;
			
			static {
				
			}
			void xxx() {
//				outNum = 10; // (X)인스턴스는 new 생성으로 정의를 따로 해주어야 접근이 가능. 
				
				outNum2 = 20;
			}
			
			static void yyy() {
				
			}
			
		}
		
	}

}


구분  접근범위
public class B {}  다른 패키지에서 B 클래스를 사용할 수 있다. 
class B {}  같은 패키지에서만 B 클래스를 사용할 수 있다.
private class B {}  A 클래스 내부에서만  B 클래스를 사용할 수 있다. 
- 인스턴스 멤버 클래스 B는 주로  A클래스 내부에서 사용되므로 
private 접근 제한을 갖는 것이 일반적

정적 멤버 클래스 
- static 키워드와 함께 A 클래스의 멤버로 선언된 B 클래스 
[public] class A {
    [public : private] static class B { // 정적 멤버 클래스 
    }
}

구분  접근범위
public static class B {}  다른 패키지에서 B 클래스를 사용할 수 있다. 
static class B {}  같은 패키지에서만 B 클래스를 사용할 수 있다.
private static class B {}  A 클래스 내부에서만  B 클래스를 사용할 수 있다. 
- 정적 멤버 클래스는 주로 default 또는 public 접근 제한을 가짐. 

로컬 클래스 
- 생성자와 메소드가 실행될 동안에만 객체를 생성할 수 있음

바깥 멤버 접근
바깥 클래스의 멤버 접근 제한
- 정적 멤버 클래스 내부에서는 바깥 클래스의 필드와 메소드를 사용할 때 제한이 따름
구분  바깥클래스의 사용 가능한 멤버
인스턴스 멤버 클래스  바깥 클래스의 모든 필드와 메소드
정적 멤버 클래스  바깥 클래스의 정적 필드와 정적 메소드 
 
- 정적 멤버 클래스는 바깥 객체가 없어도 사용 가능해야 하므로 
바깥 클래스의 인스턴스 필드와 인스턴스 메소드는 사용하지 못함.


바깥 클래스의 객체 접근
- 중첩 클래스 내부에서 바깥 클래스의 객체를 얻으려면 바깥 클래스 이름에 this를 붙임
바깥클래스이름.this => 바깥객체

 

public class InnerClassExample {
	
	int num;
	
	class A {
		int num;
		void xxx(int num) {
			num = 10;
			this.num = 20;	
			InnerClassExample.this.num = 30;
			
		}
	}
	
	public static void main(String[] args) {
		

	}

}


중첩 인터페이스 
- 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위해 클래스의 멤버로 선언된 인터페이스 
- 안드로이드와 같은 UI 프로그램에서 이벤트를 처리할 목적으로 많이 활용


익명 객체 
- 이름이 없는 객체. 명시적으로 클래스를 선언하지 않기 때문에 쉽게 객체를 생성할 수 있음
- 필드값, 로컬 변수값, 매개변수값으로 주로 사용 

 

package com.example;

public class AnonymousExample {
	int num;
	static class A {
		
		void show() {
			System.out.println("A...");
		}
	}
	
	static class B extends A {
		
	}
	
	public static void main(String[] args) {
//		num = 100;	// (X) 접근불가 
		A a = new A();	// static class에서 new 생성, 접근 가능.
		B b = new B();
		
		// 익명 객체 
		A a1 = new A() {
			
			@Override
			void show() {
				System.out.println("Anonymous....");
			}
		};
		
		a1.show();
		
	}

}


익명 자식 객체
- 부모 클래스를 상송받아 생성되는 객체
- 부모 타입의 필드, 로컬 변수 , 매개변수의 값으로 대입할 수있음 

익명 구현 객체 
- 인터페이스를 구현해서 생성되는 객체
- 인터페이스 타입의 필드, 로컬변수, 매개변수의 값으로 대입할 수 있음 
- 안드로이드와 같은 UI 프로그램에서 이벤트를 처리하는 객체로 많이 사용

 

package com.example;

public class AnonymousExample3 {
// 익명 자식객체 
	static class A implements Runnable {

		@Override
		public void run() {
			for (int i=0; i<100; i++) {
				System.out.print("A");
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	public static void main(String[] args) {
		A a = new A();
		Thread t1 = new Thread(a);
		t1.start();
		
		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i=0; i<100; i++) {
					System.out.print("1");
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});	// 매개변수 안에 클래스 선언문이 들어감. 
		
		t2.start();
	}

}


클래스 class에 올 수 있는 요소-
1. 필드 field : (1) instance field  (2) static field 
2. 생성자 construactor - instance only // ( static block ) 
3. 메소드 method : (1) instance method (2) static method

4. 클래스 class :
/ interface member class 
/ static member class 
/ enum 


인스턴스 클래스는  new 생성으로 정의를 해주어야 
접근이 가능하다. 
static 정적 클래스는 new 생성없이 static에서는 정의가 
자동으로 이루어지기 때문에 접근이 가능함. 
instance / static (전역변수 - 접근가능)

인스턴스 클래스는 메모리 공간에 저장을 따로 해주어야 
다른 클래스에서도 접근이 가능하다.

익명객체 - 이름이 없는 객체 
단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만 
생성할 수 있다. 익명 객체는 필드의 초기값이나 로컬 변수의 초기값, 
매개 변수의 매개값으로 주로 대입됨

728x90
반응형

댓글