중첩 클래스: 클래스 내부에 선언된 클래스이지만 생성 시 다른 클래스들과 마찬가지로 바이트 코드(
~.class
) 가 만들어진다!
중첩 인터페이스: 클래스 내부에 선언된 인터페이스
static
키워드 없이 선언된 클래스로, 정적 필드와 정적 메소드는 선언 불가능class A {
class B { // instance inner class
B() {} // 생성자
int n; // 인스턴스 필드
void method() {} // 인스턴스 메소드
// static int sn; // static 필드 선언 불가능
// static void smethod() {} // static 메소드 선언 불가능
}
}
public class InnerClassTest {
public static void main(String[] args) {
A a = new A(); // B가 A 안에 있기 때문에 A부터 먼저 생성해줘야 한다
A.B b = a.new B();
b.method();
b.n = 10;
}
}
class C {
// static inner class
static class D {
D() {} // 생성자
int n; // 인스턴스 필드
void method() {} // 인스턴스 메소드
static int sn; // static 필드
static void smethod() {} // static 메소드
}
}
public class InnerClassTest {
public static void main(String[] args) {
C.D d = new C.D(); // static은 C부터 먼저 생성하지 않아도 됨
d.n = 10;
C.D.sn = 20;
C.D.smethod();
}
}
static
키워드 사용 불가능public class InnerClassTest {
// 로컬 클래스 - 밖에서는 쓸 수 없고 이 안에서만 쓸 수 있음
public static void func() {
class F {
F() {} // 생성자
int n; // 인스턴스 필드
void method() {} // 인스턴스 메소드
// static int sn; // static 필드 선언 불가능
// static void smethod() {} // static 메소드 선언 불가능
}
F f = new F();
f.method();
}
}
final
선언을 하지 않으면 매개 변수와 로컬 변수를 로컬 클래스에 사용 시 컴파일 에러final
선언을 하지 않아도 매개 변수와 로컬 변수가 자동으로 final
특성을 가진다.this
는 중첩 클래스 내부의 객체 참조바깥클래스명.this
를 사용해야 한다.interface DoubleClickable {
void idclick();
}
class Button { // 버튼 기능 구현
Clickable c;
DoubleClickable dc;
public void click() {
System.out.println("클릭");
if (c!=null) {
c.iclick();
}
}
public void doubleclick() {
if (dc!=null) {
dc.idclick();
}
}
public void addClickListener(Clickable c) {
this.c=c;
}
public void addDClickListener(DoubleClickable dc) {
this.dc=dc;
}
interface Clickable { // static 속성을 가짐
void iclick();
}
}
public class InterfaceExample2 {
public static void main(String[] args) {
Button libtn = new Button();
libtn.addClickListener(new Button.Clickable() {
@Override
public void iclick() {
System.out.println("로그인");
};
});
libtn.click();
Button joinbtn = new Button();
joinbtn.addClickListener(new Button.Clickable() {
@Override
public void iclick() {
System.out.println("회원가입");
}
});
joinbtn.click(); // 회원가입처리
}
}
익명 객체는 이름이 없는 객체
익명 객체의 특징
보통 자식 클래스를 재사용하지 않아 일회성으로 사용할 객체를 생성할 때 주로 사용!
중괄호({}
) 내부에는
익명 자식 객체 생성 시: 필드나 메소드 선언 또는 부모 클래스의 메소드를 오버라이딩 한다.
(⚠ 일반 클래스와 달리 생성자 선언 불가능!)
익명 구현 객체 생성 시: 추상 메소드의 실체 메소드를 작성하거나 인터페이스의 메소드를 오버라이딩 한다.
interface IBase {
void method();
}
abstract class CBase {
abstract void cmethod();
}
public class AnonymousTest {
public static void main(String[] args) {
IBase b = new IBase() { // 인터페이스를 상속받아서 새로운 클래스(익명 클래스)를 오버라이드하여 생성
@Override
public void method() {
System.out.println("구현 메소드");
}
};
b.method(); // 호출
CBase c = new CBase() {
@Override
void cmethod() {
System.out.println("추상 메소드도 똒같은겨?");
}
};
c.cmethod();
}
}
📌 그래서 개발할 때 테스트를 하는 것이 중요! 예외 처리는 최대한 개발 당시에 해 둬야 한다.
ClassNotFoundException
과 InterruptedException
등이 속한다.NullPointerException
과 ArrayIndexOutOfBoundsException
등이 속한다.