본문 바로가기

Java/본격 Java 클래스

[Java] Nested 클래스

nested

(수학)
집합 또는 구간의 순서를 지닌 계열(系列)에서, 각기 그 앞의 것에 포함되고, 또한 집합의 직경이나 구간의 길이가 0으로 수속(收束)하는 것.

 

말이 어렵지만 다중으로 for문을 사용하거나 if문을 사용하는 것이랑 비슷하다고 생각하면 될거같다.

nested 클래스는 클래스 안에 새로운 클래스를 작성하는 것을 의미한다.

.

.

여기서 static의 관계를 이해해야하는데

static은 어디서든 접근가능하다고 보면된다.

.

.

package member_Class;

// 외부 클래스
public class A {
	int a; // 인스턴스 멤버
	static int b; // static(클래스) 멤버
	public A() {
		System.out.println("A 객체가 생성됨.");
	}
	
	// 인스턴스 멤버 클래스 -> 외부클래스 A가 객체화가 되어 있어야 사용 가능
	public class B{
		public B() {
			System.out.println("B 객체가 생성됨.");
		}
		int field1; // 인스턴스 멤버
		// static int field2; // 인스턴스 멤버 클래스에서 사용 불가능
		void method1() {} // 인스턴스 메소드
		// static void moethod2() {} // 인스턴스 멤버 클래스에서 사용 불가능
		
	}
	
	// static 멤버 클래스 -> 외부클래스 A가 객체화 하지않고 사용 가능
	static class C{
		public C() {
			System.out.println("C 객체가 생성됨.");
		}
		int field1; // 인스턴스 멤버
		static int field2; // static 멤버 사용 가능
		void method1() {} // 인스턴스 메소드
		static void method2() {} // static 메소드 사용 가능
		
	}
	
	// 로컬 클래스
	void methodA() {
		// 로컬 클래스
		class D{
			public D() {
				System.out.println("D 객체가 생성됨.");
			}
			int field1; // 인스턴스 멤버
			// static int field2; // 로컬 클래스에서 사용 불가능
			void method1() {} // 인스턴스 메소드
			// static void moethod2() {} // 로컬 클래스에서 사용 불가능
		}
		
		// 클래스 바깥에서 객체 생성 후 사용 가능
		D d = new D();
		d.field1 = 10;
		d.method1();
	}

}

.

.

주석으로 설명을 달아놨지만

static으로 선언된 인스턴스나 클래스는 static안에서만 사용가능하다

static으로 선언되지 않은 클래스 안에서 static으로 선언된 인스턴스나 메소드를 사용하려고하면 오류가 생긴다.

.

.

package member_Class;

public class Main {

	public static void main(String[] args) {
		// 외부 클래스 객체 생성
		A a = new A();
		
		// 인스턴스 멤버 클래스의 객체 생성
		A.B b = a.new B();
		b.field1 = 5;
		b.method1();
		
		// static 멤버 클래스 객체 생성
		A.C c = new A.C();
		c.field1 = 5;
		c.method1();
		A.C.field2 = 3; // 내부 클래스 C의 객체 생성없이 static 필드 사용
		A.C.method2(); // 내부 클래스 C의 객체 생성없이 static 메소드 사용
		
		// 로컬 클래스 객체 생성을 위해서 메소드 호출
		a.methodA();
	}

}

.

.

선언법도 특이하다

A 클래스 안에 B 클래스가 있다고하자. B 클래스의 객체를 생성하려면 A.B 이런식으로 선언을 해야한다.

new를 선언할 때도 A 클래스에서 생성한 객체를 이용해서 해야한다.

.

.

.

.

덧붙여서 접근정도를 살펴보는 클래스도 눈여겨보자

.

.

package filed_Member_access;

public class FieldAccess {
	int field1;
	void method1() {}
	
	static int field2;
	static void method2() {}
	
	// 인스턴스 내부 클래스에서 외부클래스 멈베의 사용
	class B{
		void method() {
			field1 = 10; // 외부클래스의 인스턴스 변수 사용 가능
			method1(); // 외부클래스의 인스턴스 메소드 사용 가능
			
			field2 = 10; // 외부클래스의 static 변수 사용 가능
			method2(); // 외부클래스의 static 메소드 사용 가능
		}
	}
	
	static class C{
		void method() {
			// field1 = 10; // 인스턴스화가 되어있어야 사용가능한 변수이므로 static 내부클래스에서 사용 불가능
			// method1(); // 인스턴스화가 되어있어야 사용가능한 메소드이므로 static 내부클래스에서 사용 불가능
			
			field2 = 10; // static 멤버이므로 static 내부클래스에서 사용 가능
			method2();
			
		}
	}

}
728x90
반응형

'Java > 본격 Java 클래스' 카테고리의 다른 글

[Java] Nested 클래스 활용  (0) 2020.07.15
[Java] 클래스 메소드  (0) 2020.06.25
[Java] 클래스 변수  (0) 2020.06.25
[Java] 정보 은닉(private)  (0) 2020.06.25
[Java] 실습 - 삼각형 넓이 구하기  (0) 2020.06.25