특정 클래스 내에 또 다른 클래스가 정의되는 것을 의미한다
이런 내부 클래스가 필요한 이유는 지금까지 작업해 왔던 클래스들과는 다르게 독립적이지는 않지만 하나의 멤버처럼 사용할 수 있는 특징이 있다
종류 | 설명 |
---|---|
Member | 멤버 변수나 멤버 메서드들과 같이 클래스가 정의된 경우에 사용 |
Local | 특정한 메서드 내에 클래스가 정의된 경우에 사용 |
Static | static 변수(클래스 변수)와 같이 클래스가 static으로 선언된 경우에 사용 |
Anonymous | 참조할 수 있는 이름이 없는 경우에 사용 |
메소드를 하나의 식으로 표현한 것
interface MyInterface{
//추상메서드
public abstract void make();
}
public class RamdaMain {
public static void main(String[] args) {
//익명내부클래스
MyInterface my = new MyInterface() {
//추상메서드 구현
@Override
public void make() {
System.out.println("익명 객체");
}
};
my.make();
System.out.println("-------------------");
/*
* 람다식은 익명함수(anonymous function)를 생성하기 위한 식
* 람다식의 형태는 매개 변수를 가진 코드 블럭이지만, 런타임 시에는
* 익명 구현 객체를 생성
* 람다식은 인터페이스의 익명 구현 객체를 생성
*
*/
//람다식을 사용하면 메모리에 익명 객체가 생성됨
MyInterface my2 = () -> {
System.out.println("람다식으로 표시");
};
my2.make();
}
}
익명 객체
-------------------
람다식으로 표시
프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미
//Thread 클래스를 상속해서 쓰레드 구현
public class ThreadMain01 extends Thread{
//Thread의 run 메서드 재정의
@Override
public void run() {
for(int i=0;i<10;i++) {
try {
sleep(1000);//지정된 시간만큼 수행을 멈춤
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.printf(
"쓰레드 이름 : %s,",currentThread().getName());
System.out.printf("temp value : %d%n",i);
}
}
public static void main(String[] args) {
ThreadMain01 th = new ThreadMain01();
//run()메서드를 직접 호출하게 되면 쓰레드 기능을 사용할 수 없음
//th.run();
th.start();// -> run()메서드 호출
}
}
쓰레드 이름 : Thread-0, temp value : 0
쓰레드 이름 : Thread-0, temp value : 1
쓰레드 이름 : Thread-0, temp value : 2
쓰레드 이름 : Thread-0, temp value : 3
쓰레드 이름 : Thread-0, temp value : 4
쓰레드 이름 : Thread-0, temp value : 5
쓰레드 이름 : Thread-0, temp value : 6
쓰레드 이름 : Thread-0, temp value : 7
쓰레드 이름 : Thread-0, temp value : 8
쓰레드 이름 : Thread-0, temp value : 9