반응형

[광고 누르면 오늘의 행운 상승!!]

클래스 안에서 클래스를 정의하는 기법.

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 클래스, 메소드만 사용가능

  1. oMethod를 static으로 변경하면 객체 생성이 안됨 → Inner class에 static을 붙여줌
  2. 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

+ Recent posts