CodeGym/Java Blog/무작위의/정적 중첩 클래스
John Squirrels
레벨 41
San Francisco

정적 중첩 클래스

무작위의 그룹에 게시되었습니다
회원
안녕! Java의 중첩 클래스에 대한 주제를 계속 탐색합니다. 지난 연습에서는 내부 클래스라고도 하는 비정적 중첩 클래스에 대해 이야기했습니다. 정적 중첩 클래스 - 1오늘은 다른 클래스 그룹으로 이동합니다. 정적 중첩 클래스를 고려할 것입니다. 정적 중첩 클래스 - 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 maxWeight;

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

   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
Handlebar그 수업에서 우리는 내부 클래스의 각 인스턴스가 눈에 띄지 않게 외부 클래스의 인스턴스에 대한 참조를 전달한다는 사실에 대해 이야기했습니다 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()DrawingmanufactureYearmanufactureYearBoeing737private, 정적 중첩 클래스는 계속 액세스할 수 있습니다. 위의 모든 내용은 정적 변수에 대한 액세스뿐만 아니라 정적 메소드에도 적용됩니다. 중요한! 내부 클래스 선언에서 static키워드는 하나의 개체만 만들 수 있다는 의미가 아닙니다. 개체와 변수를 혼동하지 마십시오. 정적 변수에 대해 이야기하고 있다면 예, 정적 클래스 변수의 단일 인스턴스가 존재합니다(예: maxPassangersCount. 그러나 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 {

       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}
이것으로 수업을 마칩니다! 만일을 대비하여 Oracle 설명서에서 관련 섹션에 대한 링크를 남겨두겠습니다 . 여전히 불분명한 것이 있으면 읽으십시오. 이제 몇 가지 작업을 해결할 시간입니다! :)
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다