- 많이 쓰이진 않음. but 안드로이드에서는 많이 씀
1. 내부클래스(inner class)
1) 정의
- 클래스 안에 선언된 클래스
- GUI 어플리케이션(AWT, Swing)의 이벤트 처리에 주로 사용됨.
2) 형식
- 자료형을 정의하는 자리 혹은 매개변수가 들어가는 자리에 들어감.
class Outer{
private int a;
class Inner{
}
}
3) 장점
- 내부 클래스에서 외부 클래스의 멤버변수들을 쉽게 접근할 수 있다.
(반대는 안됨)
- 코드의 복잡성을 줄일 수 있다.
4) 단점
- 코드의 재사용이 어려움.
2. 무명 내부클래스
1) 이벤트 처리 등 1회성으로 사용하는 간단한 코드에 자주 사용
예)
e.addWindowListener( new WindowAdapter(){
public void windowClosing(windowEvent e){
System.exit(0);
}
});
2)
new 클래스이름(){}
혹은
new 인터페이스이름(){}
- 원래 인터페이스는 new를 못함
3) 이름이 없으므로 재사용할 수 없다.
3. 예제
public class OuterClass{ //외부클래스
static int x=10;
class Inner(){ //내부클래스
int getX(){
//외부클래스의 멤버변수인 x를 자유롭게 사용함
return x;
}
} //end of class Inner
public static void main(String[] args){
//변수 x는 static이므로 new없이 바로 사용가능.
//프로그램 시작과 동시에 이미 메모리에 올라가 있음.
System.out.println(x);
//외부 클래스 인스턴스 생성
OuterClass e = new OuterClass();
//내부 클래스 인스턴스 생성
//(‘외부클래스.내부클래스’로 접근해야 함)
OuterClass.Inner in = e.new Inner();
System.out.println(in.getX());
}
}//end of class OuterClass
1) 내부클래스를 쓰려면 위의 예제와 같이 외부클래스의 인스턴스를 생성 후 내부클래스의 인스턴스를 생성해야 한다.
그러나
외부클래스의 참조변수 없이도 생성 가능한 방법이 있다. (이 방법을 많이 쓴다.)
OuterClass.Inner in = new OuterClass.Inner();
2) 메소드 안에 내부클래스가 있는 경우
public class InnerFinal{
int x = 10;
void print(){
int y=20;
class Inner{ //메소드 내부에 선언된 클래스
void test(){
//멤버변수인 x는 마음대로 사용가능
System.out.println(x);
//지역변수인y도 JDK버전 1.8부터 에러 아님.
//JDK 1.7버전까지는 y 앞에 final을 붙여야 함.
System.out.println(y);
} //end of test()
}//end of Inner class
}//end of print()
}//end of InnerFinal class
3) 인터페이스를 이용한 무명내부클래스 예제
//인터페이스 : 추상메소드 + 상수
public interface Flyer{
public static final int MAX=100;
public void takeoff();
public void fly();
public void land();
//public static void methodA(){
//}
//public default void methodB(){
//}
}
public class InnerUse{
public static void main(String[] args){
//인터페이스는 new를 만들 수 없다.
//그런데...
Flyer f=new Flyer(){
@Override
public void takeoff(){
System.out.println(“날아올라”);
};
@Override
public void fly(){
System.out.println(“날다”);
};
@Override
public void land();
System.out.println(“착륙”);
};
}//end of f
} //end of main
인터페이스에서 추상메소드 선언 시 중괄호{}를 쓰면 안된다.
중괄호를 쓴다면 안에 아무 것도 코딩되어 있지 않더라도 코딩한 것으로 간주하기 때문에 더 이상 추상메소드가 아니기 때문이다.
다만,
JDK버전이 올라감에 따라 JDK1.8부터는
메소드에 static이나 default를 쓰면 중괄호를 써도 된다.
Tip :
F3 -> 클래스 소스코드 보기
F4 -> 클래스 계층구조 보기
'공부방 > 자바프로그래밍' 카테고리의 다른 글
유용한 클래스들 – 래퍼(Wrapper) 클래스 (0) | 2021.02.02 |
---|---|
자바 유용한 클래스들 – Math, Calendar, Arrays, Random 클래스 (0) | 2020.11.02 |
자바 유용한 클래스들 - String 클래스 (0) | 2020.10.08 |
자바 유용한 클래스들 - Object 클래스 (0) | 2020.09.22 |
자바 인터페이스 (0) | 2020.08.31 |
자바 추상화 (0) | 2020.08.23 |
자바 다형성 (0) | 2020.08.12 |
자바 final (0) | 2020.08.07 |
댓글