OkkyUser
3k
2017-11-14 23:05:02.0
6
470

예전에 Kotlin 처음 건드려 보고 글을 썼었는데, 그 이후 느낀 점.


예전에 처음 건드려 보고 그냥 글을 썼더니 Tech로 이동되는 영광이 있었습니다. 그 후로 좀 더 건드려 본 소감입니다.

사실 제일 편한 건, 별 것 아니지만 var이고, 제일 귀찮은 건, 별 것 아니지만 ?입니다. C#/Java 등에서는 레퍼런스 변수가 그냥 null일 수 있는데, Kotlin에서는 null일 수가 없습니다. null이 되려면 아예 선언할 때부터 ?를 붙여 줘야 합니다. ?을 안 붙이면 null이 될 수 없기 때문에 반드시 초기화를 해야 하는데, 귀찮고, 코드 중에서 사용할 때에도 a?. b?. 이런 식으로 ?을 붙이고 해서 별 것 아니라도 귀찮습니다. !!도 써야 할 때도 있고...

최근에 Swift 4로도 간단한 걸 만들면서 좀 공부했는데, Swift도 비슷하게 null을 엄격하게 다루더라고요. Kotlin/Swift를 시간차 두고 조금씩 쓰다 보니, null 관련해서 서로 비슷비슷한 게 많아, ?,! 이런 것 타이핑하면서 이게 Kotlin 것이었나 Swift 것이나 헛갈렸습니다. 요즘 나오는 언어의 트렌드인가요?

그리고 IDE가 Java를 copy-and-paste하면 Kotlin으로 변환해 주는데 완벽하지 않아서, 오류가 발생하는데 어떻게 고칠지 몰라 StackOverflow에 여러 번 물었습니다. 예를 들면, Kotlin에서는 부모 클래스의 static 멤버가 상속되지를 않습니다.

그리고 Android Room이나 Dagger 2 이런, 언어 자체의 기능을 이용하는 프레임워크/라이브러리의 경우, 홈페이지에 Java 기준으로만 설명이 되어 있어, Kotlin으로 하려면 이상한 숨은 제약과 설정할 것들이 있어 역시 StackOverflow에 여러 번 묻고 웹 검색하고 해야 했습니다.

즉, 늘 좋고 편하기만 한 건 아닌데, 그래도 저는 이제 안드로이드 앱 만들 때 Kotlin만 쓰고 있습니다. 안드로이드 스튜디오 3.0이 되면서 프로젝트 생성시에 바로 Kotlin을 지정할 수 있게 되었습니다.

0
0
  • 댓글 6

  • 쿵푸팬더
    380
    2017-11-14 23:28:03.0

    가장 장점은 재미있습니다. 새로운걸 하니ㅎㅎ

    0
  • OkkyUser
    3k
    2017-11-14 23:52:11.0

    그게 새로운 게 하나면 재미있는데, 너무 많아서 overwhelming... Kotlin, Swift, JavaScript(TypeScript) 이런 온갖 것들이 요즘은 다 필요하니, 속에서 헛갈리더라고요. 정말 언어이니, 프레임워크니, 라이브러리니 하는 것들이 너무 많아진 것 같아요. 개발자를 도와 주려고 나온 건 맞는데, 예전에 그런 것들이 없던 시절에는 소비자의 눈도 낮아서 그런 것 안 쓰고도 10시간에 만들던 걸, 요즘은 그런 라이브러리 사용된 앱에 소비자들이 익숙해져서 눈이 높아져서, 그런 라이브러리 다 쓰고도 11시간 걸려 만드는 듯한 상황?

    0
  • 심심한사부
    739
    2017-11-15 00:25:56.0

    ? 이걸 swift에서는 옵셔널이라고 부르는데

    하스켈의 모나드에서 넘어왔습니다.

    남용하면 모든 변수가 ? 로 도배 되고

    편하게 쓰려고 강제로 언랩 하느라 !를 생각없이 쓰면 그곳에서 크래쉬를 자주 만나게 됩니다.


    C#은 2.0 부터 Nullable를 지원하기 시작해서 10년도 더 된것 같은데

    그게 똥인지 된장인지 다들 몰라서 안쓴다는...



    0
  • OkkyUser
    3k
    2017-11-15 09:31:24.0

    Nullable을 다들 안 쓰는 건가요? DateTime처럼 null일 수 없는 값의 오류나 초기화 상태를 표시할 때 유용하던데요.

    기계적으로 판단은 잘 안 되겠지만, 위에 선언해 놓고, 좀 아래에서 조건에 맞춰 초기화한다든가, 클래스 필드로 선언해 놓고 나중에 메서드에서 (하지만 확실하게 불릴) 조건에 맞게 초기화할 경우 등도 있는데 이런 경우도 다 ?로 선언해야 해서 귀찮았습니다. Swift의 경우 let으로 선언하고 바로 그 아래에서 if/else로 초기화하면 똑똑하게 알아채고 선언하면서 초기화 안 해도 됐던 것 같은데...

    0
  • 앙앙이
    1k
    2017-11-15 11:35:39.0 작성 2017-11-15 14:09:26.0 수정됨

      var 는 분명 편의를 위해서 만든것이기에 비용을 지불해야 합니다.


    좀더 명확한 타입 이름으로 바꾸려 한다면

    var 때문에 소스상 타입이 명시되지 않는 경우 

    소스 수정도 없는데 왜 올리냐? 라는 질문에 직면하게 됩니다.

    그렇다면 소스 수정이 없다고 넘어갈 수 있냐? 아닙니다.

    정적 타입 언어에서 var 는 자바를 예를 들면 .class 파일에 변수 타입이 명시됩니다.

    하여 소스상 변경 없다고 이름을 바꾼것이 변경 적용된 class 파일 반영하지  않으면 망합니다.


    그리고 IDE 도움 없이 수동으로 추적한다는것 상상이 되시나요?

    그 과정을 과장해서 말하면 컴파일 과정입니다.

    클래스명(=타입?) 이름 바꾸는 리팩토리 기능에 단순 문자쳘 치환이 아닌

    컴파일 과정이 필요하다는것이 선뜻 이해가 가시나요?


    지역 변수 타이핑 구찮은 욕구를 알고 있기에 IDE 에서 지역 변수 만들어 주는 편의 기능을 제공해 줍니다.

    (ex 이클립스 ctrl-2 l)


    정말로 var 가 개발자를 위한것이 맞는지 혹여 독이 든 사과는 아닌지 진지하게 고민해 보시기 바랍니다.


    ----------- 서명

    var 를 넣은 모든 정적 타입 언어에 외칩니다. 니들이 유지보수를 알어~

    0
  • 심심한사부
    739
    2017-11-15 13:40:12.0

    swift 는 var 를 안쓰면 mutable 변수가 안 만들어 집니다. ㅋㅋ



    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.