내부 클래스

: 클래스 안에 클래스가 정의된 형식

1. 인스턴스 내부 클래스

-멤버 변수, 멤버 메서드와 비슷한 성격
-외부 클래스의 객체 생성 이후 접근 가능한 클래스

public class Outer {

    int num1 = 10;

    class Inner {  // 인스턴스 내부 클래스
        int num2 = 20;
        public void method() {
            System.out.println("인스턴스 내부 클래스에서 호출");
            System.out.printf("num1 + num2 = %d%n", num1 + num2);
        }
    }
}
public class Ex01 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.method();
    }
}
  • 인스턴스 내부 클래스의 자원도 활용 가능하다.

  • 내부의 메서드를 접근했고, 동일명의 변수가 존재 한다면, 내부 클래스의 자원을 먼저 사용하게 된다.
    (만약 외부 클래스의 자원을 사용하고 싶다면 Outer.this.num1 와 같이 Outer.this.자원을 활용해주면 된다.)

System.out.printf("num1 + num2 = %d%n", Outer.this.num1 + num2);
  • 이너 클래스 내부에 정적 변수도 정의 가능하다.
class Inner {  // 인스턴스 내부 클래스
        int num1 = 15;
        int num2 = 20;
        static int num3 = 30;

.
.
.

//접근할때

System.out.println(Outer.Inner.num3);

2. 정적 내부 클래스

-정적 변수, 정적 메서드와 비슷한 성격
-객체 생성과 상관 X, 접근 가능(외부 클래스명으로 접근 가능)

public class Outer {
    static class Inner {
        public void method() {
            System.out.println("정적 내부 클래스에서 호출!");
        }
    }
}


//Outer 객체를 따로 생성할 필요가 없음

public class Ex01 {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner()
    }
}
  • 외부 클래스의 자원에 접근 불가. 객체와 관련 없기 때문 (정적인 자원끼리는 접근 가능)

3. 지역 내부 클래스

-함수 안에 정의된 클래스

  • 인터페이스, 추상 클래스가 객체가 되는 조건
    1) 지역 내부, 클래스의 멤버 변수에서 객체 생성
    2) 미구현된 메서드의 재정의를 통해서
public class Outer {
    public Calculator method(int num3) {   //데이터 영역에 num3이 할당됨(상수)
        Calculator cal = new Calculator() {
            public int add(int num1, int num2) {
                return num1 + num2 + num3;
            }
        };

        return cal;
    }
}
public class Ex01 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Calculator cal = outer.method(30);
        int result = cal.add(10,20);  // 60
        System.out.println(result);

        int result2 = cal.add(20, 30);  //80 final int num3 - 지역변수의 상수화
        System.out.println(result2);    //이유 - 제거되지 않기 위해서
    }
}

클래스내부의 메서드 안에 객체를 생성함.

return new Calculator() {
            public int add(int num1, int num2) {
                return num1 + num2 + num3;
            }
        };

위처럼 바로 반환해줘도 된다.

Calculator cal = new Calculator() {
            @Override
            public int add(int num1, int num2) {
                //num3 = 50;
                return num1 + num2 ;
            }
        };
        
        
 ==
 
 
        Calculator cal2 = (x, y) -> x + y;
    }

위 메서드와 아래 메서드는 같다.

0개의 댓글