Notice
Recent Posts
Recent Comments
Link
관리 메뉴

개발자되기 프로젝트

내부 클래스 정의, 유형 본문

Java/다양한 기능

내부 클래스 정의, 유형

Seung__ 2021. 10. 26. 21:09

1. 내부 클래스(inner class)


  • 클래스 내부에 선언한 클래스로 이 클래스를 감싸고 있는 외부 클래스와 밀접한 연관이 있는 경우가 많음.
  • 다른 외부 클래스에서 사용할 일이 거의 없는 경우에 내부 클래스로 선언해해서 주로 사용함
  • 중첩 클래스
  • 내부 클래스의 종류
    • 인스턴스 내부 클래스, static 내부 클래스, local 내부 클래스, anonymous 내부 클래스

 

 

 

2. 인스턴스 내부 클래스


  • 내부적으로 사용할 클래스를 선언(private로 선언하는 것을 권장)
  • 외부 클래스가 생성된 후 생성됨(static 내부 클래스와 다름)
  • private가 아닌 내부 클래스는 다른 외부 클래스에서 생성할 수 있음.
  • 인스턴스 내부 클래스에 static 변수 사용이 가능?
    • 인스턴스 내부 클래스는 외부 클래스가 생성된 후에 생성된다.
    • 이 때 내부 클래스에 static을 사용하는 외부 클래스 생성과 관계 없이 쓸 수 있다는 의미.
    • 하지만 innterClass는 outClass에 생성에 종속되기 때문에 사용이 불가능.
    • 즉 outClass가 있어야 innerClass를 생성하던가 말던가 할 수 있고, 
    • 이 때 인스턴스 내부 클래스의 static변수를 사용이 가능.
class OutClass{
    private int num = 10;
    private static int sNum = 20;
    private InClass inClass;

    public OutClass() {
        inClass = new InClass();
    }

    class InClass{
        int iNum = 100;

        int sInNum = 500;
        //static int sInNum = 500; //사용 불가

        void inTest(){
            System.out.println("OutClass num = " + num + "(외부 클래스의 인스턴스 변수)");
            System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 static 변수)");
            System.out.println("InnerClass iNum = " + iNum + "(내부 클래스의 인스턴스 변수)");
        }
    }

    //외부 클래스에서 인스턴스 내부 클래스의 메서드 사용
    public void userClass(){
        inClass.inTest();
    }
}


public class InnerTest {

    public static void main(String[] args) {
        OutClass outClass = new OutClass(); //Inclass도 생성됨.
        outClass.userClass();

        //Innerclass가 private가 아닌 경우 외부에서도 생성 가능
        //단 생성된 outClass에서 InClass를 찾아서 생성해야함 .아래와 같은 방식
        OutClass.InClass inner = outClass.new InClass();
    }
}
  • 인스턴스 내부 클래스가 private가 아닌 경우 외부 클래스를 사용해서 외부에서 Innerclass생성 가능

 

3. Static 내부 클래스


  • 외부 클래스 생성과 무관하게 사용 가능
  • 정적 변수, 정적 메서드 사용
  • static내부 클래스에서는 외부 클래스 인스턴스 변수를 사용 못한다.
    • 왜냐? static 내부 클래스는 외부 클래스 생성과 관계 없이 사용할 수 있기 때문에!
  • static메서드에서는 인스턴스 변수 사용 불가
    • 내부/외부 클래스의 생성과 무관하게 사용이 가능하기 때문.
class OutClass{
    private int num = 10;
    private static int sNum = 20;
    private InClass inClass;

    public OutClass() {
        inClass = new InClass();
    }

    static class InStaticClass{
        int iNum = 100;
        static int sInNum = 200;

        void inTest(){
            //System.out.println("OutClass num = " + num + "(외부 클래스의 인스턴스 변수)");
            System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 static 변수)");
            System.out.println("InnerClass iNum = " + iNum + "(내부 클래스의 인스턴스 변수)");
            System.out.println("InnerClass sInNum = " + sInNum + "(내부 클래스의 static 변수)");
        }

        static void sTest(){ //내부 클래스 생성과 관계 없이 사용할 수 있음.
            //System.out.println("OutClass num = " + num + "(외부 클래스의 인스턴스 변수)");
            System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 static 변수)");
            //System.out.println("InnerClass iNum = " + iNum + "(내부 클래스의 인스턴스 변수)");
            System.out.println("InnerClass sInNum = " + sInNum + "(내부 클래스의 static 변수)");
        }
    }
}


public class InnerTest {

    public static void main(String[] args) {

        //바로 생성해서 사용할 수 있음.
        OutClass.InStaticClass inStaticClass = new OutClass.InStaticClass();
        inStaticClass.inTest();
    }
}

 

 

 

4. GitHub: 211026 InnerClass


 

GitHub - bsh6463/various_functions

Contribute to bsh6463/various_functions development by creating an account on GitHub.

github.com

 

'Java > 다양한 기능' 카테고리의 다른 글

객체지향 프로그래밍 vs 람다식 구현  (0) 2021.10.27
Stream  (0) 2021.10.27
함수형 인터페이스, 람다식 구현 및 사용  (0) 2021.10.27
람다식  (0) 2021.10.27
익명 내부 클래스 활용  (0) 2021.10.26
Comments