티스토리 뷰
Goal
- 내부 클래스에 대해 알아본다
- 내부 클래스를 코드로 구현해본다.
1. 내부 클래스란?
- 클래스 내부에 구현한 클래스 (중첩된 클래스)
- 클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스
- 주로 외부 클래스 생성자에서 내부 클래스를 생성
2. 내부 클래스 구현
2-1 인스턴스 내부 클래스 & 정적 내부 클래스
- 클래스를 인스턴스 또는 static으로 사용하는 방식
class OutClass{
private int num = 10;
private static int sNum = 20;
private InClass inClass;
public OutClass(){
inClass = new InClass();
}
//인스턴스 내부 클래스 (보통 private로 선언한다)
class InClass{
int iNum = 100;
void inTest() {
System.out.println(num);
System.out.println(sNum);
}
/* static int sInNum = 200;
* 인스턴스 내부 클래스는 클래스 생성 이후에 class의 맴버를 사용할 수 있기 때문에
* 언제나 사용 가능한 static 변수를 선언할 수 없다.
*/
}
public void usingInner() {
InClass.inTest();
}
//정적 내부 클래스
static class InstaticClass{
int inNum = 100;
static int sInNum = 200;
void inTest() {
System.out.println(inNum);
System.out.println(sInNum);
System.out.println(sNum);
}
static void sTest() {
// System.out.println(inNum); static 메서드에서는 인스턴스 변수인 inNum은 사용할 수 없다.
System.out.println(sInNum);
System.out.println(sNum);
}
}
}
public class InnerTest {
public static void main(String[] args) {
//OutClass 생성과 동시에 inClass도 생성됨.
OutClass outClass = new OutClass();
outClass.usingInner();
//InClass는 인스턴스 클래스이기 때문에 OutClass. 으로 불러와야 한다.
//외부 클래스는 언제나 static이기 때문에 OutClass처럼 사용할 수 있다.
OutClass.InClass myInClass = OutClass.new InClass();
myInClass.inTest();
System.out.println();
OutClass.InstaticClass sInClass = new OutClass.InstaticClass();
OutClass.InstaticClass.sTest();
sInClass.inTest();
}
}
2-2 지역 내부 클래스
- 매서드 내부에 구현
- 지역 내부 클래스에 선언된 맴버변수는 지역 내부 클래스를 담는 메서드의 맴버변수에 비해 생명 주기가 길어, 메서드의 맴버변수가 상수화된다. 따라서 지역 내부 클래스 안에서는 외부 메서드의 맴버변수를 참조할 수 있지만 변경할 수는 없다.
package innerclass;
class Outer {
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i) {
int num = 100;
//지역 내부 클래스
class MyRunnable implements Runnable {
public void run() {
// num += 10; 상수(final)로 선언되기 때문에 참조는 할 수 있지만 변경은 할 수 없음
// i = 200;
System.out.println(i);
System.out.println(num);
System.out.println(outNum);
System.out.println(Outer.sNum);
}
}
return new MyRunnable();
}
}
public class LocalInnerClassTest {
public static void main(String[] args) {
Outer outer = new Outer();
Runnable runnable = outer.getRunnable(50);
runnable.run();
}
}
2-3 익명 내부 클래스
- 안드로이드 위젯 기능구현에서 많이 사용하는 방식
- 일반적으로 클래스를 선언할 때 작성하는 class코드나 클래스명이 없기 때문에, '익명' 클래스라고 불림.
- 클래스의 정의 할때 인스턴스를 바로 생성하는 코드를 작성하기 때문에 static과 비슷한 작동방식으로 사용할 수 있음.
package innerclass;
class Outer2 {
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i) {
int num = 100;
//익명 이너 클래스
return new Runnable(){
public void run() {
// num += 10; 상수(final)로 선언되기 때문에 참조는 할 수 있지만 변경은 할 수 없음
// i = 200;
System.out.println(i);
System.out.println(num);
System.out.println(outNum);
System.out.println(Outer.sNum);
}
};
}
//익명 이너 클래스 2
//인스턴스 생성과 정의를 같이함.
Runnable runner = new Runnable() {
@Override
public void run() {
System.out.println("test");
}
};
}
public class AnonymousInnerClassTest {
public static void main(String[] args) {
Outer2 outer = new Outer2();
outer.runner.run(); //인스턴스지만 클래스 내부에서 생성되기 때문에 바로 사용할 수 있다.
Runnable runnable = outer.getRunnable(50);
runnable.run();
}
}
'Java > Java 올인원 패키지' 카테고리의 다른 글
29. 스트림 (Java) (0) | 2020.03.23 |
---|---|
28. 람다식 (Java) (0) | 2020.03.23 |
25. Set 인터페이스 (Java) (0) | 2020.03.19 |
24. List 인터페이스 (Java) (0) | 2020.03.19 |
23. 컬렉션 프레임워크 (Java) (0) | 2020.03.19 |
댓글
최근에 올라온 글
최근에 달린 댓글
TAG
- 20200429
- 20200415
- 20200317
- 20200504
- chapter8
- 20200417
- 20200804
- 20200425
- 20200424
- 20200512
- 생활코딩리눅스
- 20200622
- 20200624
- 20200510
- 20200319
- 20200503
- 20200427
- 20200420
- 20200330
- 20200421
- likelion
- 20200428
- 20200403
- 20200406
- 20200502
- 20200413
- chapter7
- 20201204
- 백준
- 20200423
- Total
- Today
- Yesterday