묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 중급 1편
예외 계층 main
강의자료에서 예외 계층2- 활용 직전에 있는 MainV3의 main()에 대한 질문입니다.main() 옆에 throws xxException을 지우셨는데, 체크 예외를 발생시키는 메서드를 호출하기 때문에 throws를 생략하면 안 된다고 생각했는데, 삭제하신 이유가 무엇인지 궁금합니다! public class MainV3 { public static void main(String[] args) { ... | }
-
미해결김영한의 실전 자바 - 기본편
displayInfo 메소드에 배열 인스턴스 문의
Book 클래스 displayInfo 메소드에 book1 ~ book3 까지 각각 인스턴스를 넣어 정상적으로 출력이 되었습니다 void displayInfo(){ System.out.println("제목:" + title + ", 저자:" +author+ ", 페이지:" + page); } --- Main 메소드 --- book1.displayInfo(); book2.displayInfo(); book3.displayInfo(); 만약 displayInfo 메소드에 Books 인스턴스 배열을 매개 변수로 넣고 for문으로 처리하고 싶으면 어떻게 코드 수정을 해야 할까요? 뾰족한 수가 생각이 안나 스스로 해보는 중인데 ㅠㅠ 되지 않네요 혹시 가능할까요..? Book 클래스 displayInfo 메소드에 아무 매개변수를 배열 인자를 받아야 뭐 해결이 될거 같은데..ㅠ < 시도중인 코드> === Book 클래스 displayInfo 메소드=== void displayInfo(Book[] books){ for(int i=0; i <= books.length;i++){ System.out.println("제목:" + books[i].title + ", 저자:" +ooks[i]. author+", 페이지:" + ooks[i]. page); } } === 메인 메소드 === Book book1 = new Book(); Book book2 = new Book("Hello Java", "Seo"); Book book3 = new Book("JPA 프로그래밍","Kim", 700); Book[] books = {book1, book2, book3}; books.displayInfo();
-
미해결김영한의 실전 자바 - 중급 1편
지역 클래스를 익명 클래스로 바꿀 때
익명 클래스를 사용할 때는 상위 클래스가 필요하다고 하셨는데, 만약 어떤 지역 클래스를 익명 클래스로 만드려고 하는데 해당 지역 클래스에서 implements 또는 extends 하는 게 없다면 익명 클래스를 만들 때 new Object() { ... }로 해야 하는 건가요?
-
미해결김영한의 실전 자바 - 중급 1편
지역 클래스 인스턴스 생성 전에 지역변수의 값 변경
public class LocalOuterV4 { public Printer process(int paramVar) { int localVar = 1; class LocalPrinter implements Printer { @Override public void print() { System.out.println("localVar = " + localVar); // 지역클래스가 접근하는 지역변수 (1) System.out.println("paramVar = " + paramVar); // 지역클래스가 접근하는 지역변수 (2) } } paramVar = 20; localVar = 10; Printer printer = new LocalPrinter(); // 지역 클래스의 인스턴스를 생성할 때, 지역 클래스가 사용하는 지역변수를 캡쳐해서 멤버로 포함시킨다. return printer; } }위 코드와 같이 LocalPrinter 인스턴스를 생성하기 전에 paramVar와 localVar의 값을 수정하려고 했습니다. 그러면 지역변수 캡쳐 전이니까 2, 1이 아닌 바뀐 20, 10을 캡쳐해서 지역 클래스의 인스턴스에 포함시키면 되겠다고 생각했습니다.그런데, paramVar와 localVar의 값을 수정하는 코드를 new LocalPrinter()의 이후에 적든, 이전에 적든에 관계없이 컴파일 오류가 발생합니다.제가 생각한 이유는 이미 자바 차원에서, 지역클래스가 사용 중인 지역변수는 값이 바뀌는 것 자체를 막아두었기 때문이라고 생각합니다. 제 생각이 맞는지 알려주시면 감사하겠습니다
-
미해결스프링 핵심 원리 - 기본편
test 오류를 못찾겠습니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. https://drive.google.com/file/d/1eaGwuFK0ptwt7-5tXkKBmLXL6c_8wVCr/view?usp=drive_link
-
미해결김영한의 실전 자바 - 중급 1편
인스턴스 간 참조관계
public class InnerOuterMain { public static void main(String[] args) { InnerOuter outer = new InnerOuter(); InnerOuter.Inner inner = outer.new Inner(); } }내부 클래스에 대한 인스턴스는 바깥 클래스에 대한 인스턴스를 가지고 있습니다. 그렇지만 바깥 클래스의 인스턴스는 내부 클래스의 인스턴스를 가지고 있지 않은게 맞나요? 바깥 클래스인 InnerOuter 내에 메서드를 만들고, 내부 클래스가 가진 변수에 접근하는 코드를 작성하니 cannot find symbol이 뜨긴 했습니다.
-
미해결김영한의 실전 자바 - 기본편
제어자2번 문제 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에서 item.getName()은 클래스 Item의 메서드인데 클래스 ShoppingCart에서는 따로 인스턴스를 만들지 않았고 배열인 Item[] items = new Item[10]; 만 만든게 아닌가요? items.getName() 도 아니고 어떻게 호출이 되는지 이해가 안가서 질문 남깁니다
-
미해결김영한의 실전 자바 - 중급 1편
static 관련 질문 드립니다.
안녕하세요. 제가 궁금했던 부분은 아래와 같이 static 변수와static 클래스가 있을 때 차이점입니다.public class MyMainClass {public static string test = "test";}public class OuterClass { public static class StaticNestedClass {}public static 이 변수에 붙으면 서비스전체에서 동일한 변수에 접근을 한다고 이해했는데StaticNestedClass 클래스 같은 경우는 서비스에서 필요할때마다 생성을 해서 여러개가 존재할 수 있는거 아닌가요?public static = 시스템 전체에서 같이 사용하는 자원?이라고 이해한 부분이 잘못된거 같아서 어떻게 이해하면 될지 문의드렸던 부분입니다.
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔과 의존관계 자동 주입 제대로 이해한건지 궁금합니다!
[질문 내용]@Configuration 이 붙은 클래스는 스프링 컨테이너에 설정 정보를 의미하는것으로 @Configuration 이게 붙은 클래스도 싱글톤이 보장되어야 하기 때문에 @Bean으로 등록되어 싱글톤을 보장하고 자동주입의 경우에 빈 이름을 @Component 에노테이션이 붙은 클래스를 빈 이름으로, 실제 의존관계 주입이되는 반환 객체를 @AutoWried 에노테이션이 붙은 생성자로 주입되는게 맞을까요?!제 머릿속에 있는 걸 그려봤는데 저런식으로 되는게 맞을까요?!
-
해결됨(2024년) 파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
하이레벨 오버뷰 관점이란 용어 뜻 문의
하이레벨 오버뷰 관점이란 말이 무슨 뜻인지 설명 부탁드립니다.
-
미해결김영한의 실전 자바 - 중급 1편
바깥 인스턴스만 생성하는 경우
InnerOuter outer = new InnerOuter(); InnerOuter.Inner inner = outer.new Inner();바깥 클래스와 내부 클래스의 인스턴스를 각각 생성하는 코드입니다. 만약 위 코드에서 두 번째 코드 없이 첫 번째 코드만 작성한다면 아래 그림에서 바깥 인스턴스의 참조를 보관하는 곳에 null이 저장되는 건가요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
피라미드 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제 피라미드는 안 생성되고 위아래로 나옵니다 ..
-
미해결김영한의 실전 자바 - 중급 1편
private 선언된 내부 중첩 클래스
저는 내부 중첩 클래스가 private으로 선언된 경우 바깥 클래스를 포함한 모든 외부 클래스가 내부 중첩 클래스에 접근할 수 없는 줄 알았습니다. 왜냐면 바깥 클래스와 내부 중첩 클래스는 무관한 클래스라고 들었던 것 같기 때문입니다. 그런데, 바깥 클래스에서 내부 중첩 클래스의 인스턴스를 생성하고, 내부 중첩 클래스에 접근할 수 있는 이유는 무엇인가요?
-
미해결스프링 핵심 원리 - 기본편
빈 충돌이 일어나는 테스트 오류를 못잡겠습니다ㅠㅠ
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]섹션7의 옵션처리 강의를 보며 테스트 코드를 같이 수정하고 있습니다.CoreApplication을 Run 했을 때 발생하는 오류입니다. *************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found: - memoryMemberRepository: defined in file [C:\Users\hotay\OneDrive\바탕 화면\study\core\core\out\production\classes\hello\core\member\MemoryMemberRepository.class] - memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class] 이 부분을 보고 MemoryMemberRepository 와 AppConfig와 AutoAppConfig 코드를 봤는데 뭐가 문제인지 모르겠습니다.package hello.core.member; import org.springframework.stereotype.Component; import java.util.*; @Component //빈등록될때는 앞에가 소문자로, memoryMemberRepository로 등록된다. public class MemoryMemberRepository implements MemberRepository{ private static Map<Long, Member> store = new HashMap<>(); @Override public void save(Member member) { store.put(member.getId(),member); } @Override public Member findById(Long memberId) { return store.get(memberId); } }package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; //애플리케이션 전체 동작 방식을 구성(config)하기 위해 // 구현객체를 생성하고 연결하는 책임을 가지는 별도의 설정 클래스 //메서드마다 역할이 드러나게끔 한다. @Configuration //설정정보에 적어주는 어노테이션 public class AppConfig { @Bean //스프링 컨테이너에 등록이 된다. public MemberService memberService(){ return new MemberServiceImpl(memberRepository());//생성자 주입 //MemberServiceImpl이 필요로 하는 MemberRepository 의존성을 외부에서 주입 } @Bean public MemoryMemberRepository memberRepository() {//구현객체를 반환해주는 역할 return new MemoryMemberRepository(); } @Bean public OrderService orderService(){ return new OrderServiceImpl(memberRepository(),discountPolicy());//생성자 주입 } @Bean public DiscountPolicy discountPolicy(){ return new RateDiscountPolicy(); } } package hello.core; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration //설정정보 어노테이션 @ComponentScan( basePackages = "hello.core", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)//AppConfig를 등록하지않도록 필터링 ) //컴포넌트 스캔 일일이 @bean 등록안해도됨 public class AutoAppConfig { //수동으로 빈을 등록하면 자동 빈보다 우선권을 가지게되어 오버라이딩 된다. (충돌오류X) //최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다. // application.properties에 spring.main.allow-bean-definition-overriding=true를 등록하면 오버라이딩 할 수 있다. /* @Bean(name = "memoryMemberRepository") public MemberRepository memberRepository() { return new MemoryMemberRepository(); }*/ } AutoAppConfig에 강사님 말씀 처럼 빈 충돌 테스트 한 부분을 주석처리해줬고 AppConfig를 등록하지 않도록 필터링 했는데도 어디에서 오류를 잡아야할지 모르겠습니다.
-
미해결김영한의 실전 자바 - 중급 1편
정적 중첩 클래스 개념 질문
'정적 중첩 클래스가 인스턴스에 속하지 않는다'는 뜻은 static 변수가 인스턴스에 속하지 않는다와는 다른 의미인게 맞을까요? 즉, static 변수는 인스턴스에 속하지는 않지만 해당 클래스에 포함됩니다. 그러나 정적 중첩 클래스는 인스턴스에 속하지 않을 뿐만 아니라 해당 클래스(바깥 클래스)와 무관하다고 하셔서 질문드립니다.정적 중첩 클래스 vs 내부 클래스가 static 변수 vs 인스턴스 변수와 같이 둘 다 클래스에 포함되지만 static 변수는 인스턴스에 포함되지 않는다는 뜻인지, 아니면 정적 중첩 클래스가 바깥 클래스에 포함되지 않는, 바깥 클래스와 전혀 무관한 클래스인지 알고 싶습니다.
-
해결됨김영한의 실전 자바 - 중급 1편
래퍼 클래스 - 참조형 기본형 비교
public class WrapperClassMain { public static void main(String[] args) { Integer i = new Integer(10); Integer in = new Integer(10); Integer integerObj = Integer.valueOf(10); //-128~ 127 자주 사용하는 숫자 값 재사용 System.out.println("내부 값 읽기"); int intValue = i.intValue(); System.out.println(intValue); System.out.println(i == intValue); //true System.out.println(i == integerObj); //false System.out.println(i == in); //false System.out.println(in == intValue); //true } }래퍼 클래스는 인스턴스의 참조값을 비교한다고 했는데, (i==intValue) 이 부분에서 참조형과 기본형을 비교하는 부분에서는 왜 true가 나오나요?
-
미해결김영한의 실전 자바 - 중급 1편
static 키워드 관련 질문 드립니다.
안녕하세요. static 키워드 관련 질문드립니다.class 안에 static 으로 변수를 선언하면서비스 전체에서 공통으로 사용한다고 이해했습니다.static class는 서비스 전체 공통이 아니고 독립적으로 생성할 수 있는데요static 이라는 키워드가 서비스 전체에서 사용한다는 의미가 있는게 아닌건가요? 변수와 클래스 앞에 static 이 붙은 경우에 차이점에 대해서 조금더 설명해주실 수 있을까요?
-
해결됨김영한의 실전 자바 - 중급 1편
섹션 10. try - with - resources
질문입니다!상황 1 .우선 NetworkClientExceptionV5는 RuntimeException을 상속 받은 상태입니다.public class NetworkClientExceptionV5 extends RuntimeException { public NetworkClientExceptionV5(String message) { super(message); } }그러면 NetworkClientExceptionV5를 상속받은 ConnectException과 SendException도 RuntimeException이 되는 거구요.public class ConnectExceptionV5 extends NetworkClientExceptionV5 { private final String address; public ConnectExceptionV5(String address, String message) { super(message); this.address = address; } public String getAddress() { return address; } }public class SendExceptionV5 extends NetworkClientExceptionV5 { private final String data; public SendExceptionV5(String data, String message) { super(message); this.data = data; } public String getData() { return data; } } 상황 2 .그리고 NetworkClientV5는 AutoCloseable을 구현했습니다. import exception.ex5.exception.ConnectExceptionV5; import exception.ex5.exception.SendExceptionV5; public class NetworkClientV5 implements AutoCloseable { private final String address; private boolean connectError; private boolean sendError; public NetworkClientV5(String address) { this.address = address; } public void connect() { if (connectError) { throw new ConnectExceptionV5(address, address + " 서버 연결 실패"); } // 연결 성공 System.out.println(address + " 서버 연결 성공"); } public void send(String data) { if (sendError) { throw new SendExceptionV5(data, address + " 서버에 데이터 전송 실패 : " + data); } // 전송 성공 System.out.println(address + " 서버에 데이터 전송 : " + data); } public void disconnect () { System.out.println(address + " 서버 연결 해제"); } public void initError(String data) { if (data.contains("error1")) { connectError = true; } if (data.contains("error2")) { sendError = true; } } @Override public void close() throws Exception { System.out.println("NetworkClientV5.close"); disconnect(); } } ==질문입니다!!==NetworkServiceV5에서public class NetworkServiceV5 { public void sendMessage(String data) { String address = "http://example.com"; try (NetworkClientV5 client = new NetworkClientV5(address)) { client.initError(data); // 추가 client.connect(); client.send(data); } } }try (NetworkClientV5 client = new NetworkClientV5(address))에서 컴파일 오류가 납니다.client에서 올라오는 예외들은 다 RuntimeException이므로 따로 throws를 안 해줘도 되는데 왜 해결하려고 하면 throws를 선언하거나 catch를 해야한다고 하는 건가요?RuntimeException은 예외를 throws 선언없이 자동으로 밖으로 던지기에 catch를 안 해도 상관이 없을텐데 왜 alt + enter을 누르면 throws 선언과 catch를 해야만 된다고 하는 건지 이해가 가지 않습니다. 제가 생각하는 건 이런식으로 흘러간다고 생각했습니다.main()에서 (error1 | error2)를 입력 받음 -> sendMessage를 호출 -> sendMessage에서 코드 진행 -> (client.connect | client.send)를 만나서 NetworkClientV5에 들어감 -> (ConnectException | SendException)을 터트림 -> NetworkClientV5에서 예외를 밖으로 던짐 (런타임이라서 throws 선언 안 해도 던져짐) -> NetworkService로 예외가 날라옴 -> 여기서도 처리가 불가능 하니, 예외를 밖으로 던짐 (여기서 throws 선언을 안해도 던져져야 한다고 생각함. 날아온 예외는 RuntimeException이기 때문에) -> main으로 예외가 넘어옴 -> main에는 catch (Exception e)가 있어서 예외를 잡고 정상흐름으로 돌아옴. 마지막은 메인메서드 입니다!import exception.ex5.exception.SendExceptionV5; import java.util.Scanner; public class NetworkmainV5 { public static void main(String[] args) { NetworkServiceV5 service = new NetworkServiceV5(); Scanner scanner = new Scanner(System.in); while (true) { System.out.print("전송할 문자 : "); String input = scanner.nextLine(); if (input.equals("exit")) { break; } try { service.sendMessage(input); } catch (Exception e) { exceptionHandler(e); } System.out.println(); } System.out.println("프로그램을 종료합니다."); } // 공통 처리 예외 private static void exceptionHandler(Exception e) { System.out.println("사용자 메시지 : 죄송합니다. 알 수 없는 문제가 발생했습니다."); System.out.println("==개발자용 디버깅 메시지=="); // 스택 트레이스 출력 e.printStackTrace(System.out); // 스택 트레이스 출력 System.err //e.printStackTrace(); // 필요하면 예외별로 별도의 추가 처리 가능 if (e instanceof SendExceptionV5 sendEx) { System.out.println("[전송 오류] 전송 데이터 = " + sendEx.getData()); } } }
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
강의 스트리밍 에러
강의가 스트리밍의 멈춤 현상이 심각한데, 인프런에서 해결을 못해주고 있습니다. 스트리밍이 10초분량이라도 여유를 두고 들어와야되는데, 딱 멈춰버립니다. 환불을 해준다고 얘기하는데, 너무 답답합니다.시크릿 모드에서는 들어오는데, 일반 모드에서 안들어 옵니다.시크릿모드는 계속 로그인을 신경써야하는 거라서 너무 화가 납니다. 한 챕터의 강의는 파일 전체를 로딩후에 뿌려주면 되는데, 스크롤 따라서 스트리밍 여유가 따라서 줄어듭니다. 그거 해달라는게 무리한 요구인가요? 강의 파일을 다 다운받아서 보던지해야하는 건가요?
-
미해결스프링 핵심 원리 - 기본편
테스트 실패: Unsatisfied dependency expressed through field 'prototypeBeanProvider'
해당 오류입니다. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'singletonWithPrototypeTest1.ClientBean': Unsatisfied dependency expressed through field 'prototypeBeanProvider': No qualifying bean of type 'javax.inject.Provider<hello.core.scope.SingletonWithPrototypeTest1$PrototypeBean>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 빈 주입이 안되어 오류가 나는 것 같아 @ComponentScan도 달아봤습니다. 빈을 못찾는다고 할까요package hello.core.scope;import jakarta.annotation.PostConstruct;import jakarta.annotation.PreDestroy;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;import javax.inject.Provider;import static org.assertj.core.api.Assertions.*;@ComponentScanpublic class SingletonWithPrototypeTest1 {@Test void prototypeFind() {AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); prototypeBean1.addCount(); assertThat(prototypeBean1.getCount()).isEqualTo(1); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); prototypeBean2.addCount(); assertThat(prototypeBean2.getCount()).isEqualTo(1); }@Test void singletonClientUserPrototype(){// 스프링 컨텍스트를 생성하고 빈을 가져옴 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.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(1); // 같은 count가 증가함 }@Scope("singleton")@Component static class ClientBean{// ObjectProvider를 통해 싱글톤 빈과 프로토타입을 함께 사용가능 @Autowired private Provider<PrototypeBean> prototypeBeanProvider; public int logic(){PrototypeBean prototypeBean = prototypeBeanProvider.get(); prototypeBean.addCount(); int count = prototypeBean.getCount(); return count; }}@Scope("prototype")@Component static class PrototypeBean {private int count = 0; public void addCount() {count++; }public int getCount(){return count; }@PostConstruct public void init(){System.out.println("PrototypeBean.init" + this); }@PreDestroy public void destroy(){System.out.println("PrototypeBean.destroy" + this); }}}