묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
퀴즈 #10 질문이요~~
강의 잘 듣고 있습니다! 이것저것 해보다가 궁금한게 생겼어요. 19번째 줄이 실행되는 순간 customerList의 fee 값이 바뀌어야 하는거 아닌가요? 20번째 줄을 안쓸때는 아래처럼 fee값이 안바뀐채로 출력되는데 챈 50 0 레 45 0 모 40 0 벤 20 0 제 10 020번째 줄을 쓰니까 이렇게 나오는 이유가 궁금합니다!챈 50 2000 레 45 2000 모 40 2000 벤 20 0 제 10 0
-
미해결스프링 핵심 원리 - 기본편
싱글톤 스코프와 Test 시 .class 역할에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. 싱글톤을 사용시 자동으로 관리해주기 때문에@PostConstruct,@PreDestroy 를 사용안해도 되는게맞다면 빈 콜백생명주기 함수 때 따로 적용해서 DB클클라이언트, 네트워크 사용시 쓴다했는데싱글톤 스코프로 한다면 쓸 일이 없는걸까요 ??@PostConstruct,@PreDestroy 방법이 싱글톤 스코프를 사용 시 전부 자동으로 해결이 되는건지 ?? @PostConstruct,@PreDestroy 싱글톤 스코프를 사용시 따로 안써줘도 되는건지 ?네트워크나 db 연결 같은 시에만 사용을 하는건지 ... 헷갈려서 질문 남깁니다. 2.new AnnotationConfigApplicationContext() 에서괄호 안에 .class 적을 시 해당 클래스는 자동으로@ComponentScan 적용 대상이 된다고 하셨는데괄호 안에 .class 지정 시 @Component 사용을 안해도되고 .class 지정 시 해당 클래스에@Configuration,@ComponentScan 이 붙는다고 생각을 해도 되는 걸까요 ?
-
미해결홍정모의 게임 만들기 연습 문제 패키지
15:00 부근 질문 있습니다.
#pragma once #include "Game2D.h" namespace jm { class MyTank { public: vec2 center = vec2(0.0f, 0.0f); //vec2 direction = vec2(1.0f, 0.0f, 0.0f); void draw() { beginTransformation(); { translate(center); drawFilledBox(Colors::green, 0.25f, 0.1f); // body translate(-0.02f, 0.1f); drawFilledBox(Colors::blue, 0.15f, 0.09f); // turret translate(0.15f, 0.0f); drawFilledBox(Colors::red, 0.15f, 0.03f); // barrel } endTransformation(); } }; class MyBullet { public: vec2 center = vec2(0.0f, 0.0f); vec2 velocity = vec2(0.0f, 0.0f); void draw() { beginTransformation(); translate(center); drawFilledRegularConvexPolygon(Colors::yellow, 0.02f, 8); drawWiredRegularConvexPolygon(Colors::gray, 0.02f, 8); endTransformation(); } void update(const float& dt) { center += velocity * dt; } }; class TankExample : public Game2D { public: MyTank tank; //MyBullet* bullet = nullptr; //MyBullet* bullet2 = nullptr; // bullet은 총알이 발사됐을 때만 존재하기 때문에 포인터로 되어있고 nullptr로 초기화가 되어있다. //TODO: allow multiple bullets int index = 0; std::vector<MyBullet*> ptr_bullet_array = { nullptr }; //TODO: delete bullets when they go out of the screen public: TankExample() : Game2D("This is my digital canvas!", 1024, 768, false, 2) {} ~TankExample() { //if (bullet != nullptr) delete bullet; //if (bullet2 != nullptr) delete bullet2; for (int i = 0; i <= index; ++i) { if (ptr_bullet_array[i] != nullptr) delete ptr_bullet_array[i]; } } void update() override { // move tank if (isKeyPressed(GLFW_KEY_LEFT)) tank.center.x -= 0.5f * getTimeStep(); if (isKeyPressed(GLFW_KEY_RIGHT)) tank.center.x += 0.5f * getTimeStep(); if (isKeyPressed(GLFW_KEY_UP)) tank.center.y += 0.5f * getTimeStep(); if (isKeyPressed(GLFW_KEY_DOWN)) tank.center.y -= 0.5f * getTimeStep(); // shoot a cannon ball if (isKeyPressedAndReleased(GLFW_KEY_SPACE)) { //if (bullet == nullptr) //{ // bullet = new MyBullet; // bullet->center = tank.center; // bullet->center.x += 0.2f; // bullet->center.y += 0.1f; // bullet->velocity = vec2(2.0f, 0.0f); //} //else if (bullet2 == nullptr) //{ // bullet2 = new MyBullet; // bullet2->center = tank.center; // bullet2->center.x += 0.2f; // bullet2->center.y += 0.1f; // bullet2->velocity = vec2(2.0f, 0.0f); //} ptr_bullet_array.push_back(nullptr); ptr_bullet_array[index] = new MyBullet; ptr_bullet_array[index]->center = tank.center; ptr_bullet_array[index]->center.x += 0.2f; ptr_bullet_array[index]->center.y += 0.1f; ptr_bullet_array[index]->velocity = vec2(2.0f, 0.0f); index++; } //if (bullet != nullptr) bullet->update(getTimeStep()); //if (bullet2 != nullptr) bullet2->update(getTimeStep()); // rendering tank.draw(); //if (bullet != nullptr) //{ // bullet->draw(); //} //if (bullet2 != nullptr) //{ // bullet2->draw(); //} //if (bullet != nullptr && bullet->center.x > 1.2f) //{ // delete bullet; // bullet = nullptr; //} //if (bullet2 != nullptr && bullet2->center.x > 1.2f) //{ // delete bullet2; // bullet2 = nullptr; //} //for (int i = 0; i <= index; ++i) //{ // if (ptr_bullet_array[i] != nullptr && ptr_bullet_array[i]->center.x > 1.2f) // { // delete ptr_bullet_array[i]; // ptr_bullet_array[i] = nullptr; // } //} for (int i = 0; i <= index; ++i) { if (ptr_bullet_array[i] != nullptr) { ptr_bullet_array[i]->update(getTimeStep()); ptr_bullet_array[i]->draw(); if (ptr_bullet_array[i]->center.x > 1.2f) { delete ptr_bullet_array[i]; ptr_bullet_array[i] = nullptr; } } } } }; }교수님께서 설명하신 대로 연습문제를 풀어봤고 문제없이 잘 실행되는 거 같긴 한데 메모리 누수가 해결됐는지 잘 모르겠습니다. 연습문제를 풀기 전에 디버깅 모드로 봐도 CPU 사용량이 그대로인데 어디서 어떻게 확인할 수 있을까요?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
chap_07 Getter, setter code 사용
getter, setter를 직접 코드를 안치고 기능을 사용하여 code ->generate -> getter, setter 이용하시는데 저는 이거밖에 뜨지 않네요..constructor to spring() override Methods test copyright
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
return의 의미에 대하여
안녕하세요 공부하다가 이해안되는 부분이 있어서 이렇게 질문합니다.44번 문장에서는 return을 사용하는데47번 문장에서는 왜 return을 사용하지 않나요?그리고 this. 이 부분은 어떻게 사용하고 왜 사용하나요? 그냥 this 빼고 사용하면 안되나요?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
계속 오류 발생...
클래스의 this 강의를 듣고 있는데 여기서 계속 오류가 나는데 이유를 모르겠습니다 ㅠㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
coreApplication 실행시 자동 종료
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.<CoreAppliction 실행 모습><build.gradle 모습>CoreApplication을 실행하면 강사님과 다르게 출력이 되고 스프링도 제가 종료하지 않아도 자동적으로 종료가 됩니다. build.gradle에 혹시 제가 잘못 추가한 부분이 있을까요??
-
미해결스프링 핵심 원리 - 기본편
@Autowired 필드 명만 빈 이름으로 변경
조회 대상 빈이 2개 이상일 때 해결 방법으로@Autowired 로면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다 고 하셨는데파라미터로 매칭하는 경우 private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceimpl(MemberRepository memberRepository, DiscountPolicy fixDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = fixDiscountPolicy; }이거는 이해가 갑니다. 근데 필드명으로 매칭하는 경우가 헷갈리는게 강사님께서 말씀하신 필드명으로 매칭하는 방법은 private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired private DiscountPolicy rateDiscountPolicy; @Autowired public OrderServiceimpl(MemberRepository memberRepository, DiscountPolicy fixDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = fixDiscountPolicy; }이거는 rateDiscountPolicy가 그냥 사용되지 않아서 돌아 가는 거 아닌가요?rateDiscountPolicy를 사용해서 필드 명으로 매칭하려면 private final MemberRepository memberRepository; @Autowired private DiscountPolicy rateDiscountPolicy; public OrderServiceimpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.rateDiscountPolicy = rateDiscountPolicy; }이렇게 바꾸고 createOreder 메소드에 discountPolicy를 rateDiscountPolicy로 다바꿔야 돌아가던데 @Override public Order createOreder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); // 기존 코드 // int discountPrice = discountPolicy.discount(member, itemPrice); // 바꾼코드 int discountPrice = rateDiscountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } 코드가 잘 작동되긴한데 이게 강사님이 말씀하신 방법이 맞는지 의문이 들더군요...ㅠㅠ답변 주시면 정말 감사하겠습니다.
-
해결됨스프링 핵심 원리 - 기본편
@Controller에서 @Component
@Controller 어노테이션엔 @Component가 있어 컴포넌트 스캔대상이 되고 스프링 빈에 등록되는 것으로 아는데컨트롤러 클래스가 스프링 빈 등록된다 해도 쓸데가 있나요? 언제 쓰이는건가요?
-
해결됨스프링 핵심 원리 - 기본편
프록시 객체는 싱글톤인가요?
다른 분들의 질문을 읽어보던중에, 같은 질문에 다른 답변이 달려있는게 있어서 여쭤봅니다."프록시 객체는 각 HTTP 요청마다 생성되는가?" 라는 질문에https://www.inflearn.com/questions/618437 는'각 요청마다 생성된다' 라고 답해져있고https://www.inflearn.com/questions/348888 는'프록시 객체는 한번만 생성된다'(맨밑에 있습니다) 라고 답해져있는데, 뭐가 맞는건가요?그리고, 강의 교안 <9.빈 스코프>의 마지막 페이지(32페이지)에 보면 '마치 싱글톤을 사용하는 것 같지만 다르게 동작하기 때문에 결국에 주의해서 사용해야한다.' 라는 말이 있는데요. 이 말에 대해서 좀 더 설명을 해주셨으면 좋겠습니다. 만약 프록시 객체가 한번만 생성된다면, 그게 싱글톤으로 등록된 것이나 마찬가지인데, 왜 "싱글톤을 사용하는 것 같지만 다르게 동작"하는지 잘 모르겠습니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
final 질문드리겠습니다.
public final String lens;선언과 동시에 값을 초기화 하지 않고 선언만 한뒤public ActionCam(){lens ="광각렌즈"}기본생성자 내에서 이와같이 초기화 하는 케이스 있다고 설명해주셨습니다. 근데 기본생성자가 아닌 매개변수를 가지고 있는 생성자내에서public void ActionCam2(String name){lengs = "테스트"}와같이 선언한 경우는 lens 변수는 정의할수없다고 에러메시지가 뜨는데 기본생성자는 가능하고 매개변수가 있는 메소드는 불가능한 이유가 궁금합니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
changeName(Camera camera)의 부분이 잘 이해되지 않습니다.
public static void changeName(Camera camera){ camera.name ="잘못된 카메라"; } 와같은메소드를 다시 선언하셨는데요.(참조형변수)String (참조변수)c1 = (객체생성) new (생성할 객체)Camera() 이런개념으로 이해를 하였는데요. changeName 메소드를 선언하기전에는 c1, c2 참조변수를 통해서 Camera라는 메소드에 접근을 하여 c1.name, c2.name 이렇게 Camera 인스턴스 변수에 접근이 가능하였습니다. 근데 changeName이라는 변수에는 객체가 생성되지 않았는데 바로 camera.name 이렇게 접근하는것이 잘 이해가 가지 않습다. changeName(Camera camera)이부분에서 Camera(?) camera(참조변수))앞부분의 Camera가 이해가 되지않습니다.Camera메소드를 부르는건지 메소드라면 Camera() 이와같이 호출하는것은 아닌지... 정리가 잘 안됩니다. ㅜㅜ
-
미해결스프링 핵심 원리 - 기본편
Provider를 이용한 request scope 문제 해결 방법
강의 교안 <9.빈 스코프>의 28페이지를 보면 다음과 같이 설명되어있습니다."ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다"이 때, 빈의 생성을 지연한다는 말이 실제로 getObject() 함수를 호출해야만 request scope의 MyLogger 빈이 만들어 진다는 건가요?아니면 http 요청이 들어오는 순간 이미 MyLogger 빈은 다른 로직에 의해 생성되어 존재함이 보장되고, getObject() 함수는 무조건 MyLogger 빈을 갖고 올 수 있기 때문에 이를 논리적으로 "빈의 생성을 지연한다"라고 표현하신 건가요?전자가 맞는지 후자가 맞는지 궁금합니다.*추가. 비슷한 질문이 있어서 해당 질문을 참고하여 내용을 추가하였습니다.https://www.inflearn.com/questions/702458위의 질문에서 "http요청이 들어왔을 때 request bean이 생성되는게 아니라, 생성할수있는 상태가 되는것이고, 이 상태일때 ObjectProvider.getObject()를 하게되면 request bean을 생성한후 반환하는것이다" 라는 답변이 있었습니다. 그래도 이해가 안되서, getObject() 함수가 호출되기 전에 getBean()으로 등록된 MyLogger 빈을 갖고와봤습니다. @Controller @RequiredArgsConstructor public class LogDemoController { private final ObjectProvider<MyLogger> myLoggerProvider; // 추가된 라인 private final ApplicationContext ac; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { // 추가된 라인 MyLogger testMyLogger = ac.getBean(MyLogger.class); // 추가된 라인 System.out.println(testMyLogger); String requestURL = request.getRequestURL().toString(); MyLogger myLogger = myLoggerProvider.getObject(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); LogDemoService.logic("testID"); return "OK"; } } ApplicationContext를 의존주입 받아서,getObject()가 호출되기 전에 getBean()으로 MyLogger 타입의 스프링 빈을 조회하고 출력하였는데,testMyLogger와 myLogger에 동일한 객체가 들어있었습니다.위의 답변과는 상충되는 결과인데, 제가 추가한 코드에 문제가 있는 건가요?
-
미해결스프링 핵심 원리 - 기본편
초기화라는 단어
빈 생명주기 콜백 강의를 듣고 질문 남깁니다.public NetworkClient(String url) { this.url = url; }이렇게 생성자에 url을 넘겨주어 값을 지정해주는 것이 초기화 작업이라고 생각하고 강의를 들었는데그러면 문맥상 맞지 않더라고요.가령스프링 빈은 객체 생성, 의존관계 주입이 끝나야 필요한 데이터를 사용할 수 있다.따라서 초기화 작업은 의존관계 주입이 모두 완료되고 호출되어야 한다.이런 부분에서 위 코드와 같은것이 초기화라고 생각한다면 그냥 객체 생성 단계에서 url 값이 지정되었기 때문에 그냥 사용 가능한거 아닌가요?강의에서 말하는 초기화 작업은 정확히 어떤걸 말씀하시는건가요?
-
미해결스프링 핵심 원리 - 기본편
setter 주입을 private으로 선언해도 의존 주입이 되는 이유
수정자 주입과 관련된 질문이 생겨서 글을 쓰게 되었습니다.강의에서 setter를 이용한 의존 주입을 할 때는, setter 함수를 public으로 열어놔야한다고 하셨습니다.만약에 private으로 막아놓으면 어떻게 될지 궁금해서 private으로 막아 놓고 테스트를 돌려보았는데, 여전히 올바르게 의존주입이 되는 결과가 나왔습니다.아무리 생각해봐도 스프링이 private으로 막혀있는 setter 함수를 호출할 수 없을 것 같은데, 어떻게 올바른 의존 주입이 되는 결과가 나온건지 궁금합니다.테스트에 사용한 코드는 아래와 같습니다.// OrderServiceImpl.java package hello.core.order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.Member; import hello.core.repository.MemberRepository; import hello.core.repository.MemoryMemberRepository; @Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; // ! setter 주입(setter 주입을 사용하려면 final 키워드를 사용할수 없음) @Autowired private void setMemberRepository(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Autowired private void setDiscountPolicy(DiscountPolicy discountPolicy) { 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); } // 테스트 용도 public MemberRepository getMemberRepository() { return this.memberRepository; } } // AutoAppConfigTest.java package hello.core.scan; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import hello.core.AutoAppConfig; import hello.core.member.MemberService; import hello.core.order.OrderServiceImpl; import hello.core.repository.MemoryMemberRepository; public class AutoAppConfigTest { @Test void basicScan() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class); OrderServiceImpl orderServiceImpl = ac.getBean(OrderServiceImpl.class); System.out.println(orderServiceImpl.getMemberRepository()); } } // AutoAppConfig.java package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan(basePackages = "hello.core", basePackageClasses = AutoAppConfig.class, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { }
-
미해결스프링 핵심 원리 - 기본편
@Configuration과 @ComponentScan의 충돌
안녕하세요. @ComponentScan을 공부하다가 궁금한게 생겨서 질문드립니다.@ComponentScan에 의해서 @Configuration 이 붙은 클래스를 스캔했을 때, 이 때 만들어진 스프링 빈도 팩토리 빈의 역할을 하게 되나요?예를 들어,AppConfig 라는 클래스에 @Configuration을 붙이고 내부에 @Bean을 이용해 등록할 빈들을 만들어놓는다.AutoAppConfig 라는 클래스에 @ComponentScan을 붙이고 스프링 컨테이너(ApplicationContext)에 AutoAppConfig.class 로 설정정보를 넘겨준다.위와 같이 했을 때, AutoConfig가 스프링 빈으로 등록되고 @ComponentScan에 의해 스캔이 시작되어, AutoAppConfig가 위치한 패키지부터 하위 패키지까지 스캔되어 스프링 빈이 등록 될 것입니다. (AppConfig는 패키지 내부에 속해있어 스캔된다고 가정하겠습니다.)그럼 이 경우에 exclude 필터로 @Configuration에 해당하는 클래스를 제외하지 않는다면, AppConfig도 스프링 빈으로 등록될텐데,스프링 컨테이너(ApplicationContext)에 직접적으로 AppConfig.class와 같은 설정 정보를 전달하지 않았는데, 이때도 AppConfig가 팩토리 빈이 되어, 위의 1번에서 @Bean으로 만들어놓은 빈들을 스프링 컨테이너가 등록하게 되는지 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
@RequiredArgsConstructor
@RequiredArgsConstructor 사용할 때, 추가 생성자를 작성하면, @RequiredArgsConstructor에 의해 자동으로 만들어진 생성자에는 @Autowired를 따로 추가해줘야하나요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
맥 인텔리제이가 실행이 되지않습니다
이화면에서 계속 멈춥니다,,지우고 깔고 계속 기다려보는데도 여기서멈춰요...
-
미해결스프링 핵심 원리 - 기본편
ObjectProvider를 Singleton으로 사용하지 않는가?
ObjectProvider 를 이용해 request scope 빈과 관련된 문제를 해결하는 과정에서 궁금한 것이 생겨 질문드립니다.교안에서 LogDemoController 와 LogDemoService 는 각각 필드로 ObjectProvider<MyLogger> 를 갖고 있는데요.실제로 애플리케이션을 동작시켜 출력해보니, LogDemoController 와 LogDemoService가 서로 다른 ObjectProvider 객체를 사용하고 있었습니다.ObjectProvider<MyLogger> 를 싱글톤으로 사용하지 않는 이유가 있을까요?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
void 의 사용법
void 를 어떨 때 쓰는 건지 도무지 이해가 되질 않습니다 ㅠㅠㅠ반환하는 값이라는게 뭘까요?