- 전체
- JAVA 일반
- JAVA 수학
- JAVA 그래픽
- JAVA 자료구조
- JAVA 인공지능
- JAVA 인터넷
- Java Framework
- Java GUI (AWT,SWING,SWT,JFACE)
- SWT and RCP (web RAP/RWT)[eclipse], EMF
JAVA 일반 Java Inner class 자바 중첩(내부)클래스
2015.03.03 12:51
<4대 중첩 클래스(내부 클래스)>
2. 4대 중첩 클래스별 사용법.
[출처] http://dkatlf900.tistory.com/49
내부 클래스(inner class) 라 하는 것에는 4종류가 있다. 구분하는 법은 변수의 선언위치에 따른 종류와 같다.내부 클래스의 유효범위 와 성질도 우리가 잘아는 변수 와 유사하여 금방 이해 될 것이다.
1.내부 클래스(inner class)라 불리는 4가지.
내부 클래스 라는 것은 내가 만든 클래스(Class)블록 안에 또 다른 클래스(Class)를 만든
다는 것이다. 이것들을 다 내부 클래스(inner class)라 하며 어느 위치에 만들 것이냐 에
따라 4가지 종류로 나뉜다고 보면 된다.
1.내부 클래스 에서 외부 클래스의 변수들을 사용할수있다. (단, static변수 , 인스턴스 변수 의 규칙이 우선이다.)
2.내부 클래스에서는 접근 제어자 private, protected,public 들을 사용할수 있다. 내부클래스는 외부 클래스 에서 보기에 외부클래스의 멤버(변수,함수) 처럼 취급한다.
1) 중첩 클래스 또는 인스턴스 클래스(instance class)
instance class라 말하는 것 처럼 인스턴스 변수처럼 사용 된다.
class Test{ int a=10;
class Joo{
int b=20;
public void joo(){
System.out.println("Joo 클래스가 InstanceClass 입니다.");
}
}
public static void main(String[] args){
Test t=new Test();
Test.Joo j=t.new Joo();
j.joo();
}
}
Joo 클래스가 인스턴스 클래스 이며, 인스턴스 변수 위치에 있다.
또한 인스턴스 클래스 안의 joo() 를 실행 하기 위해 인스턴스 클래스에 접근 하기 위해선,
외부 클래스(Test) 객체를 먼저 생성후에 Test.Joo j=t.new Joo(); 라는 문법을 통해
외부 클래스(Test) 안에 Joo 라는 인스턴스 내부 클래스가 있다 라고 해줘야 한다.
2) 정적 중첩 클래스 또는 스태틱 클래스(static class)
인스턴스 변수 규칙 대신 static 변수의 규칙을 사용 하는 내부 클래스라 생각하자.
class Test{
int a=10;
static class Joo{
int b=20;
static int c=30;
public void joo(){
System.out.println("Joo 클래스가 static class 입니다.");
}
}
public static void main(String[] args){
Test.Joo j=new Test.Joo();
j.joo();
System.out.println("static 변수:"+ Test.Joo.c);
}
}
static 내부 클래스는 class 앞에 static이 붙고 static 변수와 규칙이 유사 하다 보면된다.
static 내부 클래스 의 객체를 생성할때
외부 클래스의
인스턴스를 Test t=new Test(); 생성하지 않아도 된다. 또한, static 내부 클래스의
객체
생성할때는 t.new Joo();가
아닌 new
Test.Joo(); 로
할수있다.
3) 지역 중첩 클래스 또는 지역 클래스(local class)
외부 클래스의 메서드나 초기화 블럭 안에 선언되며 지역 변수 규칙을 사용한다.
class Test{
void joo(){
final int g=300;
class LocalJoo{
public void hoo(){
System.out.println("LocalJoo 클래스는 지역 클래스 입니다.");
System.out.println("g:"+ g);
}
}
System.out.println("이것은 joo() 메서드입니다");
LocalJoo lo= new LocalJoo();
lo.hoo();
}
public static void main(String[] args){
Test.Joo j=new Test.Joo();
j.joo();
System.out.println("static 변수:"+ Test.Joo.c);
}
}
지역변수 처럼 joo() 메서드 안에 선언되며 지역 클래스는 외부 클래스의 인스턴스 변수,static 변수 를 모두 사용할수 있고,지역 클래스가 포함된 메서드에 정의된 지역 변수도 사용 가능하다. 단 final 이 붙은 지역 변수만 사용 가능하다.
그 이유는 joo() 메서드가 수행을 끝내어 지역 변수가 소멸되었더라도 지역 클래스의 인스턴스가
소멸된 지역변수를 참조하려는 경우가 발생할수 있기때문이다.
4) 익명 중첩 클래스 또는 익명 클래스(anonymous class)
익명 클래스는 지역 클래스의 변형이라고 할 수도 있다.익명클래스는 class라는 예약어와
클래스명을 가지지 않고, 단지 instance의 생성과 내용부의 정의만 가진다.
지역 클래스 처럼 소속되어있는 메서드의 멤버변수등을 사용하기 위해선 변수명 앞에
final 이 붙어 있어야 한다.또한 기존 클래스의 특정 메소드를 오버라이딩 하여 재정의 할
수 있다.
class AnonymousTest{
public void abc(){
System.out.println("Test2 클래스의 abc() 메서드 입니다.");
}
}
}
class Test{
void joo(){
AnonymousTest at=new AnonymousTest(){
public void abc(){
System.out.println("AnonymousTest 클래스의 오버라이딩한 abc() 메서드");
}
};
at.abc();
}
public static void main(String[] args){
Test a=new Test();
a.joo();
System.out.println(" main() 메서드 입니다.");
}
}
익명 클래스는 문법적으로 생소한 부분이 많다.
AnonymousTest at=new AnonymousTest(){ //여기 메서드입력 }; 와 같이 객체 생성후에 { }; 블록이 있고 블록 끝에는 " ; " 세미콜론이 붙는다. 익명 클래스는 일회용으로 코드를 짧게 쓰는등의 일을 하며 , 안드로이드 어플 만들기등에서 쓰이는 java 코드에서 이벤트 처리,쓰레드등을 할때 너무너무 자주 나올 정도로 중요한 것이 익명클래스이며 내부클래스 모두가 중요하다. new AnonymousTest(){ } 여기서 블록안에는 이미 존재하는 클래스의 메서드를 오버라이딩 하고싶을때 위에처럼 재정의 해주면 되며,
간단하게 안드로이드에서는 어떻게 쓰이는지 소스를 한번 보자.이벤트 처리 소스이다.
public class HandleEvent extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
View vm=new View(this);
vm.setOnTouchListener(new View.OnTouchListener(){
public boolean onTouch(View v,MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
Toast.makeText(HandleEvent.this, "Touch Event Received",
Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
setContentView(vm);
}
}
이 소스는 이벤트 처리 관련 소스로 안드로이드에서는 흔히 쓰이게 되는 내부클래스 중 익명클래스 이다.vm.setOnTouchListener(new View.OnTouchListener(){//오버라이딩 } 이 부분은
메서드 호출할때 호출안에 익명클래스를 통째로 처리하여 소스코드를 줄인 방법이다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

