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 |