- 다른 클래스 안에 선언되는 클래스
- 크게 4 종류가 있음
- 멤버 인스턴스
- 정적 내부 클래스
- 메소드 안에 정의된 클래스
- 익명 클래스 ( 다음 강 주제 )
멤버 인스턴스 클래스 와 내부 정적 클래스
// 💡 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);
}
}
- 두 클래스의 차이 : 인스턴스 필드,클래스를 사용할 수 있는지 없는지(정적 내부 메서드는 정적 필드만 사용가능)
내부클래스가 쓰이는 이유
- 보다 강력한 캡슐화
- 외부/내부 클래스간의 관계가 긴밀할 때 사용
- 2개의 클래스를 따로 작성하기보다 한 클래스를 외부클래스 안에 넣는게 더 효율적이겠다는 판단이 설때에 드문경우 사용된다.
- 적절히 사용시 유지보수가 용이하고 가독성을 높여줌
- 과하게 사용되면 클래스 비대화
정적 내부 클래스와 인스턴스 내부 클래스 예제
정적 내부 클래스
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);
}
}
}
public class Main {
YalcoChicken.LaunchTF launchTF1 = new YalcoChicken.LaunchTF("마산", "김영희");
YalcoChicken.LaunchTF launchTF2 = new YalcoChicken.LaunchTF("영월", "이철수");
YalcoChicken store1 = launchTF1.launch();
YalcoChicken store2 = launchTF2.launch();
}
- LaunchTF 정적 클래스는 static이므로 YalcoChicken.LaunchTF 이런식으로 사용 가능하다. 그래서 LaunchTF의 생성자를 사용해서 인스턴스를 생성.
- 내부 클래스가 static이다. 그래서 launchTF1, launthTF2는 정적요소가 아니고, LaunchTF라는 내부 클래스만 정적요소. (헷갈릴만한 부분..)
- launchTF1을 가지고 launch 생성자를 통해서 얄코치킨 클래스 생성.(launchTF1과 stroe1은 다른 객체)
인스턴스 내부 클래스
public class YalcoChicken {
private String name;
public YalcoChicken (String name) {
this.name = name;
}
// 매장마다의 기프트 - 매장에서 배부
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);
}
}
public class Main {
public static void main(String[] args) {
YalcoChicken.Gift [] gifts = {
store1.getGift("홍길동"),
store1.getGift("전우치"),
store2.getGift("옥동자")
};
}
}
- 인스턴스 내부 클래스라서 YalcoChicken.Gift 이런식으로 바로 접근이 불가능하다. 그래서 getGift라는 메서드로 인스턴스를 생성후 진행해야 한다.
외부에 클래스를 따로 두는 것보다 관리 용이성과 가독성이 높아짐 확인
- YalcoChickenLaunchTF, YalcoChickenGift를 따로 두어야 했다면?
출처
- 사이트, 검색명 (날짜)
'얄코의 제대로 파는 자바 > 섹션6 클래스 더 알아보기' 카테고리의 다른 글
열거형 (0) | 2024.04.17 |
---|---|
메인 메소드 (0) | 2024.04.15 |
익명클래스 (0) | 2024.04.08 |
패키지 (0) | 2024.04.02 |
블록과 스코프 (0) | 2024.03.24 |