멤버클래스도 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(); 를 실행이 되면 클래스가 생성이 되고 값이 실행이 된다.
'프로그래밍 > JAVA' 카테고리의 다른 글
오버 라이딩 그리고 오버로딩 (0) | 2023.01.08 |
---|---|
게터와 세터 (0) | 2023.01.08 |
클래스 public 차이 (0) | 2023.01.08 |
업캐스팅 그리고 메소드 오버라이딩 (0) | 2023.01.08 |
개념 확실히 잡기 (0) | 2023.01.08 |