의문이 드는게 어디냐면 calc에서 Money.won( (long) Math.ceil( money.doubleValue ) ) 을 통해서 Money를 만들어내잖아요. 일단 설명의 용이성을 위해 static won이나 메소드 doblueValue 생략하신건 문제 없습니다만.. 1. money.doubleValue는 환률과 무관한 컨텍스트로 토해지는 값인거 같은데 2. 그 값을 바탕으로 won을 통한 Money를 만들어도 되는거냐 싶은 생각이 너무 들어요 ^^; 아예 값과 참조에 집중하려면 Money.value(long)같은걸로 했어야 하지 않았나 싶은... 실제 이어지는 ceil의 메소드화에서는 아예 won의 도움없이 Money를 숫자기반으로 만들기도 했구요.
메서드가 한가지 이유로 변경될 때까지라는 기준이 모호하기도 하고 약간 실무상으로 반대하는 입장이기도 합니다. 우선 한가지 이유라면 이미 run도 한가지 이유(실행하기 위해) welcome도 인사말하기 위해 이기 때문에 매우 모호합니다. 반대로 showRoom조차도 일종의 템플릿 메소드 파트와 Room이 처리하는 부분으로 나뉜 것으로 되어있죠. 그런 면에서 저는 실무에서 메소드 추출을 멈추는 실제적인 기준을 변화율로 두고 있어요. 그 동네가 한꺼번에 변하냐 아니냐로 보는 방식입니다. 만약 welcome수준이 한꺼번에 팀장 회의에서 갈려나가는게 일반적이라면 거기서 멈추고 showRoom에서도 room자체의 설명을 보여주는 부분만 자주 바뀌면 다시 추출하는 방식인거 같아요.
지역변수를 필드변수로 승격하는 것에 대한 문제를 생각하게 됩니다. 기존에는 running이 지역스코프라 확실하게 문제 범위를 play라고 안심할 수 있었던 것에 비해 필드로 옮겨지면서 왠지 //이건 play()에서만 사용됨 boolean running; 이라고 해야 할 거 같은 느낌이네요. 저는 이 경우 스코프 제한을 더 우선 시 하는 편입니다만 이는 이 메소드에서는 괜찮지만 동시성이나 여러가지를 고려하면 더욱 안좋은 습관이지 않냐라는 생각도 듭니다.
1-1에서 미래를 예측할 수 없어 실제로 변경이 발생했을 때 적합한 설계로 개선한다고 했는데 이게 약간 도돌이표 느낌이에요. 왜냐면 설계를 선택할 때 변경될 가정을 기반으로 한다고 했기 때문입니다. 즉 1. 변경 방식에 따라 설계를 선택 2. 변경이 발생하면 설계를 변경 아니 이러면 변경에 대응하기 위한 설계가 아니라 변경 시 마다 설계를 바꾼다는 것인데 애당초 설계를 왜 한 건가 싶은 생각이 맴도는 느낌이네요. 저는 설계를 코드를 변화율에 따라 재배치한다고 생각했는데 변화가 일어날 때마다 설계를 변경할 거면 그건 그냥 설계가 아니라 변경에 따라 코드를 수정한 것 같은..
# 단어 입력 / 목록 리스트 출력 # 목록 리스트 입력 / 중복 검사 리스트에 이미 있는 요소인지 확인 후 각 요소를 다른 문자가 나오기전까지 중복 검사 리스트에 저장 # 중복 검사 리스트가 온전히 만들어진걸 카운팅 +1 입력 / 카운팅 출력 import sys input = sys.stdin.readline t = int(input()) cnt = 0 words = [] for _ in range(t): words.append(input()) for word in words: used_li = [] cur_word = '' flag = 1 for c in word: if cur_word != c and c not in used_li: cur_word = c used_li.append(c) continue if cur_word == c: continue if cur_word != c and c in used_li: flag = 0 break if flag == 1: cnt += 1 print(cnt) 헤이밥 강의를 보고 평소 풀던 방법이 아닌 모듈화로 쪼개서 풀어보려 하는데 괜찮은지.. 그리고 조건문을 좀 복잡하게 달아서 푼 것같은데 방법론적으로 좋은 접근인지도 조언을 구하고 싶습니다.
안녕하세요, 먼저 좋은 강의 제공해주셔서 감사합니다. 설계 방법에 대한 이론적인 내용 부분에서 좀 더 명확한 정리를 하고 싶어 고견을 얻고자 질문 드리게 되었습니다. 책임 주도 설계와 GRASP 지침에 따른 설계를 차례로 보여주는 방식으로 설명을 해주셨는데요, 이때 도메인의 개념을 조금 다른 시각으로 보면 그게 도메인 주도 설계(DDD) 와 유사하지 않나 하는 생각이 들었습니다 (아키텍처 부분에서도 use case 와 같은 부분은 다비 비에이라의 헥사고널 아키텍처에서 사용하는 개념과 동일한 개념이 아닌가 생각했습니다) 전체적인 객체 지향 설계 방식의 흐름을 설명해주시며 연관된 다른 설계 방식의 내용을 같이 의도하여 말씀해 주신 건지 아니면 그런 한 설계 방식들을 어떻게 정리하고 계신지 고견 주시면 감사하겠습니다. *추가적으로 CRC 를 작성하실때 편리하게 사용하시는 툴 혹은 방식이 있으시다면 공유해주시면 감사하겠습니다.
Exchange Problem문제 질문있습니다. 이 문제를 분석하다가 어려워서 질문드립니다. 제가 분석한 결과는 dp를 통해 모든 경우의 수를 구한 것과 그리디를 통해 구한 경우의수를 비교하는 문제 같았습니다. 근데 예시를 보고 어떻게 문제를 접근해야하는지 모르겠습니다. 8 1 5 10 50 100 500 1000 10000 위의 예시처럼 밑의 8개의 단위로 된 동전을 통해서 모든 단위(1원~9999원)의 동전에 대해 그리디가 맞다면 yes이고 아니면 no를 택하는것인가요? 너무 어렵습니다... 혹시 파이썬 답안을 알려주실 수 있으신가요? 아니면 추가적인 강의에 대한 생각이 있으신지도 궁금합니다.
안녕하세요, 강의 잘 듣구 있습니다. 다름이 아니라 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; } }
안녕하세요 강사님 좋은 강의 만들어주셔서 감사합니다. 책도 같이 구매하였는데요 멀티프로그래밍 패러다임 책과 이 강의를 보면 강사님의 다른 함수형 프로그래밍 자바스크립트, 함수형 프로그래밍 자바스크립트 응용편은 따로 보지 않아도 되나요? 혹은 다른 내용을 가지고 있어 전부 보는게 좋을까요?
안녕하세요 수강자입니다. 현재 2진수로 변환할때의 재귀함수 호출부분을 듣고있습니다. 1.종료조건, 2.재귀조건 3.데이터통합 으로 심플하게 나눠서 생각하는 방법 알려주셔서 감사합니다. 하지만 재귀함수를 할때, 스택의 개념을 설명해주지 않으셔서 뭔가 2% 개념이 부족한 느낌을 받았습니다. 완전 초보자 입장에서, 코드를 한줄한줄씩 공책에 써가며 결과값이 어떻게 나오는지 확인하는 과정중에, 설명해주신 개념과 풀이법이 직관적이며 머리에 쏙쏙박히기는하는데 왜 그렇지 하는 생각이 들어서요.
안녕하세요. 용호님 좋은 강의 만들어 주셔서 감사합니다. 강의를 통해 객체지향에 대해 많이 알게 되었습니다. 저의 질문은 용호님 께서는 신규프로젝트를 시작하실때 db설계를 먼저 완료하시는지, 도메인설계를 먼저 완료하시는지, 아니면 두 과정을 병렬로 진행하사는지 궁금합니다. 감사합니다.