📁 ex01
☕ Outer.java
public class Outer {
private String inst = "인스턴스";
private static String sttc = "클래스";
// 💡 1. 멤버 인스턴스 클래스
class InnerInstMember {
// ⭐️ 외부 클래스의 필드와 클래스 접근 가능
private String name = inst + " 필드로서의 클래스";
private InnerSttcMember innerSttcMember = new InnerSttcMember();
public void func () {
System.out.println(name);
}
}
// 💡 2. 정적(클래스) 내부 클래스
// ⭐️ 내부 클래스에도 접근자 사용 가능. private으로 바꿔 볼 것
public static class InnerSttcMember {
// ⭐️ 외부 클래스의 클래스 필드만 접근 가능
private String name = sttc + " 필드로서의 클래스";
// ⚠️ static이 아닌 멤버 인스턴스 클래스에도 접근 불가!
// private InnerInstMember innerInstMember = new InnerInstMember();
public void func () {
// ⚠️ 인스턴스 메소드지만 클래스가 정적(클래스의)이므로 인스턴스 필드 접근 불가
// name += inst;
System.out.println(name);
}
}
public void memberFunc () {
// 💡 3. 메소드 안에 정의된 클래스
// 스코프가 메소드 내로 제한됨
class MethodMember {
// 외부의 필드와 클래스에 접근은 가능
String instSttc = inst + " " + sttc;
InnerInstMember innerInstMember = new InnerInstMember();
InnerSttcMember innerSttcMember = new InnerSttcMember();
public void func () {
innerInstMember.func();
innerSttcMember.func();
System.out.println("메소드 안의 클래스");
// new Outer().memberFunc(); // ⚠️ 스택오버플로우 에러!!
}
}
new MethodMember().func();
}
public void innerFuncs () {
new InnerInstMember().func();
new InnerSttcMember().func();
}
public InnerInstMember getInnerInstMember () {
return new InnerInstMember();
}
}
☕ Main.java
// ⭐️ 클래스가 클래스 필드인 것 - 아래의 변수는 인스턴스
Outer.InnerSttcMember staticMember = new Outer.InnerSttcMember();
staticMember.func();
System.out.println("\\n- - - - -\\n");
Outer outer = new Outer();
outer.innerFuncs();
System.out.println("\\n- - - - -\\n");
// ⚠️ 아래와 같은 사용은 불가
// Outer.InnerInstMember innerInstMember = new outer.InnerInstMember();
// 💡 인스턴스 내부 클래스는 이렇게 얻을 수 있음
Outer.InnerInstMember innerInstMember = outer.getInnerInstMember();
innerInstMember.func();
System.out.println("\\n- - - - -\\n");
outer.memberFunc();
📁 ex02
☕ YalcoChicken.java
public class YalcoChicken {
private String name;
public YalcoChicken (String name) {
this.name = name;
}
// 매장신설 TF팀 - 본사에서 창설
public static class LaunchTF {
private String title;
private String leader;
public LaunchTF(String title, String leader) {
this.title = title;
this.leader = leader;
}
public YalcoChicken launch () {
// ⚠️ 인스턴스 필드는 사용 불가
// System.out.println(this.name);
return new YalcoChicken(title);
}
}
// 매장마다의 기프트 - 매장에서 배부
class Gift {
private String message;
public Gift(String to) {
this.message = "From 얄코치킨 %s점 to %s님"
.formatted(name, to);
}
}
public Gift getGift (String to) {
return new Gift(to);
}
}
☕ Main.java
YalcoChicken.LaunchTF launchTF1 = new YalcoChicken.LaunchTF("마산", "김영희");
YalcoChicken.LaunchTF launchTF2 = new YalcoChicken.LaunchTF("영월", "이철수");
YalcoChicken store1 = launchTF1.launch();
YalcoChicken store2 = launchTF2.launch();
YalcoChicken.Gift [] gifts = {
store1.getGift("홍길동"),
store1.getGift("전우치"),
store2.getGift("옥동자")
};
YalcoChickenLaunchTF
, YalcoChickenGift
를 따로 두어야 했다면?