내부(non-static) 클래스는 자바에서 클래스 내부에 정의된 클래스를 의미하며, 특별히 인스턴스 내부 클래스라고도불림
예시로 아래의 코드를 들 수 있다.
public class NonStaticClassExample { // 외부 클래스
// 인스턴스 내부 클래스 (non-static 내부 클래스)
class A {
public A() {
System.out.println("A의 생성자 호출");
}
public void AMethod() {
System.out.println("A의 메소드 실행");
}
public void overMethod() {
System.out.println("A의 오버라이딩 전 메소드");
}
}
class B extends A {
public B() {
super();
System.out.println("B의 생성자 호출");
}
public void BMethod() {
System.out.println("B의 메소드 실행");
}
@Override
public void overMethod() {
System.out.println("A의 메소드를 오버라이딩한 B 메소드");
}
}
public static void main(String[] args) {
NonStaticClassExample nsce = new NonStaticClassExample(); // 외부 클래스 객체 생성
// (1) 부모 타입 변수 = new 자식 타입() (O, 정상 작동)
A a = nsce.new B();
a.AMethod(); // A타입의 AMethod() 실행
a.overMethod(); // 동적 바인딩으로 B의 메소드 실행
// (2) 자식 타입 변수 = new 자식 타입() (O, 가능하지만 권장되지 않음)
B b = nsce.new B();
b.BMethod(); // 자식 클래스의 메소드 실행
b.AMethod(); // 부모 메소드 실행 가능
b.overMethod(); //동적 바인딩으로 오버라이딩된 메소드 실행
// (3) 잘못된 코드 예시
// B bb = nsce.new A(); // (🚫) 불가능: A 객체는 B의 기능을 포함하지 않음.
/*
자세한 설명
B타입은 A타입에게 상속받아 A타입의 메소드를 포함한 A타입과 B타입의 고유 기능을 가지나
A타입을 참조하는 형태를 가지게 된다면, 이전에 가진 B타입의 고유한 기능을
사용하지 못하기 때문에 허용되지 않는다.
*/
}
}
위의 코드를 자세하게 나눌 수 있다.
1. 외부 클래스 선언
public class NonStaticClassExample { // non-static 클래스 선언
}
2. 외부 클래스에 내부 클래스 선언
public class NonStaticClassExample { // non-static 클래스 선언
public class A{ // A 클래스 선언
}
public class B{ // B 클래스 선언
}
public static void main (String []args){ // 메인 클래스 선언
}
}
3. 외부 클래스의 인스턴스에 종속적이며 내부 클래스는 외부 클래스의 인스턴스와 연결되어 있다.
>> 즉, 내부 클래스의 객체를 생성하려면 외부 클래스의 객체가 필요함
NonStaticClassExample nsce = new NonStaticClassExample();
nsce.A a = nsce.new A();
4. non -static의 장점??
non-statuc을 통해서 캡슐화를 할 수 있음
캡슐화 :: 외부 기능과 관련된 기능을 내부 클래스로 분리하여 외부에 노출할 필요가 없는 구현 세부사항을 감출 수 있음
'자바 이론' 카테고리의 다른 글
| [JAVA] 배열과 리스트의 차이 toString() (0) | 2025.04.02 |
|---|---|
| [JAVA] 소수 찾는 로직 (0) | 2025.03.26 |
| [java]HttpServletRequest (0) | 2024.12.12 |