English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 흐름 제어

Java 배열

Java 객체 지향(I)

Java 객체 지향(II)

Java 객체 지향(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 내장 및 내부 클래스

이 튜토리얼에서는 예제를 통해 Java의 내장 클래스와 그 유형을 배우게 됩니다.

Java에서는 다른 클래스 안에 클래스를 정의할 수 있습니다. 이러한 클래스는 nested class(내장 클래스)이라고 합니다. 예를 들어,

class OuterClass {
    // ...
    class NestedClass {
        // ...
    }
}

Java를 사용하여 두 가지 종류의 내부 클래스를 생성할 수 있습니다.

  • 비정적 내부 클래스(내부 클래스)

  • 静态嵌套类

관련 독서:

먼저 비정적 내부 클래스를 보겠습니다.

비정적 내부 클래스(내부 클래스)

비정적 내부 클래스는 또 다른 클래스 내에 있는 클래스입니다. 그것은 닫힌 클래스(외부 클래스)의 멤버에 접근할 권한을 가집니다. 그것은 일반적으로 inner class(내부 클래스)로 불립니다.

내부 클래스가 외부 클래스 내에 존재하기 때문에 내부 클래스를 인스턴스화하기 위해 먼저 외부 클래스를 인스턴스화해야 합니다.

이것은 Java에서 내부 클래스를 선언하는 예입니다.

示例1:내부 클래스

class CPU {
    double price;
    // 내부 클래스
    class Processor{
        //내부 클래스의 멤버
        double cores;
        String manufacturer;
        double getCache(){
            return 4.3;
        }
    }
    //내부 보호된 클래스
    protected class RAM{
        //보호된 내부 클래스의 멤버
        double memory;
        String manufacturer;
        double getClockSpeed(){
            return 5.5;
        }
    }
}
public class Main {
    public static void main(String[] args) {
        //외부 클래스 CPU의 객체를 생성
        CPU cpu = new CPU();
       //외부 클래스를 사용하여 내부 클래스 Processor의 객체를 생성
        CPU.Processor processor = cpu.new Processor();
        //외부 클래스 CPU를 사용하여 내부 클래스 RAM의 객체를 생성
        CPU.RAM ram = cpu.new RAM();
        System.out.println("Processor Cache = "); + processor.getCache());
        System.out.println("Ram Clock speed = "); + ram.getClockSpeed());
    }
}

输出:

Processor Cache = 4.3
Ram Clock speed = 5.5

위의 프로그램에서는 두 개의 내부 클래스가 있습니다: Processor와 RAM이 외부 클래스 CPU 내에 있습니다:. 내부 클래스를 보호된 것으로 선언할 수 있습니다. 따라서 우리는 RAM 클래스를 보호된 것으로 선언했습니다.

Main 클래스 내에서

  • 우리는 이름이 cpu인 외부 클래스 CPU의 인스턴스를 먼저 생성합니다。

  • 그런 다음, 외부 클래스의 인스턴스를 사용하여 내부 클래스의 객체를 생성합니다: 

    CPU.Processor processor = cpu.new Processor();
    CPU.RAM ram = cpu.new RAM();

주의:내부 클래스의 인스턴스를 생성하기 위해 외부 클래스를 사용하여 점(. ) 연산자를 사용합니다。

내부 클래스 내에서 외부 클래스 멤버에 접근

우리는 this 키워드를 사용하여 외부 클래스의 멤버에 접근할 수 있습니다. 이 키워드에 대해 더 알고 싶다면, 다음을 방문하세요Java의 this 키워드。}} 

示例2멤버 접근

class Car {
    String carName;
    String carType;
    //구조화된 함수 사용으로 값을 할당합니다
    public Car(String name, String type) {
        this.carName = name;
        this.carType = type;
    }
    // private 메서드
    private String getCarName() {
        return this.carName;
    }
    //내부 클래스
    class Engine {
        String engineType;
        void setEngine() {
           //Car의 carType 속성 접근
            if(Car.this.carType.equals("4WD")){
                //Car의 getCarName() 메서드 호출
                if(Car.this.getCarName().equals("Crysler")) {
                    else {
                }
                    this.engineType = "Bigger";
                }
            }
                this.engineType = "Bigger";
            }
        }
        String getEngineType(){
            return this.engineType;
        }
    }
}
public class Main {
    public static void main(String[] args) {
        //외부 클래스 Car 객체를 생성합니다
        Car car1 = new Car("Mazda", "8WD");
        //외부 클래스를 사용하여 내부 클래스 객체를 생성합니다
        Car.Engine engine = car1.new Engine();
        engine.setEngine();
        System.out.println("8WD 엔진 유형 = " + engine.getEngineType());
        Car car2 = new Car("Crysler", "4WD");
        Car.Engine c2engine = car2.new Engine();
        c2engine.setEngine();
        System.out.println("4WD 엔진 유형 = " + c2engine.getEngineType());
    }
}

输出:

8WD 엔진 유형 = Bigger
4WD 엔진 유형 = Smaller

위의 프로그램에서 외부 클래스 Car에 Engine이라는 내부 클래스가 있습니다. 여기서 이 줄을 주목해 주세요,

if(Car.this.carType.equals("4WD")) { ... }

this 키워드를 사용하여 carType 외부 클래스 변수에 접근합니다. Car.this.carType 대신 this.carType를 사용하는 것을 이미 알고 계셨을 것입니다.

이유는 외부 클래스 이름 Car를 언급하지 않았을 때 this 키워드는 내부 클래스의 멤버를 나타낸다.

同样,我们也从内部类访问外部类的方法。

if (Car.this.getCarName().equals("Crysler") {...

需要注意的是,尽管getCarName()是一个private方法,但我们能够从内部类访问它。

静态嵌套类

在Java中,我们还可以在另一个类中定义一个静态(static)类。 这种类称为静态嵌套类(static nested class)。 静态嵌套类不称为静态内部类。

与内部类不同,静态嵌套类无法访问外部类的成员变量。这是因为静态嵌套类不需要您创建外部类的实例。

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

在这里,我们仅通过使用外部类的类名来创建静态嵌套类的对象。因此,不能使用OuterClass.this引用外部类。

示例3:静态内部类

class MotherBoard {
   //静态嵌套类
   static class USB{
       int usb2 = 2;
       int usb3 = 1;
       int getTotalPorts(){
           return usb2 + usb3;
       }
   }
}
public class Main {
   public static void main(String[] args) {
       //创建静态嵌套类的对象
       //使用外部类的名称
       MotherBoard.USB usb = new MotherBoard.USB();
       System.out.println("Total Ports = "); + usb.getTotalPorts());
   }
}

输出:

Total Ports = 3

在上面的程序中,我们在类MotherBoard中创建了一个名为USB的静态类。 注意这一行,

MotherBoard.USB usb = new MotherBoard.USB();

在这里,我们使用外部类的名称创建一个USB对象。

现在,让我们看看如果尝试访问外部类的成员会发生什么:

示例4:在静态内部类内部访问外部类的成员

class MotherBoard {
   String model;
   public MotherBoard(String model) {
       this.model = model;
   }
   //静态嵌套类
   static class USB{
       int usb2 = 2;
       int usb3 = 1;
       int getTotalPorts(){
           //访问外部类的变量model
           if(MotherBoard.this.model.equals("MSI")) {
               return 4;
           }
           else {
               return usb2 + usb3;
           }
       }
   }
}
public class Main {
   public static void main(String[] args) {
       //创建静态嵌套类的对象
       MotherBoard.USB usb = new MotherBoard.USB();
       System.out.println("Total Ports = "); + usb.getTotalPorts());
   }
}

이 프로그램을 실행하려고 시도할 때, 다음과 같은 오류가 발생합니다:

error: non-static 변수 this는 스태틱 컨텍스트에서 참조할 수 없습니다.

이것은 우리가 외부 클래스의 객체를 사용하여 내부 클래스의 객체를 생성하지 않았기 때문입니다. 따라서 Motherboard.this에 저장된 외부 클래스 Motherboard에 대한 참조가 없습니다.

기억해야 할 주요 사항

  • Java는 내부 클래스를 클래스의 일반 멤버로 간주합니다. 그들은 클래스 내에서 선언된 메서드와 변수와 같습니다.

  • 내부 클래스는 외부 클래스의 멤버이기 때문에, 어떤 접근 수정자(예: private, protected)도 적용할 수 있습니다. 이는 일반 클래스에서는 불가능합니다.

  • 내부 클래스는 그들이 닫힌 외부 클래스의 멤버이기 때문에, 점(.) 표기법을 사용하여 내부 클래스와 그 멤버에 접근할 수 있습니다.

  • 내부 클래스를 사용하면 코드가 더 읽기 쉽고 더 좋은 포장을 제공할 수 있습니다.

  • 비 스태틱 내부 클래스(내부 클래스)는 외부에 접근할 수 있습니다./불변한 클래스의 다른 멤버는 그들이 private로 선언되었더라도 그렇습니다.