묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 중급 1편
코드보다 중괄호가 너무 많아서 더욱 헷갈리네요..
혹시 실무에서도 기존 방식 처럼 인스턴스 별로 클래스를 나누고메인함수에서 인스턴스를 호출 하는 방식이 아닌 하나의 코드에 메인 함수을 포함하여 여러 개의 클래스가 같이 쓰는 경우가 많을까요? 어렵지 않은 코드 인데 가독성이 갑자기 안 좋아서 코드 흐름이 어렵네요...ㅠ
-
미해결김영한의 실전 자바 - 기본편
서로 다른 패키지에서 protected 상속 관계 사용
안녕하세요자바 복습을 하다가 헷갈리는 부분이 생겨 글 남겼습니다. package ex1; public class Parent { protected void method() { System.out.println("parent"); } } ------- package .ex2; import ex1.Parent; public class Child extends Parent { @Override protected void method() { System.out.println("CHild"); } } ------- package ex3; import ex1.Parent; import ex2.Child; public class Main { public static void main(String[] args) { Parent p= new Child(); p.method(); //컴파일 오류 } } 위의 코드에서 ex3 패키지에서 p.method()가 오류가 나는 이유를 잘 모르겠습니다...protected 접근 제한자는 같은 패키지 이거나 상속 관계일때 접근이 가능한 걸로 알고 있습니다. p.method()를 실행하면 Child에 있는 method()가 실행되어야하는거 아닌가요?Parent와 Child는 다른 패키지라도 상속관계에 있으므로 실행이 될 것 같다고 생각했는데 왜 오류가 나는지 모르겠습니다
-
미해결김영한의 실전 자바 - 기본편
섹션 10: 상속과 메모리 구조 부분에 질문이 있습니다.
1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의하는 부분 5:00 쪽에서 설명해주시면서이때 부모인 Car 를 통해서 charge() 를 찾을지 아니면 ElectricCar 를 통해서 charge() 를 찾을지 선택해야 한다.이때는 호출하는 변수의 타입(클래스)을 기준으로 선택한다. electricCar 변수의 타입이 ElectricCar 이므로 인스턴스 내부에 같은 타입인 ElectricCar 를 통해서 charge() 를 호출한다. 그리고 마지막에 아래와 같이 정리해주셨는데요.지금까지 설명한 상속과 메모리 구조는 반드시 이해해야 한다.상속 관계의 객체를 생성하면 그 내부에는 부모와 자식이 모두 생성된다.상속 관계의 객체를 호출할 때, 대상 타입을 정해야 한다. 이때 호출자의 타입을 통해 대상 타입을 찾는다.현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행한다. 기능을 찾지 못하면 컴파일 오류가 발생한다. 이때는 호출하는 변수의 타입(클래스)을 기준으로 선택한다. / 상속 관계의 객체를 호출할 때, 대상 타입을 정해야 한다. 이때 호출자의 타입을 통해 대상 타입을 찾는다.이 부분에 대해 질문을 드립니다. 제가 아직 다음 강의를 듣지 않아서 모르는 것이라고 생각할 수 있는데아래와 같은 코드를 작성했습니다.package extends1.ex2; public class ElectricCar extends Car { public void move() { System.out.println("Electric Car move"); } public void charge() { System.out.println("charge"); } }package extends1.ex2; public class Car { public void move() { System.out.println("move"); } }package extends1.ex2; public class CarMain { public static void main(String[] args) { ElectricCar electricCar = new ElectricCar(); electricCar.move(); Car car = new ElectricCar(); car.move(); } } 위에 있는 이때는 호출하는 변수의 타입(클래스)을 기준으로 선택한다. / 상속 관계의 객체를 호출할 때, 대상 타입을 정해야 한다. 이때 호출자의 타입을 통해 대상 타입을 찾는다. 의 대답이 맞으려면 뭔가 electricCar.move() 를 실행할 때랑 car.move() 를 실행할 때랑 결과가 달라야할 것 같은데 둘다 결과가 Electric Car move 가 나옵니다. 제 예상으로는 ElectricCar 로 생성하는 경우는 Electric Car move 가 나와야하고 Car 로 생성하는 경우 move 결과가 나와야 할 것 같아보여서요. 혹시 제가 놓치는 부분이 있을까요?
-
해결됨유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
UI 창이 안떠요
UI 화면 관리 시스템 Pt4와 게임설정 강의에서팝업 창과 설정창이 안뜹니다..하이어라키 창에서는 창이 존재는 하는데씬창과 게임 창에서 보이지 않습니다.. .
-
미해결김영한의 실전 자바 - 중급 2편
SortMain2 클래스의 DescComparator 메서드 return 부분이 수정되어야 할 것 같습니다.
영한님 강의 너무 잘 보고 있습니다.다름이 아니라 Comparator를 공부하며 혼자 이것저것 해보던 중에 SortMain2 클래스의 DescComparator 메서드가 3,2,1 배열을 정렬하면 오름차순 으로 정렬되는 것을 확인하여 문의 드립니다.static class DescComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { System.out.println("o1=" + o1 + " o2=" + o2); return (o1 < o2) ? -1 : ((o1 == o2) ? 0 : 1) * -1; } }강의에서는 오름차순 정렬된 1,2,3 배열을 내림차순 정렬해서 정렬이 문제가 없었지만만약 3,2,1 배열을 내림차순 정렬 하게 된다면, return (o1 < o2) ? -1 : ((o1 == o2) ? 0 : 1) * -1;첫번째 삼항 연산자 부분에서 앞에 o1, o2를 비교하고 -1 이 반환되며 오름차순으로 정렬 되는 것 같습니다.리턴 부분이 전체 비교 값에 -1이 곱해질 수 있도록return ((o1 < o2) ? -1 : ((o1 == o2) ? 0 : 1)) * -1; 로 수정 되어야 할 것 같아 문의 드립니다.
-
해결됨김영한의 실전 자바 - 기본편
단축키 작동 안 되는 경우 재부팅 외 해결 방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]자동완성 단축키(ctrl shift enter)나 주석달기(ctrl /) 같은 단축키가 잘 되다가 어느순간 안됩니다. 인텔리제이를 재시작해도 안 되고 컴퓨터를 재부팅하면 해결됩니다. 인텔리제이에서 캐시 삭제도 해봤는데 재부팅 말고는 해결이 안 됩니다. 다른 해결 방법이 없을까요?
-
미해결스프링 핵심 원리 - 기본편
웹과관련된부분이 머에여?
여기서 중요한점이 있다. request scope를 사용하지 않고 파라미터로 이 모든 정보를 서비스 계층에 넘긴다면, 파라미터가 많아서 지저분해진다. 더 문제는 requestURL 같은 웹과 관련된 정보가 웹과 관련없는 서비스 계층까 지 넘어가게 된다. 웹과 관련된 부분은 컨트롤러까지만 사용해야 한다. 서비스 계층은 웹 기술에 종속되지 않고, 가급적 순수하게 유지하는 것이 유지보수 관점에서 좋다.request scope의 MyLogger 덕분에 이런 부분을 파라미터로 넘기지 않고, MyLogger의 멤버변수에 저장해서 코드와 계층을 깔끔하게 유지할 수 있다. <-이부분이 이해가 안되여 ㅠ 웹과관련된 정보라는게 머에여? public void logic(String id) { myLogger.log("service id = " + id); 이부분도 웹과관련된부분 아닌가요?
-
미해결김영한의 실전 자바 - 기본편
프로젝트 환경 구성시 jdk 버전 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서는 21버전의 Oracle OpenJDK를 사용하셨는데 23버전만 뜨는 것 같은데 23버전을 사용해도 되나요?
-
미해결스프링 핵심 원리 - 기본편
count1과 count2가 값이 다른이유
@Test void singletonClientUsePrototype(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class,ClientBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); assertThat(count2).isEqualTo(2); assertThat(clientBean1).isEqualTo(clientBean2); System.out.println("clientBean1 = " + clientBean1); System.out.println("clientBean2 = " + clientBean2); System.out.println("count1 = " + count1); System.out.println("count2 = " + count2); }clienBean1=clientBean2는 싱글톤으로 같은걸 알았는데왜 count1과 count2는 값이 다른건가요?? count1에서 count2는 공유가되서 2가 되었는데 count2에서 count1은 공유가 안된건가요?
-
해결됨김영한의 실전 자바 - 기본편
java 메모리구조 static 영역에 대해서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. static 영역에 static 변수 뿐만 아니라 static 메서드도 함께 관리하는게 맞나요?
-
미해결스프링 핵심 원리 - 기본편
CoreApplication 실행 시 무한 로딩
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용][ MyLogger.java ] 코드package hello.core.common; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.UUID; @Component @Scope(value = "request") public class MyLogger { private String uuid; private String requestURL; public void setRequestURL(String requestURL) { this.requestURL = requestURL; } public void log(String message) { System.out.println("[" + uuid + "]" + "[" + requestURL + "]" + message); } @PostConstruct public void init() { uuid = UUID.randomUUID().toString(); System.out.println("[" + uuid + "] request scope bean create:" + this); } @PreDestroy public void close() { System.out.println("[" + uuid + "] request scope bean close:" + this); } }[ LogDemoController.java ] 코드package hello.core.web; import hello.core.common.MyLogger; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final ObjectProvider<MyLogger> myLoggerProvider; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); MyLogger myLogger = myLoggerProvider.getObject(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); logDemoService.logic("testId"); return "OK"; } }[ LogDemoService.java ] 코드package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class LogDemoService { private final ObjectProvider<MyLogger> myLoggerProvider; public void logic(String id) { MyLogger myLogger = myLoggerProvider.getObject(); myLogger.log("service id = " + id); } } [ build.gradle ] 코드plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' } group = 'hello' version = '0.0.1-SNAPSHOT' //lombok 설정 추가 시작 configurations { compileOnly { extendsFrom annotationProcessor } } //lombok 설정 추가 끝 java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' //web 라이브러리 추가 implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'jakarta.inject:jakarta.inject-api:2.0.1' //lombok 라이브러리 추가 시작 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //lombok 라이브러리 추가 끝 testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } ObjectProvider를 사용하면서 부터 CoreApplication을 실행하면 Negative Match 가 뜨면서 아래에ActiveMQAutoConfiguration: Did not match: - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) AopAutoConfiguration.AspectJAutoProxyingConfiguration: Did not match: - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition)이러한 오류들이 뜹니다.IntelliJ는 무료버전이므로 build and run은 Gradle로 설정해놓은 상태입니다. 어떻게 해야 정상작동할까요...
-
해결됨유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
BaseUI, ConfirmUI에서 질문있습니다.
함수에서 어떤 행위를 하고 Action 변수를 사용하고 null로 초기화 해주는데 이유가 궁금합니다.
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
static
안녕하세요 강사님그 매직넘버와, 매직스트링 강의와 이 강의를 들으면서 하나 느낀점이 있는데 상수로서 정리를하여 얻는 이득은 있으나 그만큼 static이 많아져서 메모리를 더 먹거나 다른 단점들이 존재하는것 같은점에 대해서는 어떻게 생각하시나요?? 그 단점들을 포기하면서도 얻는 이득이 많아서 이렇게 하시는편을 더 지향하시는지 궁금합니다감사합니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized 코드블록에서 사용하는 파라미터의 존재 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]synchronized (){} 블록에서 파라미터로 인스턴스를 지정하는 이유가 혹시 다른 클래스에 있는 메서드와의 동시성 연결..? 때문일까요?예를 들어 이러한 사고 실험을 해보았습니다)A 클래스에 a 메서드를 실행하면 해당 메서드에서 내부적으로B 클래스에 b 메서드를 실행한다고 가정을 하겠습니다. 하지만 b 메서드는 a 메서드를 통해서만 호출되는 것이 아니라 자체적으로도 호출하는 메서드라고 했을 때, 나타나는 동시성을 고려한 것일까 의문이 들었습니다. 그렇다고 한다면,b 메서드 안에 synchronized (b 클래스의 인스턴스) {} 를 지정하여,a 메서드를 통해 호출되는 b 메서드와 B 클래스 자체적으로 호출하는 b 메서드의 동시성 문제를 해결할 수 있겠다 예상이 됩니다. synchronized 블록의 파라미터는 위와 같은 상황을 위해 특정 인스턴스의 락을 파라미터로 잡게 한건가요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
강의 질문
안녕하세요 강사님테코 강의때 부터 시작해 강의 잘 보고 있습니다다름이 아니라 강의에서 '한 메서드의 주제는 반드시 하나이다' 라고 하셨는데 그럼 여러 메서드를 잘게 쪼개고 하나의 큰메서드로 묶는 방법(주제가 두개이상) 은 지양 해야 되는 방법일까요?감사합니다
-
미해결김영한의 실전 자바 - 기본편
Static 관련 main메서드 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요.Static관련해서 main메서드에 관해서 질문이 있습니다Static 메서드는 static 만 호출할수 있는데, main 메서드도 static인데 어떻게 모든 타입의 메서드들을 호출할수 있는지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Thread.yield() 는 컨텍스트 스위칭을 일으키는 걸까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서 ,Cache 메모리 값을 초기화하는데 제일 확실한 방법이 컨텍스트 스위칭이라고 하셨습니다.그럼 while 문 안에 Thread.yield()를 통해 Running 에서 Ready로 바꾸면 되지 않을까? 생각이들어 직접해보니 바로 꺼지는 것을 확인했습니다. 여기서 의문이 들었습니다. Thread.yield()를 하게되면 컨텍스트 스위칭을 하는 걸까요?
-
미해결스프링 핵심 원리 - 기본편
기본편 완료시점 로드맵 질문드립니다 !
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]다음으로 강의에서는 입문편까지만 완료하구 부트 JPA 활용으로 가는 루트로 말씀해주셨는데 유튜브 링크에는 스프링 로드맵을 끝까지 듣구 부트로 들어가길 권장하셔서 어떤걸 해야하는지 헷갈립니다.혹시 저때 스프링로드맵이 완성이 안돼있어서 저렇게 말씀하신거라면 저는 우선 프로젝트로 먼저 야생형코스로 하는게 더 잘 맞을거같아서 JPA 부트로 먼저 넘어갔다가 스프링 완전정복으로 다시 돌아올까했는데 좀 무리가 있을까요
-
미해결김영한의 실전 자바 - 중급 1편
id로 동일성을 판단하는 기능을 오버라이딩하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]그냥 idEquals()이런 메서드로 새로 만들지 않고, 오버라이딩을 사용하는 이유가 무엇인가요?
-
미해결스프링 핵심 원리 - 기본편
interface가 왜 bean에 등록이 되나요? (재등록)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 프로젝트 압축파일 :https://drive.google.com/file/d/1JuIfXWrbMbE0SuppC6Pnd36vSqKkp2aX/view?usp=drive_link강의를 보면서 allTest를 하니 강의에 없는 오류가 나와서 질문드립니다. CoreApplicationTest -> contextLoads 부분 오류 내용은 다음과 같습니다expected single matching bean but found 2: memoryMemberRepository,memberRepository즉, 하나의 빈을 찾아야하는데 2개의 빈을 찾았다는 뜻입니다.그래서 "MemberServiceImpl"의 생성자에 @Qualifer 어노테이션을 사용하니 오류가 사라졌습니다.@Autowired public MemberServiceImpl(@Qualifier("memoryMemberRepository") MemberRepository memberRepository) { this.memberRepository = memberRepository; }하지만 궁금증이 남았습니다. @Component 어노테이션을 사용하지도 않은 interface가 빈으로 등록이 되는걸까? 궁금해서 contextLoads 함수에서 MemberRepository.class의 빈을 찍어봤습니다.다음과 같이 interface도 빈으로 등록이 되어 있음을 확인했습니다. 추상 클래스라 생성도 하지 못 하는데 왜 빈에 올라가 있는 것인지 의아하여 gpt에게 질문을 해보니"인터페이스를 구현한 클래스가 빈으로 등록될 때, 해당 인터페이스의 이름도 빈의 별칭(alias)으로 자동 등록됩니다. 이 빈 객체는 두 개의 이름("memoryMemberRepository"와 "memberRepository")으로 참조될 수 있습니다."라는 답변을 받았습니다. 만약 해당 답변이 옳다면1. 굳이 왜 alias가 필요했던 것인가?2. alias이면 같은 것을 참조하는데 컴파일러는 왜 고민을하고 에러를 띄운것인가?3. @Qualifier의 사용이 필연적인가? 강의에서는 왜 그렇지 않았는데 해당 오류가 없었나?이렇게 3가지 질문을 드리고 싶습니다.