응용 프로그래밍 및 화면 구현

InnerClass

황샐리 2022. 5. 20. 11:56

중첩 클래스

Java에서 메소드와 마찬가지로 클래스의 변수도 다른 클래스를 멤버로 가질 수 있습니다. Java에서는 다른 클래스 내에 클래스를 작성하는 것이 허용됩니다. 내부에 작성된 클래스를 중첩 클래스 라고 하고 내부 클래스를 보유하는 클래스를 외부 클래스 라고 합니다 .

출처 : https://www.tutorialspoint.com/java/java_innerclasses.htm

 

 

오늘은 이너클래스에 대해서 한 번 살펴보도록 하겠습니다.

 

다짜고짜 실습부터 해버리기~!

public class Member {
	
	private String name;
	private String pass;

	//공유
	static class MemberBuilder{} //스테이틱 클래스

	static void builder(매개변수) {
		
	}
	
	
}

저기 보시면 중간에 매개변수가 있지요? 바로 매개체 같은 내용과 동일하다고 볼 수 있겠습니다.

바이러스 매개체,,,, 같은거로요.

 

자 여기서 선생님이 우리한테 커피를 사주신다고 생각해보도록 하겠습니다.

그런데 여기서 한 학생에게 커피를 사오라고 시켰다 생각할게요. 카드라는 물질을 가게에 전달해주는 그 학생이 매개체라고 볼 수 있겠습니다.

static inner class 접근방법

public class Test01 {
	
	public static void main(String[] args) {
		
		//객체 만들지 말고 클래스이름.멤버
		Member.builder2();
		Member.MemberBuilder mm = new Member.MemberBuilder;
	}
}

 

위에서 src에서는 클래스가 2개만 보이는데 이는 이너클래스가 안보이기 때문!

bin 폴더에서는 3개로 잘 보인다는 것을 알 수 있습니다.

그래서 우리가 클래스 이름을 만들 때 $ << 를 사용하지 않는 것입니다!

이너클래스를 알려주니까

public class Member {
	
	private String name;
	private String pass;

	class aaa{}
	//공유
	static class MemberBuilder{} //스테이틱 클래스

	static void builder() {
	}
}

이렇게 두면요, 이너클래스 aaa가 또 생성됩니다. 볼게요.

빈 파일에서 살펴 볼 수가 있습니다.

이거를 Test01 클래스에서 매개변수로 봐볼게요!

public class Test01 {
	
	public static void main(String[] args) {
		
		//객체 만들지 말고 클래스이름.멤버
		Member.builder();
		Member.MemberBuilder mm = new Member.MemberBuilder();
		
		Member.aaa AAA=new Member.aaa();
	}
}

여기서는 안보이지만 저 member.aaa 에서 빨간 줄이 뜹니다!

 

No enclosing instance of type Member is accessible. Must qualify the allocation with an enclosing instance of type Member (e.g. x.new A() where x is an instance of Member).

...에?

 

Member 유형의 둘러싸는 인스턴스에 액세스할 수 없습니다. Member 유형의 둘러싸는 인스턴스로 할당을 한정해야 합니다(예: x.new A() 여기서 x는 Member의 인스턴스).

편-안-

 

그렇다네요!

그러면 이 난관을 어찌 해쳐나가면 될까요?

이너클래스는 아우터클래스 객체를 먼저 만들고 객체 변수로 접근해야합니다!

그래서

Member m=new Member();
Member.aaa AAA=m.new aaa();

이렇게 헤쳐나가면 되겠습니다^^

 

같은 공간안에서 있는 클래스에 접근하려면

static void builder() {
		MemberBuilder m=new Member.MemberBuilder();
	}

이렇게 앞에 클래스를 명시해도 되지만

static void builder() {
		MemberBuilder m=new MemberBuilder();
	}

이렇게 해도 됩니다!!

왜냐면요?

같은 멤버 클래스에 있는데 굳이 부를 필요는 없단거죠,,

예를 들어 내가 지금 세모 고등학교 2학년 7반에 재학중이라고 생각해보겠습니다. //젊어지고 싶은 맴을 담아,,
내 짝꿍을 부르고 싶으면 어케해요? 걍 팔을 치거나 이름을 부르겠죠

굳이굳이 세모고등학교 2학년 7반 내 옆에 있는 나의 짝꿍아 ~^^ 라고 부를 필요는 없다는 이야기입니다.

 

클래스도 마찬가지!!

 

private String name;
	private String pass;

	//공유
	static class MemberBuilder{
		private String name;
		private String pass;
		
		public void name(String name) {
			this.name=name;
			return this;
		}
		
		Member build() {
			Member member=new Member();
			return member;
		}
	}

여기에서 this. 하는것은 걍 간단하게 하기 위함입니다.

제 이름 샐리!

나는 이 블로그의 쥔장이다.

샐리는 블로그를 쓴다.

샐리는 블로그의 주인이다.

 

이렇게 여러번 쓰면? 정신나갔냐고요~~~

그래서 this를 쓰는것입니다. 속해져 있는 클래스 이름을 다시 부르는거,, 라구요

아하!

 

스택에 있는것은 인스턴스화 된 변수입니다. 인스턴스는? 저번에 내가 적어놨으니까 그것을 봐라

 

스택, 힙