묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan(basePackages = "hello.core.order")
[질문 내용]탐색할 패키지의 시작 위치를 지정할 때 basePackages의 위치를 "hello.core.order 로 하였을 때 OrderServiceImpl에 @Component 와 @Autowired 어노테이션이 있으니 로그에 분명 orderServiceImpl이 나올 것으로 예상하는데 테스트 실패가 나오는 이유가 뭔지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
@Component, @Autowired
[질문 내용]컴포넌트 스캔과 의존관계 자동 주입 시작하기 영상에서 김영한 강사님께서 @Componenet 어노테이션을 등록한 클래스 MemberServiceImpl 가 자동으로 스프링 빈에 등록이 되는데 의존성 주입이 안되어 있으니 같이 해주기 위해 생성자 코드 상단에 @Autowired를 붙인다는 것 까지는 이해하였습니다. 그런데 10분 2초 쯤에 @Autowired를 붙인 MemberServiceImpl 생성자 파라미터에 MemberRepository 타입에 맞는 MemoryMemberRepository가 올거라고 어떻게 예상 하는거죠? 혹시 MemoryMemberRepository 클래스에도 @Component를 붙였으니 MemoryMemberRepository 가 올거라고 확신하는거죠?
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
volatile closed 적용해도 동시성 처리를 막을 수 없을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.아래의 메서드는 결국 if(closed) 를 검증하기 위한 코드인데 synchronized가 아닌 volatile 키워드로 가시성만 보장해도 동시성 처리를 막을 수 있을 것 같다는 생각에 질문 드립니다!아직까지 해당 부분이 미흡해서 다시 공부해보겠습니다!public synchronized void close() { if (closed) { return; } closeAll(socket, input, output); // shutdown closed = true; log("연결 종료: " + socket); }
-
미해결스프링 핵심 원리 - 기본편
AppConfig@CGLIB
[질문 내용]@Configuration과 바이트코드 조작의 마법 강의영상에서 8분 19분쯤에 김영한 강사님께서 부모타입으로 조회하면 모든 자식이 끌려 나온다 했는데, 부모타입으로 된 변수명에 자식 인스턴스를 초기화할 때 기능을 호출하면 부모 타입에 없을 때 자식타입에서 못가져오는 것으로 알고있습니다. 상속 관계는 부모 방향으로 찾아 올라갈 수는 있지만 자식 방향으로 찾아 내려갈 수는 없기 때문이죠. 그래서 강사님께서 말한 "부모 타입으로 조회하면 자식들이 다 끌려 나온다"라는 말은 틀린 말 아닌가요?
-
미해결스프링 핵심 원리 - 기본편
@Configuration
[질문 내용]AppConfig 같은 클래스를 만들고 바로 상단에 @Configuration 어노테이션을 설정하면 그 클래스는 스프링 컨테이너라고 봐도 된다는 거죠?
-
미해결김영한의 실전 자바 - 중급 1편
데이터베이스 로드맵 출시
선생님 혹시 데이터베이스 로드맵은 출시가 취소된걸까요? 중급 1편 다음으로에서 데이터베이스 로드맵에 대해 말씀주셨는데, 선생님 페이지에 안보여서요
-
해결됨오브젝트 - 기초편
설명중에 "그렇다면 설계를 변경하는 이유는 무엇이었나요?" 질문입니다.
설명하신 내용중에 "그렇다면 설계를 변경하는 이유는 무엇이었나요?" 라고 하시면서 "프로세스와 데이터가 하나의 모듈안에 모여 있으면 코드를 수정하기 어렵기 때문이였죠." 라고 하시던데...앞에 내용으로는 '프로세스와 데이터가 서로 다른 모듈안에 배치되어서 수정이 어려우니 프로세스를 구현한 코드를 데이터를 구현한 코드로 옮기는..' 뭐 이런거 아니였나요??제가 잘못 이해하고 있는건가요?
-
미해결스프링 핵심 원리 - 기본편
팩토리 빈, 스프링 컨테이너
[질문 내용]팩토리 빈 과 스프링 컨테이너를 같은 의미로 봐도 될까요? 차이가 있다면 뭐가 다른건지 알려주세요.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 질문 있습니다
안녕하십니까 영한님 영한님 덕분에 비전공자로서 백엔드 개발자의 꿈을 꾸고있는 사람중 1인입니다다름이 아니라 영한님께서 여러 스레드를 실행하면 main 스레드의 경우 다른 스레드의 종료까지 기다리지 않아 join이라는 메서드로 적절하게 대처하는 것이 중요하다고 들었습니다. 하지만 아래 코드를 보면 main 스레드가 종료라는 문구가 항상 맨 마지막에 나와 헷갈려서 여쭈어봅니다. 이경우도 main이 먼저 종료되어 thread가 실행되지 않을 수 있는 건가요? public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task,"work"); log("runFlag = " + task.runFlag); thread.start();; sleep(1000); log("runFlag를 false로 변경 시도"); task.runFlag = false; log("runFlag = " + task.runFlag); log("main 종료"); } static class MyTask implements Runnable { volatile boolean runFlag=true; @Override public void run() { log("task 시작"); while (runFlag) { } log("task 종료"); } } }
-
해결됨진짜! 자바스크립트(Javascript) - 기초부터 고급까지
for 문에서 var 키워드 변수를 사용할 때와 let 키워드 변수를 사용할 때 차이점
안녕하세요 좋은 강의 감사드립니다.아래에서 for 반복문 내에서 var 키워드를 사용했을 때의 경우에는 var 키워드는 함수 스코프를 가지므로 setTimeout 의 콜백 함수가 실행되는 시점에 i 변수의 값은 이미 3인 상태이므로 3 3 3이 출력되는 것은 이해를 했습니다. 그런데 let 키워드로 선언한 변수는 블록 스코프를 가지는데 언뜻 이해하기로는 for 블록 내부에 i 변수가 선언되었다고 생각하면 var 키워드와 마찬가지로 setTimeout 의 콜백 함수가 호출되는 시점에 i 변수는 3이어야 하는게 아닐까라는 생각이 듭니다. 근데 0 1 2 가 출력되는 것을 보면 혹시 for 반복이 한번 실행될 때마다 i 변수가 생성되어서 서로 다른 블록 스코프를 가지는 것인지 아니면 제가 이해하지 못한 다른 내용이 있는 것인지 궁금합니다! 그리고 마지막으로 블록 스코프란 { } 이렇게 중괄호 내에 선언되는 경우를 말하는 것 같은데 for 문의 let i 변수의 경우에는 정확히 말하면 블록 내부에 선언되어 있지는 않은데 이 경우에도 블록 스코프라고 봐야 하는 건가요?? 감사합니다!function timer() { for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); } , 1000); } }function timer() { for (let i = 0; i < 3; i++) { setTimeout(function () { console.log(i); } , 1000); } }
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
조금 더 깊은 내용, 실무적인 내용, 미래의 계획에 대해서 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]영한님 강의 잘 듣고 있습니다!!지금 강의도 정말정말 좋고 많은 것을 다루지만, 이런 것들을 다룰 예정은 없는지 여쭤보고 싶습니다!Lock next level(자바)ReadWriteLock, StampedLock, Mutex, Semaphore비동기/멀티스레드 next level(feat. 스프링)CountDownLatch 사용법, Transaction 동시성 테스트, 멀티스레드를 활용한 성능/부하 테스트 방법 항상 잘 배우고 있습니다 감사합니다 ☺
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
자바 초보의 질문입니다
if문 관련 질문입니다.조건에 따라 dollar <0 일 경우 "잘못된 코드입니다dollar == 0 일 경우 "환전할 금액이 없습니다dollar >0 일 경우 dollar = dollar*1300을 출력하고 싶습니다 그런데 위와 같이 코드를 작성하였을 때 dollar가 0 이하가 될 경우 if (dollar<0)문과 else문이 함께 실행됩니다.왜 이러는 걸까요? 저는 if 문이 실행되면 else문은 실행이 되지 않는다고 이해했는데 혹시 다른 이유가 있는 걸까요?답을 알고 계시는 분은 상세하게 설명 부탁드립니다ㅠㅠ
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
숫자와 문자의 2진수 숫자가 동일할 경우 타입에 대한 메타정보는 어디에 있나요
Java는 해당 강의만 구매 해서 앞의 강의 내용에 있을지 모르겠습니다만 헷갈리는 부분이 있습니다. 숫자와 문자의 2진수 표현은 같고데이터타입이 숫자 타입인지 문자 타입인지 나타내는 byte 도 있을 것 같은데 이걸 어떻게 구분하는지 구글링에서 검색할 수 있는 키워드나 답을 알려주실 수 있으실까요 숫자 65의 2진수 표현: 1000001문자 'A'의 2진수 표현: 1000001 강의 내용에 java의 경우 1byte의 prefix를 통해 음수를 표현할 수 있다고 하셨는데 데이터 타입은 어디에서 관리되는지 궁금하네요. 저장되는 메모리 구역이 다른지..그렇다 해도 할당된 데이터 구조 내에 있어야 할 것 같은데 진짜 궁금하네요 클로드에선 아래와 같이 답을 줬는데요각 데이터 타입은 1바이트부터 8바이트까지 고유한 메모리 할당 방식을 가지고 있어, 메모리 내 위치와 크기로 타입을 구분할 수 있습니다. 그럼 각 데이터에 대한 메모리 위치는 stack 에서 가지고 있지 않나 싶은데 stack 에서도 해당 데이터 타입이 byte 인지 아니면 텍스트인지 어떻게 알고 있는지 다시 궁금하네요. -ㅂ- stack을 공부하면 되겠네요... 문자인코딩 섹션이 단순한 내용 같아도 진짜 생각 많이 하게 되는 강의네요.
-
해결됨김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
고급 3편 출시 예정일
안녕하세요.영한님의 자바 시리즈를 달리고 있는 수강생입니다.혹시 고급 3편은 올해 12월 안에는 출시가 되는지 아니면 올해를 넘겨 2025년에 1-2월에 출시가 되는지 대략적인 시기가 궁금합니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
문자열 리터럴과 문자열 객체 관련해서 질문이 있습니다.
안녕하세요!강의를 듣던 도중에 의아한 부분이 있습니다. 8분 43초부터 들은 바에 의하면문자열 리터럴로 생성한 문자열은 (1) Runtime Constant Pool에 저장되고, (2) 사용되는 시점에 String Contant Pool에 복사된다.new 키워드로 생성한 문자열 객체는 String Constant Pool에 저장된다. (이 내용은 10분 28초) 위 내용을 다음 사진처럼 표현해보았습니다. 여기서 한 가지 의아한 부분이 있는데요.문자열 리터럴과 new 키워드로 생성한 문자열 객체 둘 다 String Contstant Pool에 저장된다면, 동일성 비교에서 true가 반환되지 않을까요?? 그러나 실제로는 동일성 비교를 하면 false를 반환하게 됩니다.제가 이해했던 바로는 문자열 리터럴은 String Constant Pool에 저장되고, new 키워드를 통한 문자열 객체는 Heap 영역에 저장되기 때문에 동일성 비교에서 false를 반환한다라고 생각했습니다.String s1 = "hello"; String s2 = "hello"; String s3 = new String("hello"); s1 == s2; // true s1 == s3; // false 결론적으로 제가 궁금한 부분은..new 키워드로 사용한 문자열 객체는 String Constant Pool이 아닌 단순히 JVM Heap 영역에 저장되는 것이 맞지 않는지 궁금합니다! 좋은 강의 감사합니다!!(11분 08초에 natvie 오타가 있는 것 같습니다!)
-
해결됨김영한의 실전 자바 - 중급 2편
new T(); 와 new Node<T>();의 차이
===================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요, 수업을 열심히 따라가며 코드를 작성해보면서 궁금한 점이 생겨 이렇게 질문드립니다. 앞서 제네릭 부분에서 타입이레이져 방식 때문에 제네릭 타입정보는 컴파일 이후 모두 사라지고 타입변수의 상한타입으로 바뀐다고 이해하였습니다. 그래서 위 처럼 new 로 직접 타입변수 T의 인스턴스를 생성하거나 instanceof T 구문을 쓰지 못한다고 하셨습니다.컴파일 이후에는 T에 대한 정보가 없으니까요. 그런데 리스트에서 제네릭을 사용하는 부분을 보면 LinkedList<T>처럼 제네릭 타입을 활용해 클래스를 정의하였고 내부에 new Node<T>(); 와 같은 부분이 있어 위의 언급한 내용과 상충하는 것 같아 이 경우는 왜 가능한지 의문이었습니다. 구글에서 찾기 쉽지않아 직접 T를 생성하는 것(new T(); )과 Node<T>를 생성하는 것(new Node<T>(e);)의 차이를 혼자 고민해보았습니다.T를 생성하는 것은 힙영역에 T 인스턴스를 생성하는 것인데 컴파일 이후 T에 대한 정보가 전혀 없어 T 직접생성이 불가능하지만, Node<T>의 경우 Node의 인스턴스를 생성할 때 T타입인 item이 있지만 이때 T타입의 객체를 생성하는 것이 아니라 언젠가 생성될 T객체의 참조값을 담을 변수만 선언하는 것일 뿐이고 이는 컴파일 이후 T의 정보가 없어 Object 타입으로 변수 item이 선언되더라도 후에 T타입의 객체(의 참조값)가 item에 할당될때 저절로 업캐스팅이 되어 문제없이 item변수를 사용할 수 있다고 결론내렸습니다. 이렇게 생각하면 문제없는걸까요?
-
미해결스프링 핵심 원리 - 기본편
ac.getBean(빈이름, 타입), ac.getBean(타입)
[질문 내용]@Test @DisplayName("모든 빈 출력하기") void findAllBeans() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); // 스프링에 등록된 모든 빈 이름을 조회한다. for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); // 스프링 컨테이너에서 빈 이름으로 빈 객체(인스턴스)를 조회한다. System.out.println("name(key) = " + beanDefinitionName + ", object(value) = " + bean); } } 위 코드에서 getBean() 메소드에 배열 변수를 foreach 문에 담아 beanDefinitionName을 매개변수에 놓아져 있습니다. 그런데 스프링 빈 조회 - 기본 설명문에서 ac.getBean(빈이름, 타입) 과 ac.getBean(타입) 2가지 조회 방법이 있는데 Object bean = ac.getBean(beanDefinitionName); 코드 에서는 빈이름인지 타입인지 잘 분간이 안돼서 모호하게 보입니다. 왜 이게 가능한 건지 설명해주세요.
-
해결됨스프링 핵심 원리 - 기본편
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
[질문 내용]@Test @DisplayName("모든 빈 출력하기") void findAllBeans() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = : " + beanDefinitionName + ", object = : " + bean); } }김영한 강사님께서 ac.getBean(beanDefinitionName);의 값을 대입할 때 타입이 Object라고 한 것이 type을 지정하지 않아서 그렇다고 하셨는데 String[] beanDefinitionNames = ac.getBeanDefinitionNames(); 에서 보면은 String[] 배열에 담아 놓은 것을 확인할 수 있습니다. 즉 beanDefinitionName 들은 타입이 String이니까 String[] 배열에 담을 수 있다고 저는 생각하는데 무엇 때문에 type 을 지정하지 않아서 Object라고 하신건지 궁금합니다.
-
해결됨오브젝트 - 기초편
안녕하세요. 기존의 추상화된 역할에 대해서 새로운 협력자가 필요하게 되는 경우는 어떻게 설계해야할까요??
안녕하세요. 객체지향의 사실과 오해, 오브젝트부터 이어서 강의까지 영호님의 강의를 즐겁게 보고 있습니다.강의를 보면서 궁금한 것이 있습니다.Movie는 DiscountPolicy와 협력하고 있고, DisscountPolicy는 DiscountCondition과 협력하고 있습니다. 여기서 DiscountCondition은 Screen 객체에 의존하여 협력하고 있구요.보통 현업에서는 이렇게 추상화를 하여 책임을 설계해두어도, 어느날 갑자기 새로운 협력자가 필요하게 되어 그 책임을 온전히 수행하기 힘든 상황이 자주 발생하여 추상화가 깨지는 케이스가 많이 있는 것 같다는 생각이 들었는데요.만약에 위 예제에서 "고객이 생일인 경우에는 영화 가격의 10%를 할인해준다." 라는 할인 조건이 추가된다면 DiscountCondition 에 협력자로 Customer가 파라미터로 전달이 되어야할 것 같습니다. 이를 위해 BirthdayDiscountCondition이라는 할인 조건을 만들고, isSatisfiedBy() 메서드에 Customer를 인자로 받아야하게 됩니다. 하지만 SequenceCondition과 PeriodCondition은 필요하지도 않는 Customer 협력자를 의존하게 되는 상황이 되는데요.위 상황에서는 복잡성이 높지 않고, 이 정도의 의존성은 무시해도 된다고 판단되어 그냥 추가할 수도 있지만, 이런식으로 다른 협력자들이 계속해서 추가되어 복잡성이 늘어나면 객체랑은 상관없는 협력자의 추가로 인해 테스트 또한 매번 깨지는 상황도 발생하게 될 것 같습니다.이렇게 기존에 설계된 추상화가 다른 조건의 추가로 인해 깨지는 경우에는 어떻게 설계를 접근하는 것이 좋을까요??
-
미해결김영한의 실전 자바 - 기본편
오버라이딩 논리를 다시 설명해주세요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]저와 비슷한 질문을 남긴 사람들의 글을 읽어보았는데, 명확하게 이해가 가질 않아서 질문을 남깁니다.부모 변수가 자식 인스턴스를 참조하는 상황Parent poly = new Child(); 이 상황은 Parent를 상속받은 Child라는 객체를 생성하여, 현재 Parent,Child 두 객체가 생성된 상황이며, poly를 부모 변수로 선언하였습니다. 부모는 자식에 대해 알 수 없다라는 논리에 따라 Child라는 객체가 있어도 부모 Parent는 Child에 선언된 메서드와 필드를 모른다는 것이 영한님의 설명인 것 같습니다.그런데, 오버라이딩을 하게 되더라도 제 생각에는 여전히, Parent는 Child의 메서드와 필드를 모르는 상황은 여전한데, 어떻게 Parent가 Child 메서드가 오버라이딩을 한 상황을 알고, 오버라이딩된 Child 메서드가 우선권을 갖는지 잘 모르겠습니다. 이는 '부모는 자식에 대해 알 수 없다'라는 논리와 맞지 않는 것 같아서 부가적인 설명을 원합니다.