내부클래스와 익명클래스
내부클래스와_익명클래스
내부클래스
-
클래스 안에 또다른 클래스가 존재
-
그다지 많이 사용되지는 않음
-
두 클래스의 멤버에 쉽게 접근 가능함
-
그러나 로직이 복잡해지기 시작하면 오히려 꼬일 가능성 커짐..
// outerclass
package Inner;
public class OuterClass {
int num = 10;
String str1 = "java";
static String str2 = "world";
public OuterClass() {
System.out.println("this is OuterClass");
}
class InnerClass {
int num = 20;
// 이런식으로 바깥 클래스의 데이터를사용 가능
String str3 = str1;
public InnerClass() {
System.out.println("this is InnerClass");
}
}
static class SInnerClass {
int num = 30;
// 이런식으로 바깥 클래스의 데이터를사용 가능
String str4 = str2;
public SInnerClass() {
System.out.println("this is static InnerClass");
}
}
}
// main
package Inner;
public class MainClass {
public static void main(String[] args) {
OuterClass oc = new OuterClass();
System.out.println("outer class num = " + oc.num);
System.out.println("outer class str1 = " + oc.str1);
System.out.println(" ---- ");
// 도트노테이션으로 이너클래스에 접근
// 비정적 중첩 클래스는 바깥 클래스의 객체를 통해 객체를 만들어야함
// in은 oc에 대한 '숨은 외부 참조'를 갖게 됨
// 따라서 클래스 안에서 this. 를통해 바깥 클래스의 요소에 접근 가능
OuterClass.InnerClass in = oc.new InnerClass();
System.out.println("inner class num = " + in.num);
System.out.println("inner class num = " + in.str3);
System.out.println(" ---- ");
// 정적 중첩 클래스는 바깥 클래스의 객체가 없어도 객체를 생성할 수 있음
// 정적 중첩 클래스는 외부 인스턴스 없이 생성 가능하므로 '외부 참조'가 존재하지 않음
// 따라서 클래스 안에서 this. 를 통해 바깥 클래스의 요소에 접근할 수 없다.
OuterClass.SInnerClass sin = new OuterClass.SInnerClass();
System.out.println("static inner class num = " + sin.num);
System.out.println("static inner class num = " + sin.str4);
System.out.println(" ---- ");
}
}
/*
결과
this is OuterClass
outer class num = 10
outer class str1 = java
----
this is InnerClass
inner class num = 20
inner class num = java
----
this is static InnerClass
static inner class num = 30
static inner class num = world
----
*/
- 외부 참조로 인한 단점때문에 내부 클래스를 만들게 된다면 가능한 static으로 만들어야 함
- 외부참조의 단점
- 참조값을 담아야 해서 인스턴스 생성시 시간, 공간적 성능 하락
- 외부 인스턴스에 대한 참조가 존재하므로 gc가 인스턴스를 수거하지 못해 메모리 누수 발생 가능
- 외부참조의 단점
익명클래스
- 이름이 없는 클래스로 주로 메서드를 재정의(override) 하는 목적으로 사용
- 익명클래스는 인터페이스나 추상클래스에서 주로 사용
// ananymousclass
package Inner;
public class AnonymousClass {
public AnonymousClass() {
System.out.println("this is anonymousclass");
}
public void method() {
System.out.println("this is anonymousclass's original method");
}
}
// main
package Inner;
public class MainClass {
public static void main(String[] args) {
// 익명클래스
// 이름이 없다. 따라서 한번만 사용하고 버려짐
new AnonymousClass() {
@Override
public void method() {
System.out.println("this is override");
};
}.method();
// 재정의한 메서드를 바로 사용
}
}
/*
결과
this is anonymousclass
this is override
*/
// 오버라이드한 결과가 출력됨을 알 수 있다.
Author And Source
이 문제에 관하여(내부클래스와 익명클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jajubal/내부클래스와-익명클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)