ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13강. 코틀린에서 중첩 클래스를 다루는 방법
    BackEnd/Kotlin 2024. 3. 8. 05:30
    반응형
    1. 중첩 클래스의 종류
    2. 코틀린의 중첩 클래스와 내부 클래스

     

    중첩 클래스의 종류

    static을 사용하는 중첩 클래스 밖의 클래스 직접 참조 불가
    static을 사용하지 않는 중첩 클래스 내부 클래스(Inner Class) 밖의 클래스 직접 참조 가능
    지역 클래스(Local Class) 메서드 내부에 클래스 정의
    익명 클래스(Anonymous Class) 일회성 클래스

     

      클래스 안에 클래스가 있는 종류는 두 가지입니다.

    • static을 사용하는 중첩 클래스
    • static을 사용하지 않는 내부 클래스(Inner Class)

     

      다음은 JavaHouse 안에 LivingRoom 내부 클래스(Inner Class)가 존재하는 Java 코드입니다.

    public class JavaHouse {
    
      private final String address;
      private final LivingRoom livingRoom;
    
      public JavaHouse(String address) {
        this.address = address;
        this.livingRoom = new LivingRoom(10);
      }
    
      public LivingRoom getLivingRoom() {
        return livingRoom;
      }
    
      public class LivingRoom {
    
        private final double area;
    
        public LivingRoom(double area) {
          this.area = area;
        }
    
        public String getAddress() {
          return JavaHouse.this.address; // 바깥 클래스의 JavaHouse를 참조합니다.
        }
      }
    
    }
      public static void main(String[] args) {
        JavaHouse house = new JavaHouse("Kotlin");
        System.out.println(house.getLivingRoom().getAddress());
      }

     

      다음과 같이 내부 클래스에 static을 붙이면 바깥 클래스를 참조할 수 없습니다.

      public static class LivingRoom {
    
        private final double area;
    
        public LivingRoom(double area) {
          this.area = area;
        }
    
        public String getAddress() {
          return JavaHouse.this.address; // Error
        }
      }

     

    Effective Java 3rd Edition - Item 24, Item 86

    • 내부 클래스는 숨겨진 외부 클래스 정보를 가지고 있어 참조를 해지하지 못하는 경우 메모리 누수가 생길 수 있고, 이를 디버깅하기 어렵습니다.
    • 내부 클래스의 직렬화 형태가 명확하게 정의되지 않아 직렬화에 있어 제한이 있습니다.

    클래스 안에 클래스를 만들 때는 static 클래스를 사용하라!

     

    코틀린의 중첩 클래스와 내부 클래스

      Kotlin에서는 Effective Java의 Guide를 충실히 따르고 있습니다. 기본적으로 바깥 클래스를 참조하지 않습니다.

     

      다음은 Java 코드를 Kotlin으로 구현한 코드입니다.

    • Java의 static 중첩 클래스 (권장되는 클래스 안의 클래스)
    class House(
        private val address: String,
        private val livingRoom: LivingRoom
    ) {
        class LivingRoom(
            private val area: Double
        )
    }

     

    • Java의 내부 클래스 (권장되지 않는 클래스 안의 클래스)
    class House(
        private val address: String,
        private val livingRoom: LivingRoom
    ) {
        inner class LivingRoom(
            private val area: Double
        ) {
            val address: String
                get() = this@House.address
        }
    }
    • 바깥 클래스를 참조하는 내부 클래스(Inner Class)를 만들 때는 inner 키워드를 추가합니다.
    • 바깥 클래스를 참조하기 위해 this@바깥클래스를 사용합니다.

     

     

    감사합니다.

    반응형

    댓글

Designed by Tistory.