묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결멀티패러다임 프로그래밍 1편: 반복자 패턴 & LISP (with TypeScript, Clojure, Kotlin)
컴파일 에러
안녕하세요, 강의 잘 듣구 있습니다.다름이 아니라 reduce 가 포함된 파일을 컴파일하면 그림과 같은 에러가 납니다. 에러 해결을 위해서 아래 두 가지 방법을 시도해보았습니다. 에러메세지처럼 reduce 함수의 정의에 A extends Acc 로 명시이 해결방법은 옳지 않은 것 같다고 생각했습니다. (A -> number, Acc -> string 인 경우)else 문에 있는 baseReduce 를 Acc 타입으로 강제 캐스팅책과 강의 코드 모두 살펴봐도 크게 다른 점이 없는 것 같아 질문드립니다. 감사합니다!(제가 작성한 코드 첨부드립니다) function baseReduce<A, Acc>( f: (acc: Acc, a: A) => Acc, acc: Acc, iterator: Iterator<A> ): Acc { while (true) { const { done, value: a } = iterator.next(); if (done) { break; } acc = f(acc, a); } return acc; } function reduce<A, Acc>(f: (a: A, b: A) => Acc, iterable: Iterable<A>): Acc; function reduce<A, Acc>( f: (acc: Acc, a: A) => Acc, acc: Acc, iterable: Iterable<A> ): Acc; function reduce<A, Acc>( f: (acc: Acc | A, a: A) => Acc, accOrIterable: Acc | Iterable<A>, iterable?: Iterable<A> ): Acc { if (iterable === undefined) { iterable = accOrIterable as Iterable<A>; const iterator = iterable[Symbol.iterator](); const { done, value: acc } = iterator.next(); if (done) { throw new TypeError('reduce of empty iterable with no initial value'); } return baseReduce(f, acc, iterator) as Acc; } else { // 왜 타입변환을 강제해야하는가..?? return baseReduce( f, accOrIterable as Acc, iterable[Symbol.iterator]() ) as Acc; } }
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
중간연산 sorted에 대해서 질문드립니다
중간 연산 강의를 듣던 중 궁금한 점이 생겨 질문드립니다!강의를 통해 Java의 스트림은 lazy하게 동작하며, 요소가 하나씩 흐르면서 중간 연산을 거쳐 최종 연산으로 전달된다고 배웠습니다.그런데 sorted는 정렬을 위해 모든 요소를 모아야 하므로, 다른 중간 연산들과 달리 lazy하게 하나씩 처리할 수는 없을 것 같습니다.이 경우 sorted는 전체 요소를 한 번에 처리하고 나서야 다음 연산으로 넘어가는 건가요?그렇다면 sorted는 중간 연산이지만 실제로는 최종 연산처럼 동작하는 게 아닌가요?
-
해결됨함수형 프로그래밍과 JavaScript ES6+ 응용편
이미지 동시성 다루기
C.takeAll에서 궁금한 점이 있습니다.C.takeAll가 추가되기 전에 지연평가를 통해 배열에서 하나씩 fade-in 클래스를 달아주고 있었다면추가한 후에는 배열의 지연평가가 모두 끝난 뒤에 달아주는 동작으로 보이더라구요.시작은 다같이 하지만, 먼저 끝나는 것부터 fade-in 클래스를 달아주는 방식은 어떻게 해야할지 감이 안옵니다.혹여나 앞에 이해가 잘못된 것이 있다면 편하게 알려주세요. 감사합니다!
-
해결됨멀티패러다임 프로그래밍 1편: 반복자 패턴 & LISP (with TypeScript, Clojure, Kotlin)
강의 커리큘럼 관련 질문
안녕하세요 강사님 좋은 강의 만들어주셔서 감사합니다.책도 같이 구매하였는데요 멀티프로그래밍 패러다임 책과 이 강의를 보면강사님의 다른 함수형 프로그래밍 자바스크립트, 함수형 프로그래밍 자바스크립트 응용편은 따로 보지 않아도 되나요? 혹은 다른 내용을 가지고 있어 전부 보는게 좋을까요?
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
인스턴스 메소드 참조와 람다의 차이
강의 수강 중 궁금하여 실험한 내용 공유합니다. 2번 특정 객체의 인스턴스 참조에 관련한 내용입니다.강의자료에서는 () -> person.introduce가 person::introduce와 동일한 것처럼 설명된 것 같습니다. "그럼 person에 대한 캡처가 일어날까?" 하는 궁금증이 들었고, 다음과 같은 코드를 작성했습니다.Person person = new Person("Kim"); Supplier<String> instanceMethod = () -> person.introduce(); person = new Person("Lee"); System.out.println(instanceMethod1.get());컴파일러가 person이 사실상 final이 아니라면서 컴파일해주지 않더군요. 다음으로는 람다 대신 메소드 참조로 바꾸어보았습니다.Person person = new Person("Kim"); Supplier<String> instanceMethod = person::introduce; person = new Person("Lee"); System.out.println(instanceMethod.get());이는 컴파일에 성공하고, "I am Kim"이 출력됩니다. Person 클래스에 setName을 추가하고 메소드 참조 이후에 호출해보았습니다.Person person = new Person("Kim"); Supplier<String> instanceMethod = person::introduce; person.setName("Park"); person = new Person("Lee"); System.out.println(instanceMethod.get());"I am Park"이 출력됩니다. 요약하면 다음과 같습니다.() -> person.introduce 에서는 person이 사실상 final이 되어야만 한다.person::introduce는 사실상 final이 아니어도 되며, 해당 메소드 참조는 정의 시 객체 참조를 유지한다.
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
JDK17에서 ExecutorService 클래스 내 close() 함수가 없는 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. 예예예안녕하세요. 강의 잘 듣고 있습니다! 강의 3분 44초 전후로 ExecutorService를 close() 함수로 닫으셨는데 es.close() 부분에서 오류가 발생합니다(스크린샷 참고).찾아보니 Java 9 이상에서 ExecutorService 구현체가 AutoCloseable을 구현한 경우에만 close()를 사용 가능하다고 하는데 현재 JDK 17 버전을 쓰고 있는데도 close() 함수를 찾지 못하고 있습니다.(다만 shudown() 함수를 사용하니 정상적으로 컴파일이 되고 닫히고 있습니다)close() 대신 shutdown()을 사용하여도 성능상 차이가 없는지 궁금합니다. 글이 길어져서 죄송합니다. 답변 부탁드립니다. 감사합니다.
-
미해결코틀린 고급편
[23강] SuperTypeToken의 equals 관련 질문
안녕하세요 강사님 23강 강의를 보다가 한가지 여쭤보고 싶은 사항이 있어서 질문을 남기게 됐습니다. 11분 46초 부분을 보면 equals 가 제대로 동작하지 않아서 if (javaClass != other?.javaClass) return false 해당 부분을 삭제하는 부분이 나오는데요. 해당 코드를 해석해보면 2개의 javaClass가 다르기 때문에 equals가 false가 나왔다는 의미 같은데, 혹시 2개의 javaClass가 다른 이유가 무엇인지 알려주실 수 있으실까요? 똑같은 타입의 클래스를 인스턴스화 했기 때문에 동일한 javaClass라고 생각을 했는데 2개가 다르다고 나오니 이해가 잘 되지 않습니다! 감사합니다.
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
클래스 메서드가 함수가 아닌 이유
안녕하세요. 강사님!클래스 메서드 역시 클래스에 소속되어있기 때문에 인스턴스에 독립적이더라도 함수가 아닌 메서드로 보는 것이라 이해해도 될까요?
-
미해결코틀린 고급편
23강 타입 안전 이종 컨테이너 예제 관련 문의 드립니다.
저같은 경우, 7:32 부분에서 List<GoldFish> 를 저장했다가 List<Carp> 타입을 꺼내려고 하면 "class generic.GoldFish cannot be cast to class generic.Carp (generic.GoldFish and generic.Carp are in unnamed module of loader 'app')" 와 같은 오류가 발생하는데, 정상적으로 금붕어 리스트가 반환되는게 맞는지요 ? 제가 뭔가 놓친 부분이 있을까 궁금하여 문의 드립니다.샘플코드는 다음과 같습니다.package reflection import generic.Carp import generic.GoldFish import kotlin.reflect.KClass import kotlin.reflect.full.cast class TypeSafeCage { val animals: MutableMap<KClass<*>, Any> = mutableMapOf() inline fun <reified T : Any> getOne(): T { return T::class.cast(animals[T::class]) } inline fun <reified T : Any> putOne(animal: T) { animals[T::class] = T::class.cast(animal) } } fun main() { val cage = TypeSafeCage() cage.putOne(listOf(GoldFish("금붕어1"), GoldFish("금붕어2"))) cage.getOne<List<Carp>>().forEach { println(it::class.simpleName) } } // 다른 패키지 파일 package generic open class Animal( val name: String ) open class Fish(name: String) : Animal(name) class GoldFish(name: String) : Fish(name) class Carp(name: String) : Fish(name) 강의 중 영상 캡쳐 화면
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
07 메서드 참조6-매개변수2 의 강의영상중 오타 있네요
[질문 내용]07 메서드 참조6-매개변수2 의 강의영상중 오타 있네요 BiFunction<Person, Integer, String> fun2 = Person::introduceWithNumber;System.out.println("person.introduceWithNumber="+fun1.apply(person,1)); //<= fun2 의 것을 호출 해야 하는데 fun1 을 호출합니다. 복 붙 하시다가 fun2로 변경하는거 실수하신것 같네요
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
강의자료 실행시 오류나요
[질문 내용]여기에 질문 내용을 남겨주세요.강의자료받아서 실행시 오류가나네요 ;;뭐가문제일까요 ?? [질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예
-
해결됨김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
[참고 영상] "CPU 수와 스레드 수를 비슷하게 맞춰야 하는 이유"
05분 30초 부분에 "왜 CPU 수와 스레드 수를 맞추는 것이 효율적인지에 대해 이해가 잘 안 가면 ~~를 참고하시라."라고 하셨는데 이와 관련하여 궁금하신 분을 위해 정보 남겨둡니다.영상: 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 - 섹션 2. 프로세스와 스레드 소개 - 컨텍스트 스위칭 영상 1분 ~ https://www.inflearn.com/courses/lecture?courseId=334352&type=LECTURE&unitId=232316&tab=curriculum
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
값이 없으면 예외를 던지는 것이 더 자연스러운 상황에 대한 질문
베스트 프랙티스 6.무조건 Optional이 좋은 것은 아니다 부분을 설명 하실 때 "값이 없으면 예외를 던지는 것"이 더 자연스러운 상황에 대한 설명 부분에서 궁금한 것이 생겨서 질문드립니다. 예를 들어 특정 ID 기반으로 User 엔티티를 찾는 DBA 코드가 있다고 할 때 반환타입을 Optional<User>가 아닌 User로 했을 때 클라이언트 코드쪽에서는 if (user == null) { throw new NotFoundException("..."); }아래와 같은 Optional을 사용한 코드보다 위와 같은 이런 코드가 더 낫다는 걸로 받아들이면 될까요??findUserById(userId) .orElseThrow(() -> new NotFoundException("..."));
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
Optionl.of에 대한 질문
Optinal은 "값이 없을 수도 있다" 라는 의도를 드러내기 위해 사용하잖아요.근데 Optional의 정적 생성자 메서드 중에 Optional.of()를 보면, null일 경우 NPE가 발생하는데, 그럼 Optional을 사용하는 의미가 없지 않나요? Optional.ofNullable과 empty는 사용의도라던가 언제 사용하면 되겠다에 대한 인사이트가 확 오는 반면에 Optional.of는 언제 사용하면 좋을지에 대한 감이 안오네요.
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
저도 람다에 파라미터 힌트를 키고싶어요,,
저도 람다 사용할 때 o -> o.getDelivery() 이거 사용할 때 파라미터 힌트로 Order 같은걸 띄우고싶습니다. 옵션에 Inlay Hints 에서 자바쪽도 다 켜보고 했는데 저는.. 왜 안켜질까요 ㅠㅠ
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
Stream과 디버깅
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 정말 잘 보고 있습니다. Stream관련하여 질문이 있는데요. Stream 같은 경우에는 파이프라인을 작성하면서 연산마다 body부가 추가될 수도 있고 중간 연산이 계속 체이닝 되는 형태로 구성이 될 수도 있습니다. 이럴 때 어느 연산에서 문제가 생기는지 디버깅을 하는게 참 번거롭다는 생각이 들곤했습니다. 저 같은 경우에는 이럴 때 peek 와 sout을 활용해서 어떻게든 값을 확인하는 식으로 디버깅을 해왔는데 더 좋은 방법이 없을까요? 브레이크 포인트를 잡기도 명령형 프로그래밍 방식보다 어려운 점이 있는 거 같아서요 ㅠㅠ
-
해결됨김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
[수정 제안] 10. Optional.pdf - p.24 - orElse() 사용 용도
공부하던 중에 이 부분은 이렇게 수정해야 되는 것 아닌가..? 싶어서 글 남겨봅니다.[수정 제안 정보]대상 강의록: 10. Optional.pdf대상 위치: 강의록 p.24의 최상단 부분, 영상의 10분 50초~수정 제안수정 전: 사용 용도orElse(T other)- 값이 이미 존재할 가능성이 높거나, ...수정 후: 사용 용도orElse(T other)- 값이 존재하지 않을 가능성이 높거나, ...수정 제안에 대한 근거orElse(T other)는 other의 생성 비용이 높은 경우에 "값이 이미 존재함에도 불구하고 생성 연산을 수행해야됨"으로 인해서 비효율이 발생합니다.이는 바꿔 말하면 "값이 존재하지 않는 경우에는 생성 연산이 필수적임"이기 때문에 "값이 존재하지 않는 경우에는 비효율이 발생하지 않음"이라고 해석할 수 있을 것 같습니다.이때 강의에서 말하고자 하는 바는 "orElse()는 비효율이 발생할 수도 있다. 하지만 발생하지 않는 경우에는 사용해도 좋다." 라고 이해했는데, 이때 "비효율이 발생하지 않는 경우"를 "값이 존재하지 않는 경우(생성 연산이 꼭 필요한 경우)"라는 표현으로 대체할 수 있기 때문에"값이 존재하지 않을 가능성이 높은 경우(= 비효율이 발생하지 않는 경우)에는 orElse()를 사용해도 괜찮다."라고 수정해야 하는 것이 아닌가 싶어서 제안합니다.
-
해결됨김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
[오타 제보] 10. Optional.pdf - p.11
[오타 정보]대상 강의록: 10. Optional.pdf대상 위치: 강의록 p.11의 2. ifPresentOrElse() 코드 부분, 영상의 5분 ~오타 내용수정 전public class OptionalProcessingMain { ... System.out.println("=== 2. ifPresentOfElse() ==="); // Of라고 오타 ...수정 후public class OptionalProcessingMain { ... System.out.println("=== 2. ifPresentOrElse() ==="); // 'Of' -> 'Or' 수정 ...
-
미해결코틀린 함수형 프로그래밍 - 입문편
API 응답 처리 커스터마이징 vs Result 클래스 활용의 차이
안녕하세요! 제네릭 활용 실사례 학습 자료 중 API 응답 처리에 대한 내용이 있어서 질문드립니다.API 응답 처리 시 ApiResponse<out T> 와 같은 sealed class를 만들어 커스터마이징하여 사용하는 것이 이점이 있을지, 아니면 이미 코틀린 내장 클래스로 존재하는 Result 클래스 활용하는 것이 나을지 궁금하여 질문드립니다.sealed class ApiResponse<out T> data class Success<out T> (val data : T, val message : String) : ApiResponse<T>() data class Error(val message : String) : ApiResponse<Nothing>() fun <T> handleResponse(response: ApiResponse<T>) { when (response) { is Success -> println("Success: ${response.message}") is Error -> println("Error: ${response.message}") } }위처럼 커스텀하면 장점은 클라이언트 측과 통신할 때 서로 합의한 방식과 원하는 데이터를 자유롭게 전달할 수 있다는 장점이 있지만 Result에서 제공하는 함수형 메서드(fold,map등)를 활용하지 못하는 단점이 있다고 생각합니다. 반대로 Result를 사용하면 제공되는 함수형 메서드도 활용할 수 있지만, 응답 json을 커스터마이징 할 수 없다는 단점이 있습니다.이처럼 각자의 장단점이 있다보니, 장점을 모두 사용할 수 있도록 서비스 계층에서 Result를 반환하고 이를 컨트롤러에서 ApiResponse로 타입 변경하는 것은 어떤가요? 함수형 프로그래밍에 위반하진 않는지 궁금합니다.둘을 혼합해서 사용하는 것이 최선인지,, 각각 상황에 맞춰 써야하는 것인지 잘 느낌이 오지 않아 질문드립니다!
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
MyFuction과 switch문을 활용한 메서드는 고차함수 방식이 아닌가요?
수업 9분 50초 부근에서 "함수를 인자로 받아서 로직을 결정하는 형태가 전형적인 고차 함수이다."라는 부분이 있습니다. 하지만 getOperaion 함수를 보면 Myfunction을 반환하지만 인자로 코드 조각을 받지 않고 getOperation 내부에서 로직을 작성하게 되는 형태인데, 그럼 getOperation 함수는 고차함수라고 부르기 어려운걸까요??고차함수의 특징은 함수형인터페이스를 파라미터로 받아서 클라이언트 코드쪽에서 로직(코드 조각)을 람다식으로 받아서 처리하는 형태를 고차함수라고 이해하고 있습니다.하지만 getOperation은 파라미터로 String 타입 하나만 받고 람다식을 getOperation 내부에서 정의하고 있기에 코드 조각을 파라미터로 받지 않았으니 고차함수라고 보기 어려운걸까? 라는 의문점이 있습니다