본문 바로가기
  • 마침표 보다 쉼표를 나타내자
프로그래밍/JAVA

중첩 클래스 그리고 중첩 인터페이스

by Y코더 2023. 1. 8.
728x90

멤버클래스도 2가지 종류가 있다.

인스턴스 멤버 클래스와 정적 멤버 클래스 이다.

눈에 띄는 차이는 static이고 사용의 차이는 바깥에 있는 객체가 있어야하는가? 에 달려있다.

 

로컬 클래스는 무엇이냐?

메서드 안에 선언된 클래스를 뜻한다. ( 메서드 안이기 때문에 static 자체가 불가능 )

생성자 또는 메서드가 실행 될때만 사용된다.

 

종류를 알아 보았으니 사용 방법에 대해 알아보자

 

 

우선 인스턴스 멤버 클래스 이다.

왜 인스턴스 멤버 클래스는 필드와 메서드만 선언이 가능한지 아는가?

정적 필드와 메서드를 선언 할수 없는 이유는

 

바깥객체가 항상 있어야 한다는 조건이 있으므로 안의 객체는 혼자 있을수가 없다.

그러니 static 을 사용할수 없다는 것이다.

 

예제로 알아보자.

 

클래스 내부에 있을때는 원래 사용하듯이 객체를 불러와서 사용하면 된다.

package q3;

class A {
	A() {}
	class B{
		B() {}
		int f;
		void mm1() {}
	}
	
	void m1() {
		B b = new B();
		b.f = 3;
		b.mm1();
	}
}

 

하지만 문제는 A클래스 밖이다.

package q3;

import q3.A.B;

public class P {
	public static void main(String[] args) {
		A a = new A();
		A.B b = a.new B();
		b.f = 3;
		b.mm1();
	}
}

앞서 말했듯이 B라는 객체를 사용하기 위해서는 A객체가 먼저 있어야한다. ( 혼자 사용이 불가능 하므로 )

그래서 A 객체를 불러와서 B 를 불러 올수 있게 되는 것이다.

그리고 불러온 변수를 활용하여 사용 하면 된다.

 

 

 

 

그러면 정적 멤버 클래스는 어떻게 접근 하여 사용이 가능할까?

밑에다가 C클래스를 추가한다

package q3;

class A {
	A() {}
	class B{
		B() {}
		int f;
		void mm1() {}
	}
	
	void m1() {
		B b = new B();
		b.f = 3;
		b.mm1();
	}
	
	static class C {
		C () {}
		int f1;
		static int f2;
		void mm1() {}
		static void mm2() {}
	}
}

인스턴스 변수와 스태틱 변수를 비교하기 위해 입력 하였다.

 

 

가장 큰차이는 B 객체를 사용하기 위해서 A객체 가 필요 없다는 것이다.

A.C 로 바로 접근하여 변수를 선언하고 사용 하면 된다.

package q3;

import q3.A.B;

public class P {
	public static void main(String[] args) {
		A a = new A();
		A.B b = a.new B();
		b.f = 3;
		b.mm1();
		
		A.C c = new A.C();
		c.f1 = 3;
		c.mm1();
		A.C.f2 = 3;
		A.C.mm2();
	}
}

여기서 static 을 사용한 차이는 아까 객체를 불러오듯 A.C.불러올것 으로 하면 된다.

말그대로 경로가 되버린다! 아주 간편하게 사용할 수 있다.

 

 

 

 

그러면 로컬 멤버 클래스는 어떻게 접근 하여 사용이 가능할까?

 

아까 사용했는 코드에서 메서드를 선언하고 거기에 D 클래스를 선언하여 확인 해보자.

package q3;

class A {
	A() {}
	class B{
		B() {}
		int f;
		void mm1() {}
	}
	
	void m1() {
		B b = new B();
		b.f = 3;
		b.mm1();
	}
	
	static class C {
		C () {}
		int f1;
		static int f2;
		void mm1() {}
		static void mm2() {}
	}
	
	void method() {
		class D {
			D() {}
			int f1;
			void mm1() {}
 		}
		D d = new D();
		d.f1 = 3;
		d.mm1();
	}
}

메서드 내부에서는 원래 사용하듯이 객체를 불러와서 사용하면 된다.

 

package q3;

import q3.A.B;

public class P {
	public static void main(String[] args) {
		A a = new A();
		A.B b = a.new B();
		b.f = 3;
		b.mm1();
		
		A.C c = new A.C();
		c.f1 = 3;
		c.mm1();
		A.C.f2 = 3;
		A.C.mm2();
		
		a.method();
	}
}

a.method(); 를 실행이 되면 클래스가 생성이 되고 값이 실행이 된다.

728x90

'프로그래밍 > JAVA' 카테고리의 다른 글

오버 라이딩 그리고 오버로딩  (0) 2023.01.08
게터와 세터  (0) 2023.01.08
클래스 public 차이  (0) 2023.01.08
업캐스팅 그리고 메소드 오버라이딩  (0) 2023.01.08
개념 확실히 잡기  (0) 2023.01.08