반응형
[광고 누르면 오늘의 행운 상승!!]
클래스 안에서 클래스를 정의하는 기법.
class Outer{
int i = 20;
class Inner{
int i = 10;
void iMethode() {
int i =1;
System.out.println("i= " +i);
System.out.println("this.i= " + this.i);
System.out.println("outer.i= " + Outer.this.i);
}
}
void oMethod() {
Inner i = new Inner();
i.iMethode();
}
}
public class OuterTest {
public static void main(String[] args) {
Outer o = new Outer();
o.oMethod();
Outer.Inner i = o.new Inner();
i.iMethode();
}
}
inner 클래스를 outer 클래스 안에서 내부적으로 사용했다.
inner클래스 안에서
- 메소드 로컬변수 i (i로 접근)
- inner클래스 인스턴스 변수 i (this.i or Inner.this.i 로 접근)
- outer 클래스 인스턴스 변수 i ( Outer.this.i 로 접근 )
로 접근할 수 있었다.
Outer.Inner i = o.new Inner();
- inner클래스를 outer 클래스 바깥에서 사용하고 싶을때
외부 클래스에서 어떤 클래스의 중첩클래스를 호출하고 싶다면
Outer.Inner i = new Outer().new Inner();
이런 형식으로 선언해준다!
static 메소드 안에선 static 클래스, 메소드만 사용가능
- oMethod를 static으로 변경하면 객체 생성이 안됨 → Inner class에 static을 붙여줌
- OuterStatic.this 사용 불가 → int i에 statc을 붙여서 클래스명.변수로 접근가능하게 만듦
위 코드를 스테틱으로 변환
class OuterStatic{
static int i = 20;
static class Inner{
int i = 10;
void iMethode() {
int i =1;
System.out.println("i= " +i);
System.out.println("this.i= " + this.i);
System.out.println("outer.i= " + OuterStatic.i);
}
}
static void oMethod() {
Inner i = new Inner();
i.iMethode();
}
}
public class OuterStaticTest {
public static void main(String[] args) {
OuterStatic o = new OuterStatic();
System.out.println(o.i);
o.oMethod();
OuterStatic.oMethod();
OuterStatic.Inner i = new OuterStatic.Inner();
i.iMethode();
}
}
static과 non-static의 중첩 클래스의 객체 생성 부분이 다르니까 주의 할것!
Outer.Inner i = new Outer().new Inner(); ← outer클래스의 객체를 먼저 만듦
OuterStatic.Inner i = new OuterStatic.Inner(); ← 클래스명으로 호출
반응형
'3. 자바 > 2. Class' 카테고리의 다른 글
bigInteger, BingDecimal (0) | 2020.03.02 |
---|---|
Input, Output (0) | 2020.03.02 |
Overriding (0) | 2020.03.02 |
this, super (0) | 2020.03.02 |
생성자 (0) | 2020.03.02 |