자바 - 내부 클래스: 초보자의 가이드
안녕하세요, 자바 프로그래머를 꿈꾸고 계신 분들! 오늘은 자바에서의 내부 클래스의 흥미로운 세계에 빠지게 될 것입니다. 프로그래밍에 새로운 분이신 것을 걱정하지 마세요; 저는 수년 동안 수많은 학생들을 가르쳐 왔던 것처럼, 이 개념을 단계별로 안내해 드릴 것입니다. 그럼, 커피 한 잔 (또는 좋아하는 음료)을 들고, 함께 이 흥미로운 여정을 떠나보세요!
내부 클래스란 무엇인가요?
큰 장난감 상자(우리의 외부 클래스)에 속해 있던 작은 상자(우리의 내부 클래스)들을 상상해 보세요. 이것이 바로 자바에서의 내부 클래스의 본질입니다 - 클래스 안에 클래스가 들어 있습니다. 멋지지 않나요?
저희는 간단한 예제로 시작해보겠습니다:
public class ToyBox {
private String boxColor;
public ToyBox(String color) {
this.boxColor = color;
}
class Toy {
private String toyName;
public Toy(String name) {
this.toyName = name;
}
public void play() {
System.out.println(toyName + " 장난감을 " + boxColor + " 상자에서 놀아요!");
}
}
}
이 예제에서, ToyBox
는 우리의 외부 클래스이고, Toy
는 우리의 내부 클래스입니다. Toy
가 ToyBox
의 boxColor
를 직접 접근할 수 있었는지 봅시다? 이것이 내부 클래스의 슈퍼파워 중 하나입니다!
내부 클래스의 종류
장난감처럼 다양한 종류의 내부 클래스가 자바에 있습니다. 이제 그들을 탐험해보겠습니다:
1. 멤버 내부 클래스
이것은 가장 일반적인 내부 클래스입니다. 정상적인 장난감처럼 외부 클래스 안에 존재하는 것입니다.
public class OuterClass {
private int outerField = 10;
class InnerClass {
public void printOuterField() {
System.out.println("외부 필드 값: " + outerField);
}
}
}
이 내부 클래스를 사용하려면 다음과 같이 합니다:
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.printOuterField();
2. 정적 중첩 클래스
이것은 장난감 상자가 존재하지 않아도 독립적으로 존재할 수 있는 특별한 장난감과 같습니다.
public class OuterClass {
private static int staticOuterField = 20;
static class StaticNestedClass {
public void printStaticOuterField() {
System.out.println("정적 외부 필드 값: " + staticOuterField);
}
}
}
정적 중첩 클래스를 사용하는 것은 더 간단합니다:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
nestedObject.printStaticOuterField();
3. 지역 내부 클래스
특정 게임을 하면서만 존재하는 장난감과 같은 것이 지역 내부 클래스입니다!
public class OuterClass {
public void someMethod() {
final int localVar = 30;
class LocalInnerClass {
public void printLocalVar() {
System.out.println("지역 변수 값: " + localVar);
}
}
LocalInnerClass local = new LocalInnerClass();
local.printLocalVar();
}
}
4. 익명 내부 클래스
한 번 사용하는 장난감을 현场에서 만드는 것과 같은 익명 내부 클래스는 매우 편리합니다!
interface Playable {
void play();
}
public class OuterClass {
public void createAnonymousClass() {
Playable anonymousToy = new Playable() {
@Override
public void play() {
System.out.println("익명 장난감으로 놀아요!");
}
};
anonymousToy.play();
}
}
내부 클래스를 사용的理由
"이렇게 귀찮게 하는 이유가 무엇인가요? 별도의 클래스를 만들지 않고는 안 될까요?"라는 질문이 들릴 수 있습니다. 위대한 질문입니다! 여기 몇 가지 이유가 있습니다:
-
암호화: 내부 클래스는 외부 클래스의 private 멤버에 접근할 수 있습니다. 장난감에게 장난감 상자의 비밀 열쇠를 주는 것과 같아요!
-
코드 구성: 하나의 곳에서만 사용되는 클래스들을 그룹화하여 코드를 더 깔끔하고 조직적으로 만듭니다.
-
콜백 구현: 익명 내부 클래스는 이벤트 리스너와 콜백을 구현하는 데 아주 좋습니다.
실제 예제: 장난감 공장
이 지식을 실제로 더 복잡한 예제로 적용해보겠습니다:
public class ToyFactory {
private String factoryName;
public ToyFactory(String name) {
this.factoryName = name;
}
public interface Toy {
void play();
}
public class Car implements Toy {
@Override
public void play() {
System.out.println("브루무姆! " + factoryName + "에서 자동차를 운전하고 있어요");
}
}
public class Doll implements Toy {
@Override
public void play() {
System.out.println("안녕! 저는 " + factoryName + "에서 온 인형이에요");
}
}
public Toy createToy(String type) {
if (type.equalsIgnoreCase("car")) {
return new Car();
} else if (type.equalsIgnoreCase("doll")) {
return new Doll();
} else {
return new Toy() {
@Override
public void play() {
System.out.println("머스터리 장난감을 " + factoryName + "에서 놀아요");
}
};
}
}
public static void main(String[] args) {
ToyFactory factory = new ToyFactory("FunToys Inc.");
Toy car = factory.createToy("car");
Toy doll = factory.createToy("doll");
Toy mystery = factory.createToy("mystery");
car.play();
doll.play();
mystery.play();
}
}
이 예제에서는 ToyFactory
를 만들었는데, 다양한 종류의 장난감을 생산할 수 있습니다. Car
와 Doll
은 멤버 내부 클래스로, 머스터리 장난감은 익명 내부 클래스로 만들었습니다. Toy
인터페이스는 ToyFactory
내에 중첩된 인터페이스입니다.
이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:
브루무姆! FunToys Inc.에서 자동차를 운전하고 있어요
안녕! 저는 FunToys Inc.에서 온 인형이에요
머스터리 장난감을 FunToys Inc.에서 놀아요
내부 클래스가 이렇게 유연하고 조직된 구조를 만들어 줄 줄이야?
결론
자바에서의 내부 클래스는 코드 도구 상자에 비밀 구석처럼 존재합니다. 그들은 코드를 암호화하고 유연하게 구성할 수 있는 강력한 방법을 제공합니다. 자바 여정을 계속하면서, 내부 클래스가 코드를 더 깔끔하고 효율적으로 만들어 줄 많은 상황을 찾을 것입니다.
기억해요, 모든 프로그래밍 개념과 마찬가지로, 연습이 쌓이면 완벽해집니다. 자신만의 예제를 만들어보고, 다양한 종류의 내부 클래스를 실험해보며, 곧 전문가처럼 사용할 수 있을 거예요!
코딩을 즐기세요, 미래의 자바 마스터들! ?????
Credits: Image by storyset