중첩 클래스
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를 쓰는것입니다. 속해져 있는 클래스 이름을 다시 부르는거,, 라구요
아하!
스택에 있는것은 인스턴스화 된 변수입니다. 인스턴스는? 저번에 내가 적어놨으니까 그것을 봐라
스택, 힙
'응용 프로그래밍 및 화면 구현' 카테고리의 다른 글
람다 표현식 Rambda (0) | 2022.05.23 |
---|---|
인터페이스 Interface /어나니머스 이너클래스 (0) | 2022.05.20 |
스프링부트 초기 설정 (0) | 2022.05.13 |
마이바티스 연결시키기 (0) | 2022.04.27 |
컬렉션 리스트- Map / Hash Table / Properties (0) | 2022.04.27 |