묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
[질문] OOP 상속 VS 컴포넌트 방식에 대하여
강의에서 알려주신 것처럼 OOP적인 관점에서 상속을 통해 몬스터-플레이어에 대한 내부 속성(체력, 속도 등등)의 정의와 그에 따른 변화를 함수(데미지처리, UI처리 등등)로 구현하다보면 때때로 모호한 경우가 생겨 고민에 빠진적이 종종 있었습니다.참고하기 위해 인터넷을 통해 다른사람 코드를 보다, 내부 속성들 조차 클래스로 정의 및 컴포넌트화하여 활용하는 것을 보았습니다. 예를들면, OOP에선 플레이어 클래스안에 존재해야하는 것들이 Health, Stamina 등등 클래스로 만들어 붙이는 것을 보았습니다.이런 방식이 처음엔 좀 이질적이었는데, 몇번 보다 보니 정리하기는 좀 난잡해보이지만 의외로 논리적으로 처리하는데 편리하게 느껴졌습니다. 그러다 문득 어떤 방식이 좀더 선호되는지, 해당 방식을 쓰는게 좋을지 궁금하여 질문 올립니다또한, 최근 유니티쪽에서 언급되는 DOTS 같은 경우에 대해 어떻게 생각하시는지, 위의 컴포넌트 방식의 극대화하여 최적화를 추구하는 방식으로 이해하면 되는 것인지 궁금합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
Beverage 인터페이스
테스트의 질문과는 좀 벗어나는 질문입니다만.. 궁금해서 여쭤보게 되었습니다!간단한 프로젝트를 구성하는 과정에서 Beverage라는 인터페이스를 만들어 추상화를 진행하고 해당 인터페이스는 get의 행위만 가지고 있었습니다.그리고 추가된 라떼와 아메리카노 둘 다 같은 속성이지만 구현을 통해서 두 개의 구성 클래스를 만들어 예제를 진행하였는데요.이에 다음과 같은 의문점이 생겼습니다.인터페이스가 get이라는 행위만 가져도 사용해도 괜찮은지. 지금과 같은 상황에서는 확장에서의 의미로 추상 클래스가 더 괜찮을 것 같은데 사용하지 않은 이유가 있으신지 궁금합니다ㅎㅎ좋은 강의 제공해주셔서 감사합니다~
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
JDK 설치(해결완료 )
설치부터 막히네요 ㅎㅎ일단 echo로 시작하는 두 문장은 터미널에 붙여 넣고 실행했습니다. 그리고 brew help 터미널에 적고 다음으로 brew tap adoptopenjdk/openjdk 실행했습니다. brew search jdk한 후 brew install --cask adoptopenjdk8했는 데 오류가 뜨네요. 이유를 모르겠습니다.
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
함수형 인터페이스(전반전)에서 작성한 코드가 이해되지 않습니다.
안녕하세요 선생님🙇♀️함수형 인터페이스(전반전) 강의를 듣다 이해가 되지 않는 부분이 있어 질문 드립니다.public class _04_FunctionalInterface { public static void main(String[] args) { KRWConverter converter = new KRWConverter(); // converter.convert(2); convertUSD(converter, 2); } public static void convertUSD(Convertible converter, int USD) { converter.convert(USD); } }public static void convertUSD(Convertible converter, int USD) {converter.convert(USD);}에서 (Convertible converter, int USD) 이 부분이 이해가 되지 않았습니다. Convertible converter 를 사용한 이유가 무엇인가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
8강. 클래스 강의 중 return 값을 갖는 메소드
안녕하세요,8강. 클래스 강의 중 return 값을 갖는 메소드 관련하여 질문 드립니다. class에서 return값을 갖는 getVideoFileCount 메소드를 정의하고, main 영역에서 호출 시에 int fileCount = b1.getVideoFileCount(type: 1); 처럼b1.getVideoFileCount의 값을 저장하는 int fileCount 변수를 따로 정의해주었는데 그 이유가 무엇인지 궁금합니다. 만약 이와 같이 저장해주는 변수를 지정하지 않을 경우 어떻게 되는지, 혹시 return 값이 있는 메소드는 대게 저장하는 변수를 설정해주는 것인지 궁금합니다. 감사합니다.
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
8강.클래스 강의 중 메소드 관련 질문
안녕하세요,8강.클래스 강의 중 return값을 갖는 메소드 예제 관련 질문 드립니다. 블랙박스를 예시로 return 값을 갖는 메소드는 다음과 같았는데요, int getVideoFileCount(int type) { if (type ==1) { return 9; } 여기서 왜 type = 1 이라고 하지 않고, type ==1 이라고 하는지 궁금합니다. 그간 정수 전달값을 받고 조건문을 수행할때 단순히 i = 3 과 같이 하나의 등호만 사용했던 것 같아 헷갈려 질문드립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
@Qualifier를 찾는 용도라는 말이 조금 헷갈립니다ㅠㅜ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]@Qualifier 로 주입할 때 @Qualifier("mainDiscountPolicy") 를 못찾으면 어떻게 될까? 그러면 mainDiscountPolicy라는 이름의 스프링 빈을 추가로 찾는다. 하지만 경험상 @Qualifier 는 @Qualifier 를 찾는 용도로만 사용하는게 명확하고 좋다라고 하셨는데 여기서 @Qualifier가 @Qualifier를 찾는 용도란 생성자 자동주입 및 수정자 자동 주입 예시를 얘기하는게 맞는지 궁금합니다.
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
질문 드립니다!
안녕하세요, 강사님. 강사님 도움 덕분에 1회차 한번씩 다 돌리고 2회차 다시 정주행 하면서 복습중입니다. 이제 이 것도 거의 끝나가네요. 다 강사님 덕분입니다. 😄궁금한 것이 생겨 문의드립니다!ArrayList<Customer> customer = new ArrayList<>(); customer.add(new Customer(20, "챈들러")); customer.add(new Customer(42, "레이첼")); customer.add(new Customer(21, "모니카")); customer.add(new Customer(18, "벤자민")); customer.add(new Customer(5, "제임스")); customer.stream().map(x -> x.age >= 20 ? x.name + " 5000원" : x.name + " 무료" ) .forEach(System.out::println); 위와 같은 코드가 있을 때. 최종 연산 forEach 에서는 어떤 기준으로 cumtomer 객체의 name 값을 출력해주는지 알 수 있을까요? (따로 x.name 을 출력하라는 코드를 작성한게 없어 보이는데 name 만 한거 같아서요!) 데이터를 전체 출력해주는 거였다면 챈들러 5000원 20레이첼 5000원 42모니카 5000원 21벤자민 무료 18제임스 무료 5 이렇게 출력됐어야 할 것 같아서요. 그리고 혹시 만약 마지막 최종연산 forEach 에서 list 에 담긴 객체의 특정 필드값만 순회하면서 출력하는 방법도 있을까요?
-
미해결스프링 핵심 원리 - 기본편
수동, 자동빈 중복 등록 시 테스트코드에선 오류가 나지 않는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]수동빈과 자동빈을 중복 등록할 때 테스트코드에서는 에러가 뜨지 않았지만 CoreApplication을 실행시켰을 때는 에러가 납니다. 선생님께서 이는 스프링부트를 사용했을 때 에러가 나게 해주기 때문이라고 하셨었는데, 그렇다면 테스트코드의 Junit에서는 스프링부트가 아닌 스프링을 사용했기 때문에 에러가 나지 않은 건가요? 저희가 스프링부트 환경에서 코드를 작성하고 있는데 Junit에서만 스프링을 쓰는게 가능한가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
출력(전반전-정수)
정수 3자리마다 콤마가 찍히는 원리를 답변 받고 싶습니다 ㅠㅠ
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
getVideoFileCount 변수 선언하는 이유
안녕하세요 선생님🙇♀️클래스_메소드 강의를 보다 궁금한 점이 생겨 질문 남깁니다.BlockBox 클래스에 두 메소드를 넣었고, 04_Method클래스에 두 메소드를 활용한 문장이 있었는데요.insertMemoryCard()는 그대로 사용했지만, getVideoFileCount()는 다시 변수로 선언한 이유가 무엇인가요?감사합니다.void inserMemoryCard(int capacity) { System.out.println("메모리 카드가 삽입되었습니다."); System.out.println("용량은 " + capacity + "GB 입니다."); }void getVideoFileCount(int type) { if ( type == 1) { return 9; } else if ( type == 2) { return 1; } return 10; } b1.insertMemoryCard(256);int fileCount = b1.getVideoFileCount(1);
-
해결됨스프링 핵심 원리 - 기본편
@Configuration과 싱글톤강의를 따라하는데 값이 다르게 나옵니다.
@Configuration 어노테이션 안의 AppConfig 클래스에서 memberService와 orderService에 들어가는 memberRepository 설정이 각각 new로 MemoryMemberRepository를 생성한다 하더라도 그 MemberRepository들은 같은 싱글톤으로 있다는 강의 내용은 전부 이해했습니다.그런데 강의 내용 그대로 따라 코딩을 하였는데 결과값은 각각 다른 MemberRepository를 갖게 되더라구요... 그래서 제가 잘못한 것이 있는지 알 수 있을까 해서 질문드립니다.AppConfig@Configuration public class AppConfig { @Bean public static MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public static DiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } }MemberServiceImplpublic class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }OrderServiceImplpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }ConfigurationSingletonTestpublic class ConfigurationSingletonTest { @Test void configurationTest() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); System.out.println("memberService -> memberRepository = " + memberService.getMemberRepository()); System.out.println("orderService -> memberRepository = " + orderService.getMemberRepository()); System.out.println("memberRepository = " + memberRepository); assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); } }결과제가 강의 내용을 이해한대로라면 저렇게 3개가 같은 MemoryMemberRepository를 가져야 할것같은데 제가 뭔가 잘못 작성한것이 있을까요...?
-
해결됨스프링 핵심 원리 - 기본편
테스트에서 @BeforeEach 안에 AppConfig를 생성하고 사용하는 이유
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 단위 테스트 도중에 @BeforeEach 사용시 어떤 이점이 있는지 궁금해서 질문 드립니다.public class orderServiceTest { AppConfig appConfig = new AppConfig(); MemberService memberService = appConfig.memberService(); OrderService orderService = appConfig.orderService(); }이렇게 사용하는 것보다 @BeforEach 어노테이션을 사용해서public class orderServiceTest { MemberService memberService; OrderService orderService; @BeforeEach public void beforeEach(){ AppConfig appConfig = new AppConfig(); memberService = appConfig.memberService(); orderService = appConfig.orderService(); }이렇게 작성하는게 좋다고 말씀하셨는데제 생각에는 그 이유가 1번 처럼 작성하면 다른 테스트 진행시 기존의 선언되어 있는 meberService 객체에 남아있는 데이터?가 있어서 오류가 날 수 있어 초기화와 같은 목적으로 @BeforeEach를 사용하여 매번 테스트를 실행시킬때마다 새롭게 의존관계 주입을 하는 것 같은데정확한 의미를 알고 싶어서 질문 드립니다.
-
미해결스프링 핵심 원리 - 기본편
AppConfig에 질문이 있습니다.
@Configuration에 @Component가 있으면 메서드들은 자동으로 빈으로 등록되는 것으로 강의를 보면서 이해했습니다. 그러면 AppConfig에서 @Bean을 메서드마다 붙이지 않아도 @SpringbootApplication에 있는 @ComponentScan이 자동으로 component들을 빈으로 등록해줘서 의존관계 주입이 되는 거 아닌가요? 내가 잘못 이해하고 있는 거면 답변 부탁드립니다.
-
미해결스프링 핵심 원리 - 기본편
getBeanDefinitionNames()관련해서 질문이요
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.컨테이너에 등록된 모든 빈을 조회할때Object bean=ac.getBean(beanDefinitionName);으로 bean을 찾았습니다.근데 밑 내용에서 스프링 컨테이너 에서 스프링 빈을 찾는 가장 기본적인 조회방법은 ac.getBean(빈이름,타입), ac.getBean(타입)으로 찾습니다.즉 매개변수를 하나로 찾으려면 ac.getBean(타입)으로 찾아야한다는 말과 같습니다.ac.getBean(beanDefinitionName)은 beanDefinitionName을 출력했을때 타입이 아니라 빈 이름인것 같은데 이게 어떻게 된걸까요?
-
미해결스프링 핵심 원리 - 기본편
NoUniqueBeanException 에러
https://www.inflearn.com/questions/776767/nouniquebeandefinitionexception-%EC%97%90%EB%9F%AC해당 글이랑 똑같은 에러, 상황인데 혹시 해결되셨나요? 답변이 없어서요 Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,getDiscountPolicy
-
해결됨스프링 핵심 원리 - 기본편
@Autowired 사용법 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]<컴포넌트 스캔과 의존관계 자동 주입 시작하기>강의에 질문 드립니다. 강의를 보면 RateDiscountPolicy에 @Component를, OrderServiceImpl에서 @Autowired를 이용하여 의존성을 주입해주고 있는데요. "스프링이 DiscountPolicy에 대해 아는 정보가 RateDiscountPolicy밖에 없기 때문에(@Component) @Autowired를 사용하여 의존관계를 주입하지 않아도 알아서 의존관계를 설정해주지 않을까?라는 궁금증이 생겨 아래 테스트를 작성해보았습니다. >> 위 설정으로 테스트를 작성하고 수행했을 때, 테스트가 통과되는 것을 확인했습니다.예상대로 아래 로그와 같이 스프링이 OrderServiceImpl과 RateDiscountPloicy의 의존관계를 설정해주고 있었습니다.>> 질문 1. 위 케이스대로면 생성자만 만들고, @Autowired설정 없이 의존관계를 주입하고 싶은 구현체만 @Component로 등록하면 되지 않을까요? >> 질문 2. @Autowried를 꼭 사용해야 하는 이유가 있을까요? 예를 들어 구현체 여러개가 빈으로 등록되어야 한다든지..(이 경우는 컴파일 에러가 나는 것 같은데 다른 설정법이 있는건가요?)
-
해결됨그림으로 배우는 자바, 파트2: 객체지향!
클래스 실행 순서가 궁금합니다.
정답 코드 입니다.public class PlayerTest { public static void main(String[] args) { // 점수 배열 생성 int[] points0 = { 10, 9, 9, 8 }; int[] points1 = { 9, 10, 9, 9 }; int[] points2 = { 10, 9, 10, 10 }; // 선수 객체 생성 Player p0 = new Player("Kim", points0); Player p1 = new Player("Lee", points1); Player p2 = new Player("Park", points2); // 객체 배열 만들기 Player[] players = { p0, p1, p2 }; // 선수별 총점 출력 for (int i = 0; i < players.length; i++) { players[i].printTotalPoints(); } } } class Player { // 필드 String name; // 이름 int[] points; // 점수 // 생성자 Player(String str, int[] arr) { name = str; points = arr; } // 메소드 void printTotalPoints() { /* 2. 형식 문자열을 만드세요. */ System.out.printf("%s -> %d점\n", name, totalPoints()); } int totalPoints() { int sum = 0; for(int i = 0; i < points.length; i++){ sum += points[i]; } return sum; } } 위의 코드에서 'totalPoints()'메소드를 안에있는 for문 조건식 i<points.length;대신 점수 배열을 크키를 구하는데 저는 main메소드가 먼저 실행되는 것으로 알고 있어 points0 배열이 생성될 때 값도 대입했기 때문에 바로 크기를 알 수 있을 것으로 판단해 아래와 같이 points0.length 또는 points[i].length를 사용하려고 했으나 불가능하였습니다. for(int i = 0; i < points0.length; i++){ sum += points[i]; } 혹시나 main 메소드 부터 실행되는 것이 아니라면 points변수에 static을 부여해 프로그램이 시작하자마자 점수 배열을 생성을 하고 point[i].length를 사용해봤으나 'illegal start of expression' 라며 잘못된 표현이라는 에러가 나왔습니다. static int[] points0 = { 10, 9, 9, 8 }; static int[] points1 = { 9, 10, 9, 9 }; static int[] points2 = { 10, 9, 10, 10 }; 위와 같은 방법으로 풀면 왜 에러가 나는지 궁금합니다!
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
추상 클래스 / 익명 클래스
강사님, 안녕하세요. 우선 많은 강의 내용 중 생기는 질문에 대해서 항상 친절하게 답변해주시는 점 감사드립니다. 😊다름이 아니고 익명 클래스 (후반전) 에서 추상 클래스를 직접 상속받아서 객체 생성과 동시에 메서드를 오버라이드 하는 것과 객체 메서드로 반환받아 하는 것이 어떠한 기능적인 차이가 있는 것인지 궁금하여 여쭤봅니다!개인적으로는 별도의 메서드로 객체를 반환 받는 형태가 직관적으로 와닿지 않아서 어렵게 느껴지는 듯 합니다.단순히 코드의 유지보수나 가독성을 높이는 목적 때문에 추상 클래스의 메서드를 직접 상속받는 형태보다 익명클래스를 활용해 메서드로 객체를 반환받는 형식으로 하는걸까요?
-
미해결스프링 핵심 원리 - 기본편
@Autowired 오류입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]먼저, 항상 좋은 강의 감사드립니다!@Autowired에서 빨간줄이 뜨고Autowired members must be defined in valid Spring bean (@Component|@Service|...) 라는 문구가 뜨게됩니다 어떻게 해결해야 하나요?