1. 내부 클래스

정적 변수와 정적 메서드가 있다는 사실을 최근에 배웠습니다. 정적 클래스도 있음이 밝혀졌습니다. 그러나 우리는 멀리서 이 주제에 접근할 것입니다.

Java에서는 클래스 내에서 클래스를 선언하는 것이 전적으로 허용됩니다. 그리고 클래스 내의 클래스 내에 있는 클래스 내의 클래스도 있습니다. 모든 것이 매우 간단해 보입니다.

class OuterClass
{
   variables of the class
   methods of the class

   class NestedClass
   {
      variables of the class
      methods of the class
   }
}

우리는 다른 클래스 안에 하나의 클래스를 선언할 뿐입니다. 저것과 같이 쉬운.

예:

public class Solution
{
   static ArrayList<Point> points = new ArrayList<Point>();

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points.add(point);
   }

   static class Point
   {
      int x;
      int y;
   }
}

중첩 클래스는 정적이거나 비정적일 수 있습니다. 정적 중첩 클래스는 단순히 정적 중첩 클래스 라고 합니다 . 비정적 중첩 클래스를 내부 클래스 ( 내부 클래스 )라고 합니다.



2. 정적 클래스

정적 중첩 클래스는 외부 클래스 외부에서 사용할 수 있습니다. 이러한 클래스에 공용 액세스 한정자가 있는 경우 프로그램의 어디에서나 사용할 수 있습니다. 이러한 클래스는 일반 클래스와 거의 구별할 수 없습니다. 그러나 몇 가지 차이점이 있습니다.

클래스 이름

외부 클래스가 아닌 다른 곳에서 정적 중첩 클래스를 참조하려면 외부 클래스 이름과 중첩 클래스 이름으로 구성된 클래스 이름을 지정해야 합니다. 이 이름의 일반적인 모양은 다음과 같습니다.

OuterClass.InnerClass

예:

아우터 클래스 중첩 클래스 중첩 클래스의 전체 이름
com.codegym.Solution
Point
com.codegym.Solution.Point
java.util.Map
Entry
java.util.Map.Entry
java.util.Files
DirectoryStream
java.util.Files.DirectoryStream
java.nio.WindowsPath
Closeable
java.nio.WindowsPath.Closeable

중첩 클래스에 자체 중첩 클래스가 있는 경우 해당 이름은 단순히 점을 사용하여 연결됩니다.

JDK에서 중첩된 클래스의 전형적인 예는 클래스 Entry내부의 클래스 입니다 Map. HashMap객체 에 entrySet()저장된 키-값 쌍 세트를 가져오려면 .Set<Map.Entry>

이것은 외부 클래스와 중첩 클래스의 예입니다.Map.Entry

개체 만들기

정적 중첩 클래스의 개체를 만드는 것은 매우 쉽습니다. 다음과 같이 표시됩니다.

OuterClass.NestedClass name = new OuterClass.NestedClass();

일반 클래스와 동일하지만 이름은 두 부분으로 구성됩니다.

정적 메서드 호출

정적 클래스에 정적 메서드가 있는 경우 일반 클래스의 정적 메서드와 동일한 방식으로 액세스할 수 있습니다(단, 클래스 이름은 두 부분으로 구성됨).

OuterClass.NestedClass.staticMethod();

정적 변수에 액세스

중첩 클래스의 공개 정적 변수에 액세스하는 것도 쉽습니다.

OuterParent.NestedClass.nameOfStaticVariable


3. 정적 클래스의 특징

정적 중첩 클래스는 정적이라고 할 이유가 가장 적습니다 . 그것들은 일반 클래스처럼 동작합니다 . 비정적 메서드에서 액세스하는 데 제한이 없습니다.

외부 클래스 내에서 정적 중첩 클래스로 작업하는 경우 가장 일반적인(중첩 및 정적이 아닌) 클래스와 어떤 차이도 느끼지 못할 것입니다.

예:

정적 중첩 포인트 클래스 일반 포인트 클래스.
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }

   static class Point
   {
      int x;
      int y;
   }
}
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }
}

class Point
{
   int x;
   int y;
}

일부 정적 중첩 클래스를 외부 클래스 밖으로 이동하면 변경되는 유일한 사항은 새 클래스가 더 이상 private static이전 외부 클래스의 변수 및 메서드에 액세스할 수 없다는 것입니다.

예:

정적 중첩 포인트 클래스 일반 포인트 클래스.
public class Solution
{
   private static ArrayList<Point> points;

   static class Point
   {
      int x;
      int y;

      public static void main(String[] args)
      {
         Point point = new Point();
         point.x = 100;
         point.y = 200;

         // This will work
         points = new ArrayList<Point>();
         points.add(point);
      }
   }
}
public class Solution
{
   private static ArrayList<Point> points;
}

class Point
{
   int x;
   int y;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;

      // This will generate an error
      points = new ArrayList<Point>();
      points.add(point);
   }
}

main일반 Point클래스 의 메서드 는 클래스 의 변수 에 액세스 할 수 없습니다 !private static pointsSolution

이것이 정적 중첩 클래스와 일반 클래스의 주요 차이점입니다. 정적 중첩 클래스의 메서드는 선언된 경우에도 외부 클래스의 모든 정적 변수 및 메서드에 액세스할 수 있습니다 private.

생각해 보면 왜 놀라운 일입니까? 수정 자는 private이 수정자가 표시한 변수와 메서드는 해당 클래스 내에서만 액세스할 수 있다고 명시적으로 말합니다. 외부 클래스 안에 정적 중첩 클래스가 있습니까? 예, 문제 없습니다! 원하는 만큼 액세스하세요.