안드로이드 개발자의 창고
[7일차 Java] 중첩 클래스 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 중첩 클래스란?
- 클래스 안에 클래스를 만든 개념
- 클래스 내부의 클래스는 외부 클래스의 객체를 통해서 생성할 수 있다.
- 특정 클래스에 정의된 멤버를 자주 사용하는 경우 사용한다.
- 장점 : 내부 클래스에서 외부 클래스의 멤버를 사용하는 것이 자유롭다.
- 단점 : 내부 클래스의 객체를 생성하려면 반드시 외부 클래스의 객체를 생성해야 한다.
✔️ 일반 중첩 클래스 코드 및 해석
public class MainClass {
public static void main(String[] args) {
// 외부 클래스의 객체를 생성한다.
OuterClass1 out1 = new OuterClass1();
OuterClass1.InnerClass1 in1 = out1.new InnerClass1();
System.out.printf("in1 : %s\n", in1);
}
}
// 일반 중첩 클래스
class OuterClass1 {
int outerMemberA = 100;
public void outerMethodA() {
System.out.println("outerMethod!");
// 내부 클래스의 멤버를 사용한다.
System.out.printf("innerMemberA : %d\n", innerMemberA); <<< 불가능
innerMethodA(); <<< 불가능
}
class InnerClass1{
int innerMemberA = 200;
public void innerMethodA() {
System.out.println("innerMethod!");
}
public void innerMethodB() {
// 외부 클래스에 정의된 멤버를 사용한다.
System.out.printf("outerMemberA : %d\n", outerMemberA);
outerMethodA();
}
}
}
- OuterClass1.InnerClass1 in1 = out1.new InnerClass1();
- 위에서 생성된 외부 클래스(OuterClass1)의 객체(out1)을 통해 내부 클래스(InnerClass1)의 객체를 생성한다.
- System.out.printf("innerMemberA : %d\n", innerMemberA);
- 해당 코드가 있는 메서드는 외부 클래스(OuterClass1)의 메소드이다.
- 외부 클래스에서는 내부 클래스의 메서드나 변수를 사용할 수 없다.
- 오류가 발생한다.
📖 static 중첩 클래스
- 장점
- 모르겠다...
- 단점
- 내부 클래스가 외부 클래스의 멤버를 자유롭게 사용할 수 있다는 특징이 사라져버린다.
- 오로지 외부 클래스에 정의된 static 변수나 메서드만 사용이 가능하다.
✔️ Static 중첩 클래스 코드 및 해석
public class MainClass {
public static void main(String[] args) {
OuterClass2.InnerClass2 in2 = new OuterClass2.InnerClass2();
System.out.printf("in2 : %s\n", in2);
}
}
// static 중첩 클래스
class OuterClass2 {
static int outerMemberA = 200; // 외부 클래스에 정의된 static 변수
int outerMemberB = 300; // 외부 클래스에 정의된 멤버 변수
public void outerMethod1() {
// 내부 클래스의 static 멤버 사용
System.out.println(InnerClass2.innerMemberA); // 100
}
static class InnerClass2 {
static int innerMemberA = 100; // 내부 클래스에 정의된 static 변수
public void innerMethod1() {
System.out.println(outerMemberA); // 외부 클래스에 정의된 static 변수
// 외부 클래스에 정의된 멤버 변수
System.out.println(outerMemberB); <<< 불가능
}
}
}
- Main Class
- OuterClass2.InnerClass2 in2 = new OuterClass2.InnerClass2();
- static 중첩 클래스는 외부 클래스의 객체 없이 바로 생성이 가능하다.
- OuterClass2.InnerClass2 in2 = new OuterClass2.InnerClass2();
- OuterClass2
- System.out.println(InnerClass2.innerMemberA);
- innerMemberA는 내부 클래스(InnerClass2)의 멤버 변수이다.
- innerMemberA는 static을 사용한 변수이다.
- static을 사용하면 객체 생성 없이 바로 접근이 가능하다.
- 따라서 100이 출력된다.
- System.out.println(InnerClass2.innerMemberA);
- InnerClass2
- System.out.println(outerMemberA);
- outerMemberA는 외부 클래스(OuterClass2)의 멤버 변수이다.
- outerMemberA는 static을 사용한 변수이다.
- static을 사용하면 객체 생성 없이 바로 접근이 가능하다.
- 또한 내부 클래스는 외부 클래스의 변수나 메서드에 접근이 가능하다.
- 따라서 200이 출력된다.
- System.out.println(outerMemberB);
- outerMemberB는 외부 클래스(OuterClass2)의 멤버 변수이다.
- outerMemberB는 static을 사용하지 않은 멤버 변수이다.
- 내부 클래스(InnerClass2)는 static을 사용한 클래스이다.
- 내부 클래스에 static을 사용하게 되면 외부 클래스의 객체가 생성된다는 보장을 받지 못한다.
- 그러나 외부 클래스(OuterClass2)는 객체를 생성해야지만 접근할 수 있다.
- 따라서 외부 클래스의 멤버 변수나 메서드를 사용할 수 없다.
- 해당 코드는 오류가 발생한다.
- System.out.println(outerMemberA);
📖 지역 중첩 클래스
- 메서드 내부에 클래스를 작성하여 사용하는 클래스이다.
- 메서드의 수행이 끝나면 클래스가 메모리에서 사라지기 때문에 메서드 외부에서는 클래스를 사용할 수 없다.
- 내부 클래스는 class 파일 조차 생성되지 않는다.
- 장점
- 메서드에서 사용하는 클래스를 작성할 때 다른 곳에 작성하지 않고 바로 작성해 사용할 수 있다.
- 단점
- 메서드 내부에서만 사용이 가능하다.
✔️ 지역 중첩 클래스 코드 및 해석
class OuterClass3{
// 지역 중첩클래스 타입의 멤버변수 선언
InnerClass3 in30; <<< 불가능
public void outerMethod3() {
// 지역 중첩 클래스
class InnerClass3{
}
// 지역 중첩 클래스 객체 생성
InnerClass3 in3 = new InnerClass3();
System.out.println(in3);
}
// 다른 메서드에서 사용(불가)
public void outerMethod30(InnerClass3 in3) {
InnerClass3 in33;
}
}
- InnerClass3 in30;
- 내부 클래스(InnerClass3)는 메서드 내부에 작성되어 메서드가 종료되면 사라진다.
- 따라서 외부 클래스(OuterClass3)에서 내부 클래스 타입(InnerClass3)의 변수는 생성하지 못한다.
- public void outerMethod30(InnerClass3 in3) { ...
- 내부 클래스는 outerMethod3()의 내부에 선언되어져 있다.
- 따라서 outerMethod3()의 외부에서는 사용하지 못한다.
📖 익명 중첩 클래스
- 클래스의 이름이 없다는 뜻이다.
- 익명 중첩 클래스는 상속 관계의 클래스를 만드는 것이다.
- 특정 클래스를 상속받은 클래스를 만듦과 동시에 객체를 생성할 때 사용한다.
- 메서드를 overriding 하기 위해 주로 사용한다.
- 특정 클래스를 상속받은 클래스의 객체를 단 하나만 만들어 사용할 때 사용한다.
- 익명 클래스 파일은 이름이 없기 때문에 클래스 파일 이름이 1로 저장된다.
✔️ 익명 중첩 클래스 코드 및 해석
public class MainClass {
public static void main(String[] args) {
SuperClass100 s100 = new SuperClass100() {
public void superMethod100() {
System.out.println("overriding된 메서드");
}
};
s100.superMethod100(); // overriding된 메서드
}
}
// 익명 중첩 클래스
class SuperClass100 {
public void superMethod100() {
System.out.println("superMethod100");
}
}
- SuperClass100 s100 = new SuperClass100() { ... }
- SuperClass100을 상속받은 이름이 없는 클래스를 작성하고 필요한 메서드들을 overriding 한다.
- SuperClass100의 객체를 만든게 아니다.
- s100.superMethod100();
- 위에서 익명 클래스를 통해 오버라이딩된 메서드가 실행된다.
- 따라서 "overriding된 메서드"가 출력된다.
'Computer > Java' 카테고리의 다른 글
[7일차 Java] Interface(인터페이스) (0) | 2023.05.06 |
---|---|
[7일차 Java] Abstract (2) | 2023.05.06 |
[7일차 Java] final (0) | 2023.05.06 |
[7일차 Java] Static (0) | 2023.05.06 |
[6일차 Java] 캡슐화 (0) | 2023.05.05 |