CodeGym/Java Blog/무작위의/Java 내부 클래스
John Squirrels
레벨 41
San Francisco

Java 내부 클래스

무작위의 그룹에 게시되었습니다
회원
Java에서는 일부 클래스에 다른 클래스가 포함될 수 있습니다. 이러한 클래스를 중첩 클래스라고 합니다. 다른 클래스 내에 정의된 클래스는 일반적으로 정적 및 비정적이라는 두 가지 범주로 분류됩니다. 중첩된 비정적 클래스를 내부라고 합니다. 정적으로 선언된 중첩 클래스를 정적 ​​중첩 클래스라고 합니다. 실제로 용어가 다소 모호해 보이고 때로는 전문 소프트웨어 개발자조차 혼동할 수 있지만 여기에는 복잡한 것이 없습니다.

중첩 및 내부 클래스

따라서 다른 클래스 내부에 있는 모든 클래스를 중첩 클래스라고 합니다.
class OuterClass {
    ...
    class NestedClass {
        ...
    }
}
정적이 아닌 중첩 클래스를 내부 클래스 라고 하고 , 정적인 중첩 클래스를 정적 ​​중첩 클래스 라고 합니다 . Java 내부 클래스 - 1
class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}
따라서 모든 내부 클래스는 중첩되지만 모든 중첩이 내부 클래스는 아닙니다. 이것이 주요 정의입니다. 내부 클래스는 Java의 일종의 보안 메커니즘입니다. 우리는 일반 클래스가 개인 액세스 수정자와 연결될 수 없다는 것을 알고 있습니다. 그러나 우리 클래스가 다른 클래스의 멤버인 경우 내부 클래스를 비공개로 설정할 수 있습니다. 이 기능은 비공개 클래스 멤버에 액세스하는 데에도 사용됩니다.

내부 클래스 예

그럼, 어떤 클래스를 만들고 그 안에 또 다른 클래스를 만들어 봅시다. 일종의 모듈식 게임 콘솔을 상상해 보세요. "상자" 자체가 있으며 특정 모듈을 여기에 연결할 수 있습니다. 예를 들어 게임 컨트롤러, 스티어링 휠, VR 헬멧은 일반적으로 콘솔 자체 없이는 작동하지 않습니다. 여기에 GameConsole 클래스가 있습니다. 여기에는 2개의 필드와 1개의 메소드( start() ) 가 있습니다 . GameCosole 과 우리가 익숙한 클래스 의 차이점은 내부 GameController 클래스가 있다는 것입니다.
public class GameConsole {
    private String model;
    private int weight;

    public void run() {
        System.out.println("Game console is on");
    }


    public class GameController {

        private String color;

        public void start() {
            System.out.println("start button is pressed");
        }

        public void x() {
            System.out.println("x button is pressed");
        }

        public void y() {
            System.out.println("y button is pressed");
        }
        public void a() {
            System.out.println("a button is pressed");
        }

        public void b() {
            System.out.println("b button is pressed");
        }
        public void mover() {
            System.out.println("mover button is pressed");
        }

    }

}
이 시점에서 여러분은 궁금할 것입니다: 왜 이 클래스들을 "별도"로 만들지 않습니까? 중첩되게 만들 필요는 없습니다. 실제로 가능합니다. 오히려 그것은 사용 측면에서 클래스의 올바른 디자인에 관한 것입니다. 내부 클래스는 프로그램에서 다른 엔터티와 불가분하게 연결된 엔터티를 강조하기 위해 생성됩니다. 컨트롤러 또는 VR 헬멧 등은 콘솔의 구성 요소입니다. 예, 콘솔과 별도로 구매할 수 있지만 콘솔 없이는 사용할 수 없습니다. 이러한 모든 클래스를 별도의 공개 클래스로 만들면 프로그램은 예를 들어 다음 코드를 가질 수 있습니다.
public class Main {

   public static void main(String[] args) {
       GameController controller = new GameController();
       controller.x();
   }
}
컨트롤러 자체는 콘솔 없이는 작동하지 않기 때문에 이 경우 무슨 일이 일어나는지는 명확하지 않습니다. 게임 콘솔 개체를 만들었습니다. 우리는 하위 개체인 게임 컨트롤러를 만들었습니다. 이제 게임을 할 수 있습니다. 오른쪽 키를 누르기만 하면 됩니다. 우리에게 필요한 메소드는 올바른 객체에서 호출됩니다. 모든 것이 간단하고 편리합니다. 이 예에서 게임 컨트롤러를 추출하면 캡슐화가 향상되고(해당 클래스 내부에 콘솔 부분의 세부 정보가 숨겨짐) 더 자세한 추상화가 가능해집니다. 하지만 예를 들어 VR 헬멧이나 컨트롤러를 별도로 구입할 수 있는 매장을 시뮬레이션하는 프로그램을 만든다면 이 예제는 실패할 것입니다. 게임 컨트롤러를 별도로 만드는 것이 좋습니다. 또 다른 예를 들어보겠습니다. 위에서 내부 클래스를 비공개로 설정하고 외부 클래스에서 호출할 수 있다고 언급했습니다. 다음은 그러한 클래스의 예입니다.
class OuterClass {

   // inner class
   private class InnerClass {
       public void print() {
           System.out.println("We are in the inner class...");
       }
   }

   // method of outer class. We are create an inner class from the method of outer one
   void display() {
       InnerClass inner = new InnerClass();
       inner.print();
   }
}
여기서 OuterClass 는 외부 클래스이고, InnerClass 는 내부 클래스이고, display() 는 내부 클래스의 객체를 생성하는 메서드입니다. 이제 display() 메서드 를 호출할 기본 메서드가 포함된 데모 클래스를 작성해 보겠습니다 .
public class OuterDemoMain {

       public static void main(String args[]) {
           // create an object of the outer class
           OuterDemo outer = new OuterDemo();

           outer.display();
       }
}
이 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
우리는 내부 클래스에 있습니다 ...

내부 클래스 분류

내부 클래스 자체 또는 중첩된 비정적 클래스는 세 그룹으로 분류됩니다.
  • 내부 클래스는 그대로입니다. 위에서 GameConsoleGameController 예제 를 통해 설명한 것처럼 다른 클래스 안에 하나의 비정적 클래스만 있으면 됩니다 .
  • 메소드-로컬 내부 클래스는 메소드 내부의 클래스입니다.
  • 익명 내부 클래스.
Java 내부 클래스 - 2

메소드 로컬 내부 클래스

Java에서는 메소드 내부에 클래스를 작성할 수 있으며 이는 로컬 유형입니다. 지역 변수와 마찬가지로 내부 클래스의 범위는 메서드 내에서 제한됩니다. 메서드 로컬 내부 클래스는 내부 클래스가 정의된 메서드 내에서만 생성될 수 있습니다. 로컬 메서드 내부 클래스를 사용하는 방법을 보여드리겠습니다.
public class OuterDemo2 {

   //instance method of the outer class OuterDemo2
   void myMethod() {
       String str = "and it's a value from OuterDemo2 class' myMethod ";

       // method-local inner class
       class methodInnerDemo {
           public void print() {
               System.out.println("Here we've got a method inner class... " );
               System.out.println(str);

           }
       }

       // Access to the inner class
       methodInnerDemo inn = new methodInnerDemo();
       inn.print();
   }
}
이제 외부() 메서드 를 호출할 기본 메서드가 포함된 데모 클래스를 작성하겠습니다 .
public class OuterDemoMain {


   public static void main(String args[]) {
       OuterDemo2 outer = new OuterDemo2();
       outer.myMethod();
   }
}
출력은 다음과 같습니다
여기에는 내부 클래스 메서드가 있습니다. 이는 OuterDemo2 클래스의 myMethod 값입니다.

익명 내부 클래스

클래스 이름 없이 선언된 내부 클래스를 익명 내부 클래스라고 합니다. 익명의 내부 클래스를 선언하면 즉시 인스턴스화됩니다. 일반적으로 이러한 클래스는 클래스 또는 인터페이스 메서드를 재정의해야 할 때마다 사용됩니다.
abstract class OuterDemo3 {
   public abstract void method();

}
   class outerClass {

       public static void main(String args[]) {
           OuterDemo3 inner = new OuterDemo3() {
               public void method() {
                   System.out.println("Here we've got an example of an  anonymous inner class");
               }
           };
           inner.method();
       }
   }
출력은 다음과 같습니다.
여기에 익명 내부 클래스의 예가 있습니다.

인수로서의 익명 내부 클래스

익명의 내부 클래스를 메서드에 대한 인수로 전달할 수도 있습니다. 여기에 예가 있습니다.
interface OuterDemo4 {
       String hello();
   }

   class NewClass {
       // accepts the object of interface
       public void displayMessage(OuterDemo4 myMessage) {
           System.out.println(myMessage.hello());
           System.out.println("example of anonymous inner class as an argument");
       }

       public static void main(String args[]) {
           NewClass newClass = new NewClass();

           //here we pass an anonymous inner class as an argument
           newClass.displayMessage(new OuterDemo4() {
               public String hello() {
                   return "Hello!";
               }
           });
       }
}
출력은 다음과 같습니다.
안녕하세요! 인수로서의 익명 내부 클래스의 예
배운 내용을 강화하려면 Java 과정의 비디오 강의를 시청하는 것이 좋습니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다