JavaRush /Java Blog /Random-KO /정적 중첩 클래스

정적 중첩 클래스

Random-KO 그룹에 게시되었습니다
안녕하세요! 우리는 Java의 중첩 클래스 주제를 계속해서 탐구합니다. 지난 강의에서 우리는 비정적 중첩 클래스 또는 내부 클래스라고도 하는 것에 대해 이야기했습니다. 정적 중첩 클래스 - 2오늘은 다른 그룹으로 이동하여 정적 중첩 클래스를 자세히 살펴보겠습니다. 정적 중첩 클래스 - 3그들은 다른 그룹과 어떻게 다른가요? 이러한 클래스를 선언할 때 이미 익숙한 static 키워드를 사용합니다.
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
정적 중첩 클래스 - 4Boeing737이 예에는 이 모델의 비행기를 만드는 외부 클래스가 있습니다 . 그리고 그는 제조 연도( int manufactureYear)라는 하나의 매개변수를 갖는 생성자를 가지고 있습니다. int maxPassengersCount최대 승객 수라는 하나의 정적 변수도 있습니다 . 동일한 모델의 모든 항공기에 대해 동일하므로 사본 하나만 필요합니다. 또한 정적 내부 클래스 Drawing인 비행기 청사진도 있습니다. 이 클래스에서는 항공기에 대한 모든 서비스 정보를 캡슐화할 수 있습니다. 이 예에서는 단순화를 위해 제조 연도로 제한했지만 다른 많은 정보를 포함할 수 있습니다. 정적 중첩 클래스 - 5지난 강의에서 논의한 것처럼 이러한 중첩 클래스를 생성하면 캡슐화가 증가하고 보다 현실적인 추상화가 촉진됩니다. 정적 및 비정적 중첩 클래스의 차이점은 무엇입니까? 1. 정적 클래스 객체는 Drawing외부 클래스의 특정 인스턴스에 대한 참조를 저장하지 않습니다. 자전거에 대한 지난 강의의 예를 기억하세요.
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
거기서 우리는 SteeringWheel외부 클래스(자전거)의 객체에 대한 참조가 우리가 눈치채지 못하는 사이에 내부 클래스(운전대)의 각 인스턴스로 전달되는 방법에 대해 이야기했습니다 Bicycle. 외부 클래스의 객체가 없으면 내부 클래스의 객체도 존재할 수 없습니다. 정적 중첩 클래스의 경우에는 그렇지 않습니다. 정적 중첩 클래스의 객체는 자체적으로 쉽게 존재할 수 있습니다. 이런 점에서 정적 클래스는 비정적 클래스보다 "독립적"입니다. 유일한 요점은 그러한 객체를 생성할 때 외부 클래스의 이름을 지정해야 한다는 것입니다.
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
왜 우리는 클래스를 Drawing정적으로 만들었는가? 지난 강의에서 클래스 Seat(자전거 좌석)가 비정적이었나요? 지난번처럼 예시를 이해하기 위해 약간의 "철학"을 추가해보겠습니다 :) 자전거 좌석과 달리 그림의 본질은 비행기의 본질과 그다지 밀접하게 얽매이지 않습니다. 자전거가 없는 별도의 좌석 개체는 대개 의미가 없습니다(항상 그런 것은 아니지만 이에 대해서는 지난 수업에서 이야기했습니다). 그림의 본질은 그 자체로 의미가 있습니다. 예를 들어 항공기 수리를 계획하는 엔지니어에게 유용할 수 있습니다. 계획을 세우는 데 비행기 자체가 필요하지 않으며 어디든 배치할 수 있습니다. 도면만 있으면 충분합니다. 또한, 동일한 모델의 모든 항공기에 대해 도면은 여전히 ​​동일하므로 자전거 좌석과 같은 견고한 연결이 없습니다. 따라서 개체에는 Drawing특정 항공기 개체에 대한 링크가 필요하지 않습니다. 2. 외부 클래스의 변수 및 메소드에 대한 다양한 액세스. 정적 중첩 클래스는 외부 클래스의 정적 필드에만 액세스할 수 있습니다. 이 예에서 클래스에는 외부 클래스에서 정적 변수의 값을 반환하는 Drawing메서드가 있습니다 . 그러나 값을 반환하는 메서드 를 만들 수는 없습니다 . 결국 변수는 비정적입니다. 즉, 특정 인스턴스에 속해야 한다는 의미입니다 . 그리고 우리가 이미 알아낸 것처럼 정적 중첩 클래스의 경우 외부 클래스의 객체가 쉽게 누락될 수 있습니다. 따라서 제한 사항이 있습니다 :) 외부 클래스의 정적 변수에 어떤 액세스 수정자가 있는지는 중요하지 않습니다. 그렇더라도 정적 중첩 클래스에서는 여전히 액세스할 수 있습니다. 위의 모든 사항은 정적 변수에 대한 액세스뿐만 아니라 정적 메서드에도 적용됩니다. 중요한! 내부 클래스 선언의 단어는 하나의 객체만 생성할 수 있다는 의미는 아닙니다. 객체와 변수를 혼동하지 마세요. 정적 변수에 대해 이야기하고 있다면 예를 들어 정적 클래스 변수가 단일 복사본에 존재합니다. 그러나 중첩 클래스에 적용하면 해당 객체가 외부 클래스의 객체에 대한 참조를 포함하지 않는다는 의미일 뿐입니다. 그리고 원하는 만큼 객체를 생성할 수 있습니다: getMaxPassengersCount()maxPassengersCountgetManufactureYear()DrawingmanufactureYearmanufactureYearBoeing737privatestaticmaxPassangersCountstatic
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
우리는 중첩된 클래스에서 직접 메서드를 선언하고 main()(특별한 이유는 없습니다. 가능하다는 점을 알려드리기 위해) 5개의 객체를 생성했습니다 Drawing. 외부 클래스의 단일 객체가 없다는 사실에도 불구하고. 보시다시피 문제가 없었습니다. :) 콘솔 출력:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
이것으로 우리 수업을 마칩니다! 만약을 대비해 오라클 문서에서 해당 섹션에 대한 링크를 남겨드리겠습니다 . 불분명한 점이 있으면 읽어보세요. 이제 몇 가지 문제를 해결할 시간입니다! :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION