Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- http
- 스프링
- db
- 스프링 핵심 기능
- SpringBoot
- pointcut
- 자바
- spring
- AOP
- 스프링 핵심 원리
- JDBC
- 김영한
- JPQL
- Spring Boot
- springdatajpa
- Servlet
- 백준
- Exception
- Proxy
- 그리디
- QueryDSL
- java
- Android
- 알고리즘
- kotlin
- transaction
- jpa
- 인프런
- Thymeleaf
- Greedy
Archives
- Today
- Total
개발자되기 프로젝트
익명 내부 클래스 활용 본문
1. 지역 내부 클래스
- 지역 변수와 같이 메서드 내부에서 정의하여 사용하는 클래스
- 메서드의 호출이 끝나면 메서드에 사용된 지역변수의 유효성은 사라짐
- 메서드 호출 이후에도 사용해야 하는 경우가 있을 수 있으므로
- 지역 내부 클래스에서 사용하는 외부 메서드의 지역 변수나 매개 변수는 final로 선언.
- 매개변수(i), 지역변수(num)를 지역 내부 클래스 메서드에서 값을 변경하려면 오류가 발생한다.
- 이는 메서드(getRunnerble)과 Local Inner Class의 생성 주기가 다르기 때문이다.
- 쉽게말해 getRunnerble()종료 후 Local Inner Class의 메서드(run)가 호출 될 여지가 있다.
- 매개변수(i), 지역변수(num)는 stack메모리에 올라가며, 메서드(getRunnerble) 종료 시 사라진다.
- 따라서 getRunnerble()이 종료되면 Stack에 있던 i, num은 메모리에서 사라진다.
- 이 때 Local Inner Class의 run()을 실행하는데, i와 num 을 변경하려고 하면 변경할 대상이 없다.
- 따라서 Local Inner Class에서 metod의 매개변수, 지역변수를 변경할 수 없다.
- 그러므로 지역 내부 클래스에서 사용하는 외부 메서드의 지역변수, 매개변수는 final로 선언해야 한다.
- final로 선언하면 Stack이 아니라 상수메모리에 올라가며 메서드 종료 후에도 사라지지 않는다.
- final로 선언 안하면 컴파일 시 final이 붙음 ㅋㅋㅋ
class Outer2{
int outNum = 100;
static int sNum = 200;
Runnable getRunnerble(final int i){ // 매개변수 i는 stack메모리에 올라감.메서드 종료되면 사라짐.
final int num = 10; //stack에 올라감. 메서드 종료되면 사라짐.
//Local Inner Class
class MyRunnable implements Runnable{
int localNum = 10;
@Override
public void run() {
//i = 50;
//num = 20;
System.out.println("i = "+ i);
System.out.println("num = " + num);
System.out.println("localNum = " + localNum);
System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)");
System.out.println("sNum = " + sNum + "(외부 클래스 static 변수)");
}
}
return new MyRunnable();
}
}
public class AnonymousInnerTest {
public static void main(String[] args) {
}
}
2. 익명 클래스
- 흠.. 위 코드르 ㄹ보면 MyRunnerble()은 내부에서 한 번만 사용한다.
- 굳이 이름이 있어야 하나???
- 이름이 없는 클래스
- 클래스의 이름을 생략하고 주로 하나의 인터페이스나 하나의 추상 클래스를 구현하여 반환
- 인터페이스나 추상 클래스 자료형의 변수에 직접 대입하여 클래스를 새엇ㅇ하거나
- 지역 내부 클래스의 메서드 내부에서 생성하여 반환할 수 있음.
- widget의 이벤트 핸들러에 활요오딤.
- 위 코드랑 무슨차이?
- 위 코드에서는 MyRunnerble클래스를 만들고 Runnerble을 구현한 뒤 MyRunnerble을 return함.
- 익명클래스는 바로 Runnerble을 생성&구현해 버린다. 즉 중간에 MyRunnerble 클래스가 없어짐.
class Outer2{
int outNum = 100;
static int sNum = 200;
Runnable getRunnerble(int i){ // 매개변수 i는 stack메모리에 올라감.메서드 종료되면 사라짐.
int num = 10; //stack에 올라감. 메서드 종료되면 사라짐.
//익명 클래스 예시 1
return new Runnable(){
int localNum = 10;
@Override
public void run() {
System.out.println("i = "+ i);
System.out.println("num = " + num);
System.out.println("localNum = " + localNum);
System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)");
System.out.println("sNum = " + sNum + "(외부 클래스 static 변수)");
}
}; //여기까지
}
//익명 클래스2
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("runnerble class 2");
}
}; //여기까지
}
public class AnonymousInnerTest {
public static void main(String[] args) {
Outer2 out = new Outer2();
Runnable runnerble = out.getRunnerble(100);
runnerble.run();
out.runnable.run();
}
}
i = 100
num = 10
localNum = 10
outNum = 100(외부 클래스 인스턴스 변수)
sNum = 200(외부 클래스 static 변수)
runnerble class 2
3. GitHub : 211026 Local Inner Class, AnonymousClass
'Java > 다양한 기능' 카테고리의 다른 글
객체지향 프로그래밍 vs 람다식 구현 (0) | 2021.10.27 |
---|---|
Stream (0) | 2021.10.27 |
함수형 인터페이스, 람다식 구현 및 사용 (0) | 2021.10.27 |
람다식 (0) | 2021.10.27 |
내부 클래스 정의, 유형 (0) | 2021.10.26 |
Comments