내부클래스와 익명클래스
내부클래스와_익명클래스
내부클래스
-
클래스 안에 또다른 클래스가 존재
-
그다지 많이 사용되지는 않음
-
두 클래스의 멤버에 쉽게 접근 가능함
-
그러나 로직이 복잡해지기 시작하면 오히려 꼬일 가능성 커짐..
// 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.)
클래스 안에 또다른 클래스가 존재
그다지 많이 사용되지는 않음
두 클래스의 멤버에 쉽게 접근 가능함
그러나 로직이 복잡해지기 시작하면 오히려 꼬일 가능성 커짐..
// 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
----
*/
- 외부참조의 단점
- 참조값을 담아야 해서 인스턴스 생성시 시간, 공간적 성능 하락
- 외부 인스턴스에 대한 참조가 존재하므로 gc가 인스턴스를 수거하지 못해 메모리 누수 발생 가능
// 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.)