[TIL] 중첩 클래스
static 중첩 클래스란?
클래스 안에 클래스 멤버로 선언된 static클래스
특징
- 외부 클래스의 클래스 변수(static 변수)와 클래스 메소드(static 메소드)는 바로 접근하여 사용 가능하다.
- 외부 클래스의 인스턴스 변수와 인스턴스 메소드는 static 중첩 클래스 안에서 바로 접근이 불가능하며 외부클래스의 객체를 생성해서 접근한다.
- 외부 클래스 객체 생성 없이 static 중첩 클래스는 다른 클래스에서 바로 객체를 생성하여 접근할 수 있다.
- 컴파일 후 생성되는 외부 클래스와 중첩 클래스
- 외부클래스명.class
- 외부클래스명$중첩클래스명.class
- 다른 클래스에서 static 중첩 클래스 객체 생성
- 외부클래스명.중첩클래스명 객체 = new 외부클래스명.중첩클래스명();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package ex0811;
public class NestedClass_Ex1 {
public static void main(String[] args) {
// Test5 obj = new Test5(); // 컴오류// 단독 클래스가 아니기 때문에 직접 접근 부락
User5.Test5 obj = new User5.Test5();
obj.write();
}
}
class User5 {
static int a = 10;
int b = 20;
// static 중첩 클래스. 중첩 클래스에서만 static class가 가능
// 외부 클래스의 객체 생성과 상관없이 외부에서 객체를 생성할 수 있음.
// 컴파일하면 User5$Test5. class로 컴파일됨 해당 파일도 배포시 배포해야함
public static class Test5 {
int c = 30;
public void write() {
System.out.println(a + ":" + c);
// System.out.println(b);// 컴파일 오류
}
}
public void print() {
Test5 obj = new Test5();
obj.write();
}
}
|
cs |
내부 클래스 - 멤버 클래스
클래스안에 클래스의 멤버로 선언된 내부 멤버 클래스(인스턴스 클래스)
특징
- 멤버 클래스는 외부 클래스의 클래스 변수와 클래스 메소드는 바로 접근하여 사용 가능하다.
- 멤버 클래스는 외부 클래스의 인스턴스 변수와 인스턴스 메소는 바로 접근 사용 가능하다.
- 멤버 클래스는 클래스 변수와 클래스 메소드를 가질 수 없다.
- 외부 클래스의 메소드에서 멤버 클래스에 접근하기 위해서는 멤버 클래스의 객체를 생성해서 접근해야한다.
- 외부 클래스 객체 생성 없이 멤버 클래스는 다른 클래스에서 객체를 생성할 수 없다.
- 컴파일 후 생성되는 외부 클래스와 중첩 클래스
- 외부클래스명.class
- 외부클래스명$멤버클래스명.class
1234567891011121314151617181920212223242526272829303132333435package ex0811;public class InnerClass_MemberClass_Ex1 {public static void main(String[] args) {// User6.Test6 obj = new User6.Test6(); 컴파일 오류 발생// 외부 객체를 먼저 생성해야한다.User6 uu = new User6();User6.Test6 obj = uu.new Test6();obj.write();//하지만 해당 내부 클래스의 생성 목적은 주로// 클래스 내부의 작업에 필요성에 생성된다. 외부에서는 호출 잘 안함}}class User6 {static int a = 10;int b = 20;// 내부클래스// 다른 클래스에서 객체를 생성할 때 외부 클래스의 객체를// 생성하지 않고는 객체 생성이 불가능한 클래스public class Test6 {int c = 30;public void write() {System.out.println(a + ":" + b + ":" + c);}}public void sub() {Test6 obj = new Test6();obj.write();}}cs
로컬 클래스
- 로컬 클래스는 초기화 블록이나 클래스의 메소드 안에서 클래스를 정의하는 것
- 선언된 영역 내에서만 사용
- 내부 멤버 클래스와 유사한 성격을 가지고 있지만 접근 제어자는 붙일 수 없다.
- 메소드 안에서 정의된 로컬 클래스는 메소드의 지역변수 중 final 변수만 접근 가능하다.
- 메소드 안에서 정의된 로컬 클래스에서 메소드의 final이 붙지 않는 지역변수를 접근할 경우 에러가 발생하지만 자바8부터는 접근 가능하며 로컬 클래스에서 final이 없는 로컬 변수를 접근한 경우 final 속성을 갖는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package ex0811;
public class LocalClass_Ex1 {
}
class User7{
int a =10;
// 메소드 내에도 클래스 생성이 가능하다.
// 로컬 클래스라고도 한다.
public void write() {
int b =20;
final int c=30;
class Test7{
void print() {
System.out.println(a+":"+c);
System.out.println(b); // 자바 8.0 가능
}
}
// b=200; // 내부클래스에서 error
// 내부 클래스에서 사용하면 final 성질을 가짐
Test7 obj = new Test7();
obj.print();
}
}
|
cs |
'Language > JAVA' 카테고리의 다른 글
[TIL] 제네릭 (2) | 2020.08.12 |
---|---|
[TIL] 예외처리 (3) | 2020.08.12 |
[TIL] 인터페이스 (0) | 2020.08.11 |
[TIL] 추상 클래스 (0) | 2020.08.10 |
[TIL] 상속 (0) | 2020.08.10 |
댓글