55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨코틀린 고급편
by lazy 블럭 안에서 suspend 함수의 결과값을 받는게 가능한가요?
강의에서 Thread.sleep 한것 처럼 runblocking으로 Thread를 blocking 해야만 값을 기다렸다가 받을 수 있는지 아니면CoroutineScope의 async나 launch로도 가능한지궁금합니다 ㅠ
- 미해결코틀린 고급편
DSL 만들기
안녕하세요 강사님. 내용을 몇번 더 봐야 더 잘 알겠지만막히는 부분이 있어서 질문올립니다. 18강 내용중에서 service(name = "db") { image { "mysql" } env("USER").`is`("myuser") env("PASSWORD").`is`("mypassword") port(host = 9999, container = 3306)} env("USER").`is`("myuser") 이 DSL은 어떻게 만들수 있을지 감이 오지 않습니다. ㅜㅜ
- 미해결코틀린 고급편
Sequence vs Stream
안녕하세요 Sequence와 Stream의 차이점에 대해서 질문드립니다.Sequence가 지연연산의 이점을 통해서 대용량 처리를 해야할 때 이점을 줄 수 있다고 이해를 했고,Java의Stream과 유사하다는 생각이 들었습니다. 찾아보니, java8 이전의 Kotlin의 경우 Stream을 사용할 수 없으니, Sequence를 사용했었다 라는 글을 발견했습니다.위 설명이 맞을까요?혹시 맞다면 어떠한 기준으로 둘중에서 선택을 하는게 좋을까요?
- 해결됨코틀린 고급편
코틀린 indent 코드 스타일 질문입니다.
강사님 영상을 보면 indent가 스페이스 바 두칸으로 되어있는 것 같습니다. 코틀린 공식문서를 봤을 때 4칸으로 되어있는데 같은데2칸으로 쓰시는 이유가 궁금합니다.
- 해결됨코틀린 고급편
non-local return 질문입니다.
fun main() { val numbers = listOf(1, 2, 3, 4, 5) iterate(numbers) { num -> if (num == 3) { return@iterate } println(num) } } fun iterate(numbers: List<Int>, exec: (Int) -> Unit) { for (number in numbers) { exec(number) } } 1 2 4 5 Process finished with exit code 0 람다식 내부에서 return사용이 불가능하다고 하셨는데위 처럼 @iterate 라벨로 명시적으로 선언하면 3만 빠진 수만 리턴하는 것을 볼 수 있었습니다.위 방식으로는 non-local return 문제를 해결했다고 볼 수 없나요? 강의 정말 재밌게 듣고 있습니다! 감사합니다.
- 미해결코틀린 고급편
SynchronizedLazyImpl 함수관련 질문
태현님, 안녕하세요, 강의 잘듣고 있습니다! 9강 11분 35초 부분에서 질문이 있는데요. by Lazy안에 타고 들어가면 SynchronizedLazyImpl 함수가 스레드 세이프해서 위험할 수 있다고 말씀하셨는데 .. 어떤 의미인지 궁금해서 질문 글 올립니다. 시간되실 때 답변 부탁드려요 감사합니다!
- 해결됨코틀린 고급편
제네릭 클래스를 정의하는 경우, 반드시 변성을 고려하는 것이 바람직한가요?
안녕하세요 강사님! 코루틴 강의를 너무 재밌게 들어서 고급편까지 오게 되었습니다. 지금 변성과 관련된 내용까지 수강하였고, 이 내용을 다음과 같이 이해하였습니다.변성은 타입 인자로 전달된 클래스 간의 상속 관계를 제네릭 클래스에도 적용하기 위한 개념이다.변성이 적용된 경우, 타입 안전성을 위해 생산자 또는 소비자 역할만을 수행할 수 있다. 그런데 저는 아직 개발 경험이 부족해서 그런지, 강의에서 보여주신 Cage<T>와 같은 상황이 발생할 수 있다는 점은 공감하지만 실제로 그런 상황을 마주한 적은 없던 것 같습니다. 아무래도 제가 작성했던 로직 상 타입 인자로 전달된 클래스의 상속 관계를 제네릭 클래스에도 적용해야 할 필요성을 느껴본 적이 없어서 그랬던 것 같은데, 이렇듯 로직 상 임의의 제네릭 클래스에 변성을 줄만한 이유가 없는 상황에서도 생산자 / 소비자의 역할을 고려하여 변성을 명시하는 것이 best practice인지 궁금합니다!
- 미해결코틀린 고급편
실무에서 lateinit 이 필요한 경우는 어떤 상황일까요?
항상 좋은 강의 감사합니다! 최태현님 강의덕분에 코틀린으로 전환하고 있는 회사에서 적응하는데에 많은 도움 받고있습니다. 이번 질문은 lateinit 을 실무에서 사용하는 상황에 대한 것입니다. lateinit 을 사용하는 시점은, 클래스 인스턴스화 시점과 프로퍼티 초기화 시점을 분리하고 싶을 때라는 것은 이해했습니다.그런데, 실무에서 저런 경우가 어떤 상황인지 잘 생각이 나지 않습니다. 실무에서 lateinit 을 사용하는 경우, 즉 클래스 인스턴스화 시점과 프로퍼티 초기화 시점이 분리가 필요한 경우는 어떤 경우가 있는지 궁금합니다!
- 해결됨코틀린 고급편
4강 타입소거 관련 질문
자바의 경우 실제 런타임에서 제네릭은 타입 소거되니까, 클래스에 variance를 주더라도 실제 런타임에서는 런타임에는 그냥 Cage가 되는거 아닌가요?그러면 animal 케이지에 다른걸 넣어도 런타임에서는 문제가 없지않을까.. 싶어서요
- 해결됨코틀린 고급편
render 수정 관련
안녕하세요 태현님! 강의에 오타가 있어서 글 남깁니다!Service 클래스 안에 있는 render 메서드에서builder.appendNew("environment:", indent, 1) builder.appendNew("port:", indent, 1) environment 와 port 에 indent 와 times(1)가 추가되어야 할 것 같습니다! 확인 부탁드릴게요~! 🙇
- 해결됨코틀린 고급편
추상클래스의 공변 / 반공변, 추상 제네릭 일급컬랙션 리팩토링 에 대한 질문입니다.
믿고보는 태현님강의 다른강의 듣다가 사두고 이제서야 초반을 달리고 있습니다. 역시나 그간 알다가 까먹고 했던부분 확실하게 다지고 가는 느낌이 듭니다.저는 공변/반공변 예제 중 [꺼내기 / 저장] 각각의 기능만 하는 두가지 일급컬랙션을 따라하다가, 추상클래스 AbstractCage 를 둔다면 어떨지 아래처럼 한번 구성했었습니다. abstract class AbstractCage<T>( protected val things: MutableList<T>, )/** 초기화를 통해 아무거나 저장 후, 꺼낼수만 있는 케이지 */ private class ProduceCage<out T>( vararg things: T ) : AbstractCage<T>(mutableListOf(*things)) { // ProduceCage T는 'out(공변)' 이지만 AbstractCage T는 무공변 선언되어 대입불가. fun getFirst(): T = this.things.first() fun getAll(): List<T> = this.things.toList() }/** 아무거나 저장 만 가능한 케이지 */ private class ConsumeCage<in T>( vararg things: T ) : AbstractCage<T>(mutableListOf(*things)) { // ConsumeCage T는 'in(반공변)' 이지만 AbstractCage T는 무공변 선언되어 대입불가. fun put(vararg things: T) { this.things.addAll(things) } }문제는 상속받을때의 : AbstractCage<T>(..things) 선언부에 부모 T 타입이 무공변이라 자식 T 타입이 적절치 못하다고 애러가 나는데요,생각해보니 양쪽의 하위타입에서 이도저도 아닌 T 타입을 강요하는데, 이런 방식이 좋은 접근방식인가? 하는 의구심도 들고, 현업에서나, 또는 올바른 접근방법이 궁금해 질문하게 되었습니다. AbstractCage 의 타입파라미터를 <in T1, out T2> 이렇게 두는것도 이상하구요,이렇게 일급컬랙션 의 공통부분을 만들어야 될때 어떻게 접근해서 풀어내실지 의견이 궁금해서 남기게 되었습니다.읽어주셔서 감사합니다.
- 해결됨코틀린 고급편
lateinit 키워드 관련해서 질문드립니다!
안녕하세요! 수업 듣다가 급혼란(?)이 찾아와서 질문을 드리려고 합니다!lateinit 키워드는 primitive 타입에서는 사용할 수 없는 이유가 컴파일 되었을 때 null을 저장할 수 없어서 라고 설명을 해주셨는데요. 그러다보니 lateinit var name: String 이 코드에 대해서 갑자기 혼란이 찾아왔습니다. String? 이 아니기 때문에 name에도 null은 들어갈 수 없는 것은 확정적인데, 이러면 Int, Long 이런 것과 뭐가 다른가 하는 순간적인 혼란이 찾아오네요.코틀린에서의 String을 바이트 코드 디컴파일하면 어차피 자바 String이 되기 때문에 자바에서의 String은 null이 될 수 있기 때문에 코틀린에서 String은 String?이 아니어도 바로 lateinit을 사용할 수 있게 되는가 하는 생각도 해봤는데 이게 맞는지는 모르겠네요..ㅠ뭔가 되게 간단한 것 같은데 헷갈려서 질문을 드려서 죄송하네요 ㅠ