• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

companion object에 관한 질문입니다

22.11.28 01:20 작성 조회수 439

1

강사님께서 "companion object에 유틸성 함수들을 넣어도 되지만, 최상단 파일을 활용하는 것을 추천한다" 라고 하셨는데, 그 근거가 무엇인지 알 수 있을까요?? 참고할 url을 알려주시면 더욱 감사하겠습니다!!!

답변 1

답변을 작성해보세요.

1

안녕하세요, 가보자!! 님 ㅎㅎㅎ 아이고~~ 좋은 질문 감사드립니다!! 🙏

 

바로 답변드려 보자면, 최상단 파일 활용을 추천드리는 이유는

  1. Decompile 했을 때 정적 팩토리 메소드에 가까운 것은 최상단 함수이고,

  2. companion object를 사용했을 때보다 타이핑 할 것이 적어 간결하기 때문입니다!!

 

예를 들어

class StringUtils {
  
  companion object {
    fun startsWithA(str: String): Boolean {
      return str.startsWith("A")
    }
  }
  
}

위와 같은 코드를 Decompile 하여 보게 되면,

public final class StringUtils {
   @NotNull
   public static final Companion Companion = new Companion((DefaultConstructorMarker)null);

   public static final class Companion {
      public final boolean startsWithA(@NotNull String str) {
         Intrinsics.checkNotNullParameter(str, "str");
         return StringsKt.startsWith$default(str, "A", false, 2, (Object)null);
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

와 같이 StringUtils 클래스 안의 Companion 클래스 안의 startsWithA 함수가 만들어지죠! Companion 클래스도 '동행 객체'니까요!

 

반면

fun startsWithA(str: String): Boolean {
  return str.startsWith("A")
}

와 같은 코드를 Decompile 하게 되면

public final class StringUtilsKt {
   public static final boolean startsWithA(@NotNull String str) {
      Intrinsics.checkNotNullParameter(str, "str");
      return StringsKt.startsWith$default(str, "A", false, 2, (Object)null);
   }
}

와 같이 저희가 생각하는 흔한(?) 유틸성 정적 메소드가 나오게 됩니다.

 

유틸성 코드를 작성하는 Kotlin 코드 역시 최상단에 있는것이 깔끔하고요!

 

유틸성 함수를 사용할 때에도 companion object 안에 있으면 StringUtils.startsWithA 를 타이핑 하는 반면 파일 최상단에 있으면 startsWithA 를 바로 사용하게 되어 더 간편합니다!!

 

코틀린 공식문서에는 비슷한 기능을 하는 코드이고, 소스 파일의 용량이 허용가능한 한 파일에 여러 함수를 위치시키는 것은 장려된다 (https://kotlinlang.org/docs/coding-conventions.html#source-file-organization) 라는 quote가 있습니다! 😊😊

 

답변이 되었으면 좋겠네요~!! 행복한 밤 잘 마무리 하시기 바랍니다!!

감사합니다~ 🙇