본문 바로가기
얄코의 제대로 파는 자바/섹션6 클래스 더 알아보기

내부클래스

by 백엔드 개발자 2024. 4. 7.

 

 

 

 

  • 다른 클래스 안에 선언되는 클래스
  • 크게 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