이펙티브 자바아이템 24

한주영·2023년 12월 7일
0

이펙티브자바

목록 보기
18/33

맴버클래스는 되도록 static으로 만들라

중첩 클래스

1)다른클래스 안에 정의된 클래스
2)바깥클래스에서만 쓰여야함
3)종류: 정적멤버, (비정적)멤버, 익명,지역 클래스

정적맴버 클래스를 제외한 나머지 클래스는 내부클래스 이다.

1.정적 멤버클래스

•클래스 내부에 static으로 선언된 클래스
•다른클래스안에 선언되고,바깥클래스의 private맴버에도 접근가능
•private으로 선언하면 바깥클래스에서만 접근할수있는 방식

public class OuterClass {
   
  //정적 맴버 클래스 선언
   public static class StaticMemberClass {
       
       // 변수
       private static int staticMemberVariable = 10;
       
       // 메서드
       public static void printStaticMember() {
           System.out.println("정적맴버변수 값: " + staticMemberVariable);
       }
   }
   
   
   private int nonStaticMemberVariable = 20;
   
   
   public void printNonStaticMember() {
       System.out.println("비정적맴버변수값: " + nonStaticMemberVariable);
   }
   
   public static void main(String[] args) {
       
       OuterClass.StaticMemberClass.printStaticMember();
       OuterClass outerInstance = new OuterClass();
       outerInstance.printNonStaticMember();
   }
}
  1. 비정적 멤버 클래스
    •static이 붙지 않은 클래스
    •인스턴스 메서드에서 정규화된 this를 사용해 바깥인스턴스의 메서드를 호출 하거나 바깥 인스턴스의 참조를 가져올수 있음
    •정규화된 this-> 클래스.this형태로 클래스의 이름을 명시하는 용법을 의미
    •어댑터를 정의할때 자주쓰임
    •Set,List같은 컬렉션인터페이스 구현들도 자신의 반복자를 구현할때 비정적을 주로 사용

맴버클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 staitc을 붙여서 정적 맴버 클래스로 만들자
•static을 생략하면 바깥인스턴스로의 숨은 외부 참조를 갖게된다
•이 참조를 저장하려면 시간과 공간이 소비되고,더심각한 문제는 가비지 컬렉션이 바깥클래스의 인스턴스를 수거지하못해 메모리 누수가 발생

public class OuterClass {

   //비정적 맴버클래스
   public class NonStaticMemberClass {

       //변수
       private int nonStaticMemberVariable = 30;

       // 메서드
       public void printNonStaticMember() {
      
           System.out.println("비정적맴버변수: " + nonStaticMemberVariable);
       }
   }
 private static int staticMemberVariable = 40;

   public static void printStaticMember() {
       System.out.println("정적맴버변수: " + staticMemberVariable);
   }

   public static void main(String[] args) {
       
       OuterClass outerInstance = new OuterClass();
       OuterClass.NonStaticMemberClass nonStaticInstance = outerInstance.new NonStaticMemberClass();
       
       nonStaticInstance.printNonStaticMember();
       outerInstance.printStaticMember();
   }
}
  1. 익명클래스
    •이름이없는 클래스
    •멤버와달리 쓰이스는 시점에 선언과 동시에 인스턴스가 생성
    •비정적인 문맥에서 사용될때만 바깥클래스의 인스턴스를 참조할수있음

    package com.example.java;
    interface Hello {
       void hi();
    }public class AnonymousClassExample {
    
       public static void main(String[] args) {
       Hello hello = new Hello() {
               @Override
               public void hi() {
                   System.out.println("익명클래스!");
               }
    
           };
    
           //익명클래스의 메서드 호출
          hello.hi();
       }
    }
    ``
  1. 지역클래스
    •네가지 중첩 클래스중 가장 드물게사용
    •멤버 클래스처럼 이름이 있고 반복해서 사용가능
    •비정적 문맥에서 사용할때만 바깥 인스턴스 참조 가능
    •정적 맴버는 가질수없고,가독성을 위해짧게 작성해야함
package com.example.java;

public class LocalClassExample {


    public void performAction() {

        class LocalGreeting {

            void greet() {
                System.out.println("지역클래스 예제");
            }
        }
        LocalGreeting localGreeting = new LocalGreeting();

        localGreeting.greet();
    }

    public static void main(String[] args) {

        LocalClassExample outerInstance = new LocalClassExample();
        
        outerInstance.performAction();
    }
}
profile
백엔드개발자가 되고싶은 코린이:)

0개의 댓글