이너 클래스
Inner classOOP(객체 지향 프로그래밍)에서 내부 클래스 또는 중첩 클래스는 다른 클래스 또는 인터페이스의 본문 내에서 완전히 선언된 클래스다. 그것은 하위 계급과 구별된다.
개요
정상 또는 최상위 클래스의 인스턴스는 자체로 존재할 수 있다. 대조적으로 내부 클래스의 인스턴스는 최상위 클래스에 구속되지 않고 인스턴스화할 수 없다.
a의 추상적인 개념을 받아들이자. Car
4개로 Wheel
s. 우리의 Wheel
s는 우리의 일부가 되는 것에 의존하는 특정한 특징을 가지고 있다. Car
이 개념은 다음을 나타내지 않는다. Wheel
사스 Wheel
s 모든 차량의 일부가 될 수 있는 보다 일반적인 형태로. 대신에, 그것은 그들을 특정된 것으로 나타낸다. Car
. 이 개념은 다음과 같이 내부 클래스를 사용하여 모델링할 수 있다.
우리는 최고 수준의 수업이 있다. Car
. 클래스의 인스턴스 Car
4개의 예시로 구성되어 있다. Wheel
. 의 이 특별한 구현. Wheel
자동차에 한정되어 있기 때문에, 코드는 최상위 등급으로 더 잘 표현될 수 있는 바퀴의 일반적인 개념을 모델링하지 않는다. 그러므로, 그것은 의미론적으로 수업과 연결되어 있다. Car
의 강령 Wheel
어떤 식으로든 자동차의 구성 단위로서 그것의 외부 등급과 결합된다. 특정 자동차를 위한 바퀴는 그 자동차 특유의 것이지만 일반화를 위해 바퀴는 자동차에 대한 집적 단위다.
내부 등급은 이 연결을 정확하게 모델링할 수 있는 메커니즘을 제공한다. 우리는 우리의 것을 참고할 수 있다. Wheel
로 분류하다. Car.Wheel
, Car
최상위 클래스 및 Wheel
내향적인 계급이 되는 것.
그러므로 내부 클래스는 클래스로 캡슐화되지 않는 프로그램의 특정 부분의 객체 방향을 허용한다.
클래스 내 코드의 큰 세그먼트는 내부 클래스보다는 별도의 최상위 클래스로 모델링하거나 리팩터링할 수 있다. 이는 코드를 더 일반화하여 그 코드를 더 일반화하게 할 수 있고 따라서 더 재사용 가능하지만 잠재적으로 조기 일반화가 될 수 있다. 코드에 공유 기능을 가진 많은 내부 클래스가 있는 경우, 이것은 더 효과적일 수 있다.
Java의 중첩된 클래스 유형
Java에는 네 가지 유형의 중첩 클래스가 있다.
- 정적
- 정적 멤버 클래스, 정적 중첩 클래스라고도[1] 함 – 선언됨
static
. 정적 범위의 다른 것(즉, 정적 방법)과 마찬가지로, 해당 영역에는 엔클로저 인스턴스가 없으며, 엔클로저 클래스의 인스턴스 변수 및 메서드에 액세스할 수 없다. 범위 세부사항을 제외하고 비중개 클래스와 거의 동일하다(이 클래스는 이름을 검증하지 않고 정적 변수 및 포함 클래스의 방법을 참조할 수 있으며, 해당 인접 클래스가 아닌 다른 클래스는 해당 클래스의 이름을 해당 클래스의 이름으로 한정해야 한다). 중첩된 인터페이스는 암묵적으로 정적이다.
- 비정적/내부 클래스
이너 클래스 – 다음과 같은 범주를 이너 클래스라고 한다. 이러한 클래스의 각 인스턴스는 정적 컨텍스트에서 선언된 로컬 클래스와 익명 클래스를 제외하고 엔클로저 인스턴스(즉, 엔클로저 클래스의 인스턴스)에 대한 참조가 있다. 따라서 이러한 변수들은 은연중에 엔클로저 클래스의 인스턴스 변수 및 방법을 참조할 수 있다. 첨부된 인스턴스 참조는 다음을 통해 명시적으로 얻을 수 있다. EnclosingClassName.this
. 내부 클래스에는 컴파일 시간 상수 변수를 제외하고 정적 변수나 방법이 없을 수 있다. 이러한 클래스를 만들 때 해당 클래스는 엔클로저 클래스의 인스턴스에 대한 참조가 있어야 하며, 즉, 엔클로저 클래스의 인스턴스 메서드 또는 생성자 내에서 생성되어야 하며, (멤버 및 익명 클래스의 경우) 구문을 사용하여 생성되어야 함을 의미한다. enclosingInstance.new InnerClass()
.[1]
- 회원 등급 – 기능("회원"으로 정의) 밖에서 선언되며 "정적"으로 선언되지 않는다.
- 로컬 클래스 – 함수의 본문에 선언된 클래스. 그것들은 오직 기능의 나머지 부분에서만 언급될 수 있다. 그들은 함수의 로컬 변수와 매개변수를 사용할 수 있지만, "최종"으로 선언된 변수만 사용할 수 있다.(이것은 로컬 클래스 인스턴스가 함수를 초과할 수 있기 때문에 변수의 별도 사본을 유지해야 하기 때문에, 동일한 범위에 같은 이름을 가진 두 개의 수정 가능한 변수의 혼동을 겪지 않도록 하기 위해서, 변수는 강제로 사용할 수 밖에 없다. 수정할 수 없는) 형식 변수가 메소드에서 정의되는 일반 형식 필드가 있는 클래스를 만드는 데 매우 유용할 수 있다.
- 익명 클래스 – 표현 중간에 자동으로 선언되고 인스턴스화되는 로컬 클래스다. 그들은 오직 하나의 클래스를 직접 확장하거나 하나의 인터페이스를 구현할 수 있다. 이들은 슈퍼클래스의 생성자에 대한 인수를 지정할 수 있지만 그렇지 않으면 생성자를 가질 수 없다(단, 초기화를 수행하기 위한 인스턴스 이니셜라이저 블록을 가질 수 있기 때문에 제한은 아니다).
프로그래밍 언어
- 이너 클래스는 버전 1.1로 시작하는 자바 프로그래밍 언어의 특징이 되었다.
- 중첩된 클래스는 D 프로그래밍 언어인 Visual Basic의 특징이기도 하다.NET, Ruby, C++, C#.
- Python에서는 클래스를 다른 클래스, 메서드 또는 함수에 중첩시킬 수 있다.
- C++는 "정적"으로 선언되지 않은 것을 제외하고 자바의 정적 멤버 클래스와 같은 중첩된 클래스를 가지고 있다.
- 베타 언어는 중첩된 클래스의 개념을 도입했다.
GUI 코드
로컬 내부 클래스는 GUI 코드에 대한 콜백을 정의하기 위해 자바에서 종종 사용된다. 그런 다음 구성 요소는 이벤트 처리 인터페이스를 구현하거나 특정 이벤트가 트리거될 때 실행할 코드를 포함하는 추상 어댑터 클래스를 확장하는 개체를 공유할 수 있다.
익명 내부 클래스도 이벤트 처리 코드가 한 구성 요소에서만 사용되므로 명명된 참조가 필요하지 않은 경우에 사용된다.
이렇게 하면 여러 개의 if-Else 분기가 있는 큰 단일 방법을 피할 수 있어 사건의 근원을 파악할 수 있다. 이런 유형의 코드는 종종 지저분하게[citation needed] 여겨지고 모든 면에서 내부 계층의 편차가 더 낫다고 여겨진다.[citation needed]
참조
외부 링크
- "내부 수업이라니, 어쨌든 내부는 무엇 때문에 좋은가?"
- D에 중첩된 클래스