공부블로그
내부 클래스 (Inner class) 본문
참고 사이트
배운 점
내부 클래스
목적) 클래스 내부 private으로 선언된 멤버에 접근할 수 있는 클래스를 정의할 경우 사용
특징
1. 내부 클래스는 외부 클래스의 멤버에 접근이 자유롭다.
2. 내부클래스는 외부클래스를 통해 생성된다. (static클래스 제외)
3. 접근 제어자( public, protected, defualt, private)다 사용 가능
종류
1. 인스턴스 내부 클래스 (== member)
- 외부 클래스의 static멤버를 참조만 할 수 있고 static 멤버 정의 불가능 ( 상수 final static만 가능)
- 외부 클래스의 인스턴스를 먼저 한 후 인스턴스를 생성한다.
ex) 외부 클래스 명.내부클래스 명 참조변수 명 = new 외부클래스 생성자.new 내부클래스 생성자
주의! 내부클래스의 인스턴스 메소드 안에서 내부클래스 인스턴스를 생성할 경우
인스턴스 메소드 자체가 인스턴스가 생성되어야 사용이 가능함.
따라서 이미 내부 클래스의 인스턴스가 생성된 상태라서 기존 생성방법으로 생성한다
public class Test_1 {
//인스턴스 내부 클래스
class InstanceInner{
void Method() {
System.out.println("인스턴스 내부 클래스 객체생성");
InstanceInner Obj= new InstanceInner();
}
static void StaticMethod() {
System.out.println("인스턴스 내부 클래스 객체생성");
//static 메소드에서는 외부 클래스의 객체 생성 후 내부클래스 인스턴스 생성
Test_1 test1_obj=new Test_1();
InstanceInner obj2=test1_obj.new InstanceInner();
}
}
}
//독립적인 클래스에서 인스턴스 내부클래스에 접근
class Test_1_access{
public void access() {
Test_1.InstanceInner obj3=new Test_1().new InstanceInner();
}
}
2. static 내부 클래스
- 내부 클래스에 static멤버가 있다? > static내부클래스로 정의!
- 외부 클래스의 인스턴스 멤버 사용 불가능 ( 사용하려면 객체 생성 후 접근해야함.)
- static 내부클래스 인스턴스 생성방법
생성시 static영역에 존재하기 때문에 굳이 외부 클래스를 생성하지 않아도 됨(최상위 클래스)
외부 클래스에서 생성 시: 내부 클래스 명 참조변수 명 =new 내부클래스 생성자;
독립된 클래스에서 생성 시: 외부클래스명.내부클래스명 참조변수명=new 외부클래스명.내부클래스생성자()
class outer{
//static 내부 클래스
static class StaticInner{ }
void InstanceMethod() {
StaticInner inner=new StaticInner();
}
}
//독립된 클래스에서 인스턴스 생성
public class Test_1_2 {
public static void main(String[] args) {
outer.StaticInner obj=new outer.StaticInner();
}
}
3. 지역 내부 클래스 (==Local)
- 메소드가 호출될 때 생성 가능. 메소드의 수행(호출)이 종료되면 지역변수처럼 자동소멸.
(메소드 내에서 생성)
- static멤버 정의 불가능 외부 클래스의 static멤버 사용 가능
- 지역클래스를 감싸는 메소드의 상수만 사용가능
JDK1.8이후 변수라도 이후 코드에서 값 변경이 없을 경우 상수 취급 따라서 지역변수(==상수)도 사용가능
- 반드시 Local 내부 클래스를 생성하는 문장은 내부클래스 정의 전에 올 수 없다.
4. 익명 내부 클래스 (==Anonymous)
- 일회용 클래스 선언과 객체 생성을 동시에 하는 잉름이 없는 클래스
- 주로 gui의 이벤트 리스러에서 많이 사용함!
- 참조변수가 없는 유형: 주로 특정 메소드를 호출될 때 자동적으로 수행되도록 함.
참조변수가 있는 유형: 참조변수를 통해 정의 된 영역내에서 여러번 참조 가능함.
interface TestInter{
public static final int data=1000;
public abstract void printData(); //이 추상메소드를 사용할 건데 딱 한번만 사용할거라 클래스를 일회적으로 만들고 싶다!
}
public class AnonyInner {
public void test() {
new TestInter() { //인터페이스로 인스턴스 생성이 아니라 TestInter를 구현하는 익명 클래스 생성!!!!
public void printData() {// TestInter인터페이스의 추상메소드 구현
System.out.println("data:"+data);
}
}.printData(); //잠시 인터페이스를 구현하는 클래스를 생성해 일회적으로 메소드를 사용함.
}
public static void main(String[] args) {
AnonyInner ai=new AnonyInner();
ai.test();
new AnonyInner().test();//익명으로 클래스를 생성한다
}
}
abstract class TestAbst{
int data=1000;
public abstract void printData();
}
public class AnonyInner1 {
// 추상클래스가 참조변수 타입이다!? == 해당 추상 클래스를 상속하는 클래스가 다 들어갈 수 있다.
TestAbst inn =new TestAbst(){ //추상 클래스로 인스턴스 생성이 아니라 추상클래스를 상속하는 클래스를 임시적으로 만든 것!
public void printData() {
System.out.println("data:"+data);
}
};
public static void main(String[] args) {
AnonyInner1 ai =new AnonyInner1();
ai.inn.printData();
}
}
'IT > JAVA' 카테고리의 다른 글
예외(Exception)_2 (0) | 2022.02.17 |
---|---|
예외 (Exception)_1 (0) | 2022.02.15 |
인터페이스 (0) | 2022.01.27 |
추상 클래스 (0) | 2022.01.25 |
다형성(2) (0) | 2022.01.25 |