강의의 내용과 FxTS를 보면 주로 iterable(generator)에 대해 다루는 것으로 이해가 됩니다. 그런데 범용적인 프로그래밍에 있어 iterable에 대해서만 주로 다루는 FxTS는 기능이 부족하다는 생각이 듭니다. (예를들어 iterable이 아닌 일반 객체를 FxTS로 다루기 힘듭니다. 만약 억지로 객체를 length가 1인 iterable로 변환한다고 해도 체이닝 과정에서 결국 적절한 모나드가 없어 중간에 체이닝이 끊어지는 일이 쉽게 발생할 것 같습니다.) FxTS를 마치 RxJS와 같이 특정 문제에 대한 해결을 목적으로 만들었는지, 그리고 실무에서 코드를 주로 함수형으로 작성한다면 FxTS만으로 하는지 아니면 다른 도구를 추가로 사용중인지도 궁금합니다. 좋은강의 감사드립니다.
코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다! [코드팩토리 디스코드] https://bit.ly/3HzRzUM - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. void 설명 부분에서 addNumbers 에 int선언하기전 void가 사실 생략되어있다고 하셨는데 그럼 두번째 사진에서의 addNumbers 함수는 실행되어야하는거 아닌가 의문이 듭니다~
먼저 강의 정말 감사합니다.. 질문 폭탄을 드려서 매번 죄송할따름입니다.. 1번 질문 // inline 프로퍼티 class InLinePropertyPerson(val name: String) { inline val uppercaseName: String get() = this.name.uppercase() // 가능 // get() = field.uppercase() // 불가능 } 위의 코드처럼 inline 프로퍼티의 경우 this로의 접근은 가능한 반면, backing field 사용시에는 불가능하더라구요! 이렇게 되는 이유or원리가 궁금합니다 2번 질문 inline 사용의 경우 디버깅이 어렵다는 말을 어느 컨퍼런스의 코틀린 주제 네트워킹 세션때 들은 것 같습니다 그런 경우 강의에서 나온 대로 invoke를 유발할 수 있는 함수 파라미터의 경우 noinline을 붙이면 해결되는 부분일지, 아니면 inline을 제외한 일반 함수로 만들어서 디버깅으로 문제점을 찾고 다시 inline fun으로 만드는게 나은지 궁금합니다 (어떤 경우 차라리 메서드 콜스택을 만드는 편이 진입점을 파악하기 좋으니깐요!) 3번 질문 inline 키워드와는 관계 없는 질문이긴하지만..! // 1번 listOf(1, 2, 3) .map { num -> val result = num + 1 result } // 2번 listOf(1, 2, 3) .map { num -> val result = num + 1 return@map result } 위와 같은 코드에서 보면 map의 중간연산에 최종적으로 result가 반환될거야 라고 명시적으로 나타내는 2번 방식과 kotlin의 특징인 scope { } 의 최종 line 값을 반환하는 자동기능이 쓰인 1번 방식이 있는데 코틀린을 처음 접하거나 모르는 사람이 보면 저기 왜 뜬금없이 쓰이지도 않는 변수인 result가 있지? 이상하군! 이렇게 생각할수도있을것같아요(그냥 예시 중 하나.. 아마 이렇게 생각하시는 분은 없다고 예상) 오히려 2번 방식에서 아 여기 map에서의 최종연산 결과는 result구나 하고 map라벨링을 달고 리턴하는게 좀 더 가독성이 있어보이는데요! 2번 방식은 라벨링을 해서 jump를 하는 방식이라 안티패턴으로 봐야하는지? 아니면 그렇지 않은지?가 궁금합니다 강의 잘 보고있습니다! 감사합니다 :)
jmh { threads = 1 fork = 1 warmupIterations = 1 iterations = 1 } JVM/JDK toolchain : 21 kotlin { jvmToolchain(21) } .gradle 버전 : 8.8 kotlin 버전 : 2.0(컴파일러, 언어, API) 위 세 버전 기준으로는 id("me.champeau.jmh") version "0.7.2" 버전으로 하고 $ ./gradlew jmh 실행이 에러없이 잘 작동하고 실행결과는 build/reports/jmh/results.txt의 경로가 아닌 build/results/jmh/results.txt 경로에 파일이 생긴 것을 확인했습니다
강사님 Generic Func에서 // origin fun <T> List<T>.hasIntersection(other: List<T>): Boolean { return (this.toSet() intersect other.toSet()).isNotEmpty() } // error fun <T> List<T: Any>.hasIntersection(other: List<T>): Boolean { return (this.toSet() intersect other.toSet()).isNotEmpty() } // error fun <T> List<T>.hasIntersection(other: List<T : Any>): Boolean { return (this.toSet() intersect other.toSet()).isNotEmpty() } // error fun <T> List<T: Any>.hasIntersection(other: List<T : Any>): Boolean { return (this.toSet() intersect other.toSet()).isNotEmpty() } // ok fun <T : Any> List<T>.hasIntersection(other: List<T>): Boolean { return (this.toSet() intersect other.toSet()).isNotEmpty() } 이렇게 되더라구요! 맨 앞에 <T>가 반환타입(List<T>)과 인자타입(other: List<T>) 까지 함께 선언해주는 declaration-site variance의 형태를 띄고 있어서 그런건가요? 생각해보면 들어갈 수 있는 타입은 nullable인데 반환타입은 not null이거나 그 반대가 되면 헷갈릴 것 같아요. 그것을 막아둔것같기도 하구요! 이렇게 제네릭 메서드를 만드는 경우에도 generic 제약을 줄 수 있는거죠!? 좀 더 실 사용에 가깝게 타입가드까지 하려면 fun <T : Number> List<T>.hasIntersection2(other: List<T>): Boolean { return (this.toSet() intersect other.toSet()).isNotEmpty() } 이런 느낌으로 쓰일것같은데.. 맞나요? 코틀린 고급편 잘 듣고있습니다 ~_~
안녕하세요 강의 잘 듣고 있습니다!! 근데 영상 예제 말고 추가적으로 코드를 입력해보고 있는데 이해가 안되는 에러가 발생해서 질문 드립니다 void main() { int number = 2; // doble로 변경하면 문제 없이 동작됨 왜? print(number); // 2 print(number = number + 2); // 4 print(number = number - 2); // 2 print(number = number * 2); // 4 print(number = number / 2); // 에러 발생 왜??? 4 / 2면 2가 나와야 하는 거 아닌가? print('-----------여기까지는 기본적인 사칙연산 네 가지-----------'); print(number % 2); // number 나누기 2의 나머지 0 print(number % 3); // number 나누기 2의 나머지 2 print(number); // 많은 연산을 진행했지만 값은 변하지 않았음 } 지금 위 코드에서 이해가 안되는 게 print(number = number / 2); 이 부분에서 Error: A value of type 'double' can't be assigned to a variable of type 'int'. print(number = number / 2); //2 위와 같이 double 타입을 int 타입 변수에 저장할 수 없다는 에러가 발생합니다 근데 4 /2의 결과는 2인데 왜 이런 에러가 발생하는지 모르겠습니다 알려주시면 감사하겠습니다!! 강의 잘 듣고 있습니다 항상 감사합니다 좋은 하루 보내세요!
안녕하세요! 좋은 강의 잘 듣고 있습니다 궁금한 게 C언어 같은 경우는 변수 이름 규칙에 특수 문자 사용 불가, 숫자로 시작 불가, 공백 금지 등 변수 이름의 표기법이 아닌 정말 문법적으로 반드시 지켜야 하는 규칙이 있는데 다트 언어도 문법적으로 반드시 지켜야 하는 규칙이 있는지 궁금합니다..! 구글링을 통해 정보를 얻어보려고 했으나 제 서칭 능력이 부족한 건지 원하는 결과를 얻지 못해서 질문드립니다! 좋은 강의 감사합니다! 좋은 하루 보내세요 ㅎㅎ
4강애싱크 프로그래밍에서 12:46에서 addnumber함수는 비동기함수가 아니라 동기함수 아닌가요?그럼 위에 addnumber()가 끝나고(2초기다리는거까지 하고)나서 밑에 addnumber()가 실행돼야하는거 아닌가요?? 왜 위 addnumber의 2초를 기다리지 않고 밑에 addnumber를 실행하죠? Addnumber의 반환타입이 Future<void>가 아니라 그냥 void니까 동기함수 아닌가요??
비동기가 없을 시에 불필요한 프로미스 객체를 생성하지 않고 동기일 땐 배열을 프로미스가 있을 때만 프로미스를 반환하기 때문에 async await를 사용하는거 보다 성능면에서 우위를 가질 수 있는건가요? async를 사용하면 무조건 동적인 값이여도 promise를 반환하기 때문에 성능에 좋지 않다라고 이해했는데 맞는건가요?
질문1. go 함수에서 apply의 쓰임 제가 알고 있는 apply는 this바인딩 때문에 사용하는것으로 알고 있습니다. 여기서는 array-like를 array로 바꿔주는 것으로 쓰이는것 같아요?? 물어보고싶은것은 apply의 기능 1. this바인딩 때문에 사용 호출함수에서 array-like를 array로 기능하도록해준다 이렇게 두 가지 기능을 한다 라고 정의를 하면 될까요??