inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

12강. 코틀린에서 object 키워드를 다루는 방법

companion object에 관한 질문입니다

635

가보자!!

작성한 질문수 48

1

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

oop java kotlin

답변 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가 있습니다! 😊😊

 

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

감사합니다~ 🙇

수업노트

0

58

1

싱글톤과 스프링

0

74

2

get() = 3

0

53

2

강사님

0

76

1

강의 복습하면서 생긴 질문

1

97

1

Kotlin과 Java의 현업에서의 활용

0

130

2

data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문

0

75

1

코틀린에서 상속 시, 주의점에 대한 질문

1

101

3

내용 이해 질문

0

58

1

자바와 코틀린의 함수형 프로그래밍,

1

93

1

플랫폼 타입 설명 문의

2

79

2

널 아님 단언 관련 질문

0

86

1

강의 중 질문

0

81

2

범위 비교 질문

1

93

2

타입캐스팅 궁금한점 질문드립니다.

1

241

2

코틀린 val 질문

0

168

2

완강 후 Kotlin 이런저런 질문 드려봅니다!

3

411

2

확장함수 스타일 질문

0

140

2

확장 프로퍼티 질문

1

158

1

update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!

1

283

1

java class의 NotNull 어노테이션 인식

1

264

1

[16강] 확장함수 관련 질문입니다!

1

134

2

리턴타입 사용시 any를 사용해도 괜찮은가요?

1

142

1

안녕하세요 scope function 에 receiver 가 없는 경우

1

172

1