묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨오브젝트 - 설계 원칙편
6-2 보호 로직 중복 이슈
안녕하세요 강사님, 강의 잘 보고 있습니다. 이동 로직을 정리하다가 보호(가드) 로직 중복에 대해 질문드립니다.현재 구조에서 Game.tryMove()에서 player.canMove(dir)로 먼저 확인하고, Player.move(dir) 내부에서도 canMove(dir)를 다시 확인하여 막습니다.즉, 이동 가능 여부 판정이 두 번 수행됩니다.// Game private void tryMove(Direction dir) { if (player.canMove(dir)) { // 1차 player.move(dir); // 내부의 2차 showRoom(); } else showBlocked(); } // Player public void move(Direction dir) { if (!canMove(dir)) throw new IllegalArgumentException(); this.position = this.position.shift(dir); } 두 번의 가드가 필요한 이유가 있을까요? SRP/TDA 관점에서는 Game의 판정을 제거하고 player.tryMove(dir)만 호출해 결과만 처리하는 패턴이 더 적절한지, 혹은 move()만 두고 예외로 제어하는 방식을 권장하시는지 궁금합니다.
-
해결됨오브젝트 - 설계 원칙편
3-2 메서드를 얼마나 작게 나누는게 적절한가요?
안녕하세요. 좋은 강의 감사합니다. 덕분에 객체지향에 대한 이해가 많이 정리되었습니다.3-2 강의를 보다 메서드 크기 관련해서 궁금한 점이 있어 질문드립니다.콘솔 입력 의존성(12:17) 부분에서 입력을 분리하는 예시로 아래와 같이 nextLine() 호출을 별도 메서드로 추출하신 것으로 이해했습니다.private String input(){ return Scanner.nextLine(); }그런데 이 관점이라면, 입력 “수집(I/O)” 뿐 아니라 “입력 파싱(문법)”도 별도의 책임으로 분리해야 하는 것 아닌지 고민이 됩니다. 예를 들어:private String[] inputParsing(String input){ return input().toLowerCase().trim().split("\\s+"); }강사님의 강의 및 "객체지향의 사실과 오해" 책을 읽고 난 뒤, SRP의 책임을 ‘하나의 변경 이유’로 보았습니다.위의 콘솔 입력(nextLine)을 분리한 건 입력 장치 변경이라는 액터에 대한 책임 분리로 이해했습니다.그렇다면 입력 파싱(toLowerCase/trim/split)은 명령 문법 변경이라는 또 다른 액터에 대한 책임이므로, 이 역시 별도로 분리해야 SRP를 완전히 지키는 게 아닐까요? 물론 이렇게까지 분리하면 가독성이 떨어질 수 있고, 실제로는 변경 가능성도 낮아 “가치가 작은 분리”로 느껴지기도 합니다. 강사님의 의견이 궁금합니다!+ 외에도 추상화 수준을 맞추기 위한 메서드 추출(9:25) 강의 자료에isRunning 함수의 반환이 void로 되어있으나 실제 내부에선 running == true를 반환합니다. github 코드 상에는 해당 함수가 없어보입니다.
-
해결됨유니티 시스템 프로그래밍 Pt.2 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
우편 기능에 대해 궁금합니다.
안녕하세요. 강의 잘 듣고 있습니다. 모바일 게임에서 흔히 볼 수 있는 우편을 통해 재화를 보상을 주는 우편 시스템에 대해 궁금합니다.강의 내에는 우편 관련 기능이 없긴 하지만 혹시 강사님께서는 우편 기능을 어떻게 구현해서 사용하시는지 알려주시면 큰 도움이 될 것 같습니다. 국내에서는 뒤끝과 같은 외부 서비스에 도움을 받아 할수있지만 혹시 개인이 다른 방법으로도 사용할 수 있을지 궁금해서 여쭤봅니다~!!감사합니다~
-
해결됨오브젝트 - 기초편
영화, 상영, 예매 도메인 관계에 대한 질문
안녕하세요 강의 듣고 복습을 하고 있는 수강생입니다. 영화예매 시스템의 데이터베이스 설계의 관점에서 봤을때, 처음 생각나는 도메인은 영화, 예매 두개의 도메인을 고민했습니다. 하지만 영화, 예매는 N:M 관계로 판단이 됐으며,다대다 관계를 해소하기 위하여 상영이라는 도메인이 나왔나? 라고 생각했습니다. 이 관점으로 상영이라는 도메인을 고려하였는지 궁금합니다. 그게 아니라면 상영이라는 도메인이 나올 수 있었던 과정에 대해 설명해주시면 감사드리겠습니다.
-
해결됨유니티 시스템 프로그래밍 Pt.2 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
41-원격 리소스 다운로드 강의의 후반에 실습할 텍스쳐가 없습니다.
37:25 경의 강의 부분에서 텍스쳐 교체에 따른 어드레서블 적용과 다운로드 구현을 위한 변경될 실습 텍스쳐(보라색)가 첨부파일에 존재 하지 않습니다.
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
안녕하세요 메서드명 때문에 고민이 있어서 질문드립니다.
안녕하세요 강사님제가 create 메서드 명에 대해서 고민중인데private void createTip(RequestTipDto requestTipDto, User user) { Tip tip = Tip.builder().title(requestTipDto.getTitle()).content(requestTipDto.getContent()).user(user).build(); tipRepository.save(tip); } private Tip createTip(RequestTipDto requestTipDto, User user) { Tip tip = Tip.builder().title(requestTipDto.getTitle()).content(requestTipDto.getContent()).user(user).build(); return tip; } tipRepository.save(tip); 첫번째 코드는 create메서드 안에 tip을 빌더로 생성하고 save까지 같이 하는 코드입니다.두번째 코드는 tip을 빌더로 생성 후 리턴하고 해당 createTip을 호출한 메서드에서 save를 하는 코드입니다. 첫번째 코드는 둘이 같이 할 수있다는 장점이 있고, createTip하고 save를 또 따로 할 필요가 없는 장점이 있고두번째 코드는 나중에 재상용성이나, create메서드안에서는 create만 하는 SRP(단일책임원칙)을 하고 있다는 것이 장점입니다. 위 두가지 방법중 어느것이 더 좋은 방법일까요?그리고 위처럼 builder를 사용하는 코드는 길기 때문에 이를 service 클래스에서 따로 빼서 하는게 좋은지 아니면 entity 클래스에서 하는게 좋은지 궁금합니다. 강의 잘 보고 있습니다.
-
해결됨[CS 기술면접 6] 말이 트이는 자바와 객체지향
강의 잘 들었습니다. 혹시 다음 내용 추가하실 생각 있으실까요?
강의 정말 잘 들었습니다! 혹시 아래 내용들을 추가해주실 계획이 있으실까요?예외 처리 파트에서 Checked Exception & Unchecked Exception 관련 간단한 언급StringBuilder & StringBuffer 설명 시, String Constant Pool 개념에 대한 보충별개로 네트워크 강의 부분에서도 HTTP 버전별 특징과 Keep-Alive 지원 여부에 대한 설명 추가지금도 매우 훌륭한 강의이지만. 위 내용이 포함되면 취준생 입장에서 조금 더 많이 도움을 받을 수 있을 것 같습니다. 혹시 고려해주실 수 있을까요? 감사합니다!
-
해결됨C개발자를 위한 최소한의 C++
이동생성자의 매개변수로 넘어가는 임시객체의 값 유지 관련하여 질문이 있습니다.
안녕하세요.이동시멘틱 강의를 보다가 의문이 있어 문의드립니다.강의에 나오는 CMyString 클래스는 내부 포인터 변수 멤버를 가지고 있는데, CMyString a,b,c;에서 a = b+c;를 실행할 때CMyString operator+() 함수의 return값의 사본이 임시객체에 저장되고 이 임시객체가 이동생성자의 매개변수에 들어가는 것이 맞을까요?만약 그렇다면 사본을 가진 임시객체의 포인터 변수 멤버의 값이 return 값의 포인터 변수 멤버의 값과 같을텐데 return 후 return값이 소멸함에도 이동생성자 내부에서 사본은 어떻게 계속 값을 유지하는걸까요?이동생성자 호출 시에는 이동생성자 종료 전까지 return 값이 사라지지 않는걸까요?사본이라고 표현하신 것의 의미도 궁금합니다...사본은 모든게 다 똑같은 복사본인걸까요..?근데 그러면 참조자와 같은것일것같은데 반환형식이 참조자는 아니고... shallow copy한 것도 아니고 deep copy한 것도 아닌것 같은데...너무 헷갈리네요...감사합니다.
-
해결됨유니티 시스템 프로그래밍 Pt.2 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
로컬 알림과 다국어 지원에 대해 궁금합니다.
안녕하세요. 유니티 시스템 프로그래밍 파트 1, 파트 2 강의 잘 듣고 있습니다. (두개 모두 번갈아 가며 필요한 부분 먼저 듣고 있는 상태입니다. ) 모바일 게임 서비스에 중요한 요소중에 하나로 로컬 알림과 서버 알림이 있는데 이 중에서도 로컬 알림에 대한 강의는 없는 것 같습니다. 혹시 제가 못 찾은 건지 아니면 이 강의가 없다면 추가로 강의를 만들어주실 수 있으신지 궁금합니다. 다국어 부분에서 CSV 파일을 로드해서 각 나라에 맞게 언어를 바꾸고 있긴 한데 CSV 파일 내 문자열에서 , 가 포함되어 있는 경우는 문제가 되지 않을까 싶습니다. 혹시 이런 경우일 때 어떻게 처리를 하실지 궁금합니다. 이상입니다. 유용한 강의 감사드립니다~
-
미해결김영한의 실전 자바 - 중급 1편
자바 equals() 메소드에 대한 물리적 동일성, 논리적 동등성 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]여기에 질문 내용을 남겨주세요.김영한 자바 중급1의 섹션2에서 equals의 동일성과 동등성에 대한 내용의 퀴즈내용중에서 질문이 있습니다.(이미지 참조) 자바에서는 기본적으로 "=="연산자와 equals()메소드는 "물리적 동일성"으로 println을 했을때 둘 다 false로 잡히는것으로 이해가 되고 있는데요. 오버라이드를 별도로 생성해야 물리적 동일성과 논리적 동등성에 대한 euqals메소드를 차이점을 갖고 사용할 수 있는것으로 이해했습니다. 맞을까요?그렇다면, 위의 섹션2 퀴즈 내용에서의 문제같은 경우는 좀더 세부적인 명시가 있어야 하는게 아닌지 아니면 제가 이해를 잘 못하고 있는 부분이 있는지 조언이 필요하여 Q&A에 질문을 남깁니다. 좋은 가르침 항상 감사합니다 ( _ _ )
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 제보
4번 스레드 제어와 생명 주기2 PDF의 24페이지 "그리고 스캐줄링 큐 ..." -> "그리고 스케줄링 큐 ..." 7번 고급동기화 PDF의 1페이지 "LockSupport의 대표적인 기능은 가능과 같다" -> "LockSupport의 대표적인 기능은 다음과 같다"
-
해결됨김영한의 실전 자바 - 중급 1편
강의록 오타 제보
[제보 내용]대상 강의록:7. 중첩 클래스, 내부 클래스1.pdf위치:p.3의 두 번째 코드 블록(= process() 있는 곳)오타 내용:수정 전: int lcoalVar = 0;수정 후: int localVar = 0;궁금한 내용이 생겨 복습하러 왔다가 겸사겸사 오타도 발견하고 가네요.항상 좋은 강의 감사합니다!
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
한글이 깨질 떄 어떻게 해야 하나요?
Configuration UTF-8 로 돌려도 똑같습니다.
-
해결됨유니티 시스템 프로그래밍 Pt.2 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
통합 에셋
이번 강의는 통합 에셋이 따로 제공되지 않을까요?감사합니다
-
미해결스프링 핵심 원리 - 기본편
생성자 자동주입 관련해서
public class OrderServiceImpl implements OrderService { MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; discountPolicy = new FixDiscountPolicy(); } private final MemberService memberService=new MemberServiceImpl(memberRepository); @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member falsemember = memberService.findMember(memberId); Member member = memberRepository.findById(memberId); int discount = discountPolicy.discount(member,itemPrice); return new Order(memberId,itemName,itemPrice,discount); } } 2회독이라서, 15강을 들으면서 자동주입관련해서 생각이 나서, 강의를 들으면서 자체적으로 작성해봤습니다. MemberRepository를 주입해서 의존성 문제를 해결하려고 여러방면으로 고민하던중 왜 falseMember를 구하는 로직 중 MemberService 부분에서 계속 널 포인터익셉션이 터지는지 이해가 가지않아 질문드립니다.MeberServie의 구현체에도 레포지토리를 주입받아서 널포인터 익셉션이 안터지는 것이 정상이라고 생각되는데 원인 말씀해주시면 감사드립니다.
-
미해결김영한의 실전 자바 - 중급 1편
자바의 기본 클래스들에 관하여
[질문 내용]안녕하세요 영한님자바 강의로 프로그래밍 입문을 하게되어 처음 질문 드립니다.배우다보면 자바의 다양한 기본 클래스랑 메서드가 있는것 같은데 이를 작성하는 방법을 일일이 외워야할까요?아니면 일종의 도구처럼 추상적으로 이해하고 필요할때 복붙해서 쓰는 정도로 넘어가면 될까요?
-
해결됨오브젝트 - 기초편
[오타제보] 6-4. 캡슐화
안녕하세요.좋은 강의 감사합니다.사소하지만 더 나은 품질을 위해 제보 드립니다. 6-4. 캡슐화 강의 = 7분19초SOLID 원칙 개방-폐쇄 원칙 약어 수정 필요LSP > OCP개방-폐쇄 원칙의 약어가 이전 설명의 리스코프 치환 원칙의 약어로 잘 못 표기된것으로 보입니다.항상 좋은 강의 감사합니다.
-
해결됨오브젝트 - 기초편
리스코프 치환원칙에 대해 질문드립니다!
6-4 캡슐화에서 서브타입이 슈퍼타입을 대체할 수 있는 것이 SOLID 원칙 중 리스코프 치환원칙이라고 하셨는데 제가 알고있는 리스코프 치환원칙은 서브타입은 슈퍼타입을 대체 할 수 있어야 하고 슈퍼타입에서의 행위를 서브타입에서도 동일한 결과값이 예상될 수 있어야한다로 알고있습니다!e.g) Collection의 add 메소드는 어떤 서브타입이여도 "추가"한다는 행위가 되어야한다"서브타입이 슈퍼타입을 대체할 수 있다" 도 리스코프치환원칙의 특징이 맞지만 해당 원칙이 전하려는 주된 내용은 행위의 같은 예상 결과값으로 보여서요! 어떻게 생각하시는 지 궁금합니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
runnable 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]섹션 3에서 runnable를 인터페이스로 불러서 사용할 때 static으로 정의하는 이유가 있나요? 그리고 간간히 왜 이거는 생성자를 받아오지 않고 바로 써야 하는지, 이건 왜 static을 써야 하는지 등등의 의문이 드는데 제가 자바에 대한 이해가 부족해서 그런 걸까요? ㅜㅜ 중급편 내용이 아는 내용이라 건너뛰었는데 중급도 수강하는게 맞을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
자바가 아닌 다른 언어에서도
동작원리자체는 동일할까요?닷넷에서 테스트코드 작성해도 동일할지 궁금합니다.