JAVA

내부 클래스

사브나19 2022. 8. 28. 10:06

내부 클래스 (inner class)

원래 다른 클래스의 멤버를 쓰려면 객체 생성을 하여야 하는데 

내부 클래스면 객체 생성없이 A 멤버 사용 가능 

 

코드의 복잡성을 줄일 수 있다. (캡슐화)

내부 클래스를 3가지를 나눌 수 있다. 우리가 아는 변수의 특징과 비슷하다. 

iv == 인스턴스 클래스 

인스턴트 멤버처럼 다뤄진다. 

cv==스태틱 클래스 

static 멤버처럼 다뤄진다. 

lv== 지역 클래스 

지역 변수 처럼 메서드 안에서만 사용 

그리고 익명 클래스 ( 일회성으로 사용할 클래스 )

 

보통 클래스 앞에 접근 제어자로 default로 아무것도 붙이지 않거나 public을 붙이는 두 가지 형태 인다. 내부 클래스는 이 2가지뿐 아니라 private, protected, public, default 이렇게 4가지를 붙일 수 있다. 마치 변수처럼

Static 멤버를 가질 수 있는 것은 Static 내부 클래스 뿐이다. 

내가 만약 Static 멤버를 가져야한다면( 객체 생성 없이 사용 가능 ) 그걸 속한  클래스도 static 클래스여야 한다. 

인스턴스 클래스나 지역 클래스에서 static을 가질 수 없다. 

반면 static 클래스에서 iv를 사용할 수 있다. iv는 cv 가능하지만 cv가 iv 안된다. 

단 final static  멤버는 상수로 가정해서 인스턴스나 지역 클래스에서 멤버로 가질 수 있다. 

final은 보통 static을 많이 붙인다. 

private 멤버를 내부 클래스는 사용 가능하다. 

하지만 static 클래스에서 iv 접근은 안된다. cv  < iv  (iv는 가능하고 cv는 안된다)

내부 클래스에서 final 멤버는 사용 가능하지만 lv는 사용 안된다. 이유는 lv는 지역 메서드 안에 사용되고 소멸되는데  때로는 내부 클래스가 lv보다 오래 존재하기 때문에 그런 오류를 피하기 위해서 

 

* jdk1.8부터는 변수인데 안바뀌면 상수로 간주한다. 즉 final이라고 붙지 않아도 변하지 않으면 상수로 간주 

외부 클래스에서 내부 클래스를 호출할 때?

 

호출하고 싶은 내부클래스를 가지고 있는 그 외부 클래스의 객체를 만들고 호출하고자 하는 내부 클래스가 인스턴스 클래스 있으면 이 또한 객체를 만든다. 

예_ Outer oc= new Outer(); > 외부 클래스 객체 생성 

      Outer.InstatnceInner love= oc. new Instatncelneer();> 내부 클래스 객체 생성 

만약 호출하고자 하는 내부 클래스가 static일 경우 외부 객체 생성은 안해도 됨 

예_ Outer.statciinn si= new Outer.staticinn ();

 

익명 클래스 (annonymous class)

자기 이름이 없어서 조상 이름을 쓰거나 인터페이스 이름을 쓴다. 

이름이 없어 정의와 생성을 동시에 한다. 

ex_  new Object(){클래스 내용}

Object iv = new Object(){ void method(){}};

static Object iv = new Object(){void metheod(){}};

 

기존의 클래스를 익명 클래스를 바꾸고 싶으면 객체 생성하는 코드에 이름을 지우고 조상 이름이나 인터페이스 이름으로 바꾸고 객체 생성하는 공간에 클래스 내용{ }을 복사해서 붙여 넣으면 된다.