묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨C개발자를 위한 최소한의 C++
반환유형이 클래스형 참조
안녕하세요 강사님, 반환 유형이 클래스 참조일 때 질문이 있습니다.반환유형이 클래스형인 것보다는 메모리 효율을 위해서 클래스형 참조로 선언을 하는데, 반환하는 참조가 함수 내부에서 생성된 지역 인스턴스의 참조라면 함수 스코프를 벗어나면 해당 인스턴스는 소멸되므로 main함수에서는 참조를 못하게 되는 것 아닌가요?이런 경우에는 반환 유형을 클래스형 참조가 아닌 클래스형으로 선언하는게 적절할까요? 감사합니다!
-
해결됨C개발자를 위한 최소한의 C++
강사님 질문 드립니다.
만약 함수내에서 func(ClassA a) { // 여기서 a 는 클래스임 } 과 같이 작성하면 ClassA 의 생성자는 호출되지 않지만 소멸자는 호출됩니다.그 이유를 알고 싶습니다.
-
미해결스프링 핵심 원리 - 고급편
동기화와 동시성 차이
동시에 traceId의 공유변수에 접근하니까 문제가 생겨서그걸 동시성 문제라고 하는데동기화에 문제가 있다는건 무슨말일까요?
-
해결됨C개발자를 위한 최소한의 C++
virtual 함수와 관련하여 질문 있습니다.
만약 기본 메서드로 virtual a() 를 정의한 후 첫번째 파생 클래스에서는 a() 로 정의를 하였습니다.마지막 파생 클래스에서도 a() 로 정의했다면 어떻게 동작하는지 궁금해서 여쭤 봅니다. 제 생각에는 기본하고 첫번째 파생 사이에는 virtual 처럼 즉 기본을 호출해도 파생이 호출될 거 같은데두번째 파생시에는 virtual 의 성격이 사라질 거 같습니다. 확인 부탁드립니다. 강사님
-
해결됨C개발자를 위한 최소한의 C++
생성자와 소멸자의 호출
04_Constructor 테스트 중에 질문 드립니다.Test test01; 과 같이 선언하면 생성자와 소멸자가 모두 호출되는데Test test02 = new Test(); 와 같이 호출하게 되면 소멸자는 호출되지 않습니다. 그 이유가 뭔지 궁금합니다.친절한 강의 감사드립니다.
-
미해결스프링 핵심 원리 - 고급편
멋지지 않나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]우리의 멘토꽤 멋지심
-
미해결스프링 핵심 원리 - 고급편
질문은 아니고 후기는 강의를 다듣고 남길려고 하는데
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)영한님의 강의력에 정말 감탄이 나오는군요 한마리의 백조같은 유려하고 우아한 설명이에요
-
해결됨C개발자를 위한 최소한의 C++
강사님 질문 드립니다.
opArithmetic 교육시에 "=" 오퍼레이터의 반환자를 *this 로 하지 않으면 문제가 생길거라 하셨는데 구체적인 문제 설명이 없으셔서 궁금합니다.
-
미해결스프링 핵심 원리 - 고급편
콜백 패턴 반환 타입 T가 두번 쓰이는 이유
public class TraceTemplate { private final LogTrace trace; public TraceTemplate(LogTrace trace) { this.trace = trace; } public <T> T excute(String message, TraceCallBack<T> callback){ TraceStatus status = null; try { status = trace.begin(message); //로직 호출 T result = callback.call(); trace.end(status); return result; } catch (Exception e) { trace.exception(status, e); throw e; } } } 위 콜백 템플릿 에서 메서드 반환이 T 제네릭인건 이해가 되는데왜 반환이 T가 2번 쓰이는걸까요?
-
해결됨C개발자를 위한 최소한의 C++
강사님 질문 드립니다.
임시객체와 보이지않는 복사생성 과정 프로그램에서- 제가 임의로 복사생성자 부분의 프로그램을TestData(const TestData& rhs){ cout << "TestData(const TestData&)" << endl;}- 위와 같이 수정하고- F11키로 디버깅 추적을 해보면 복사생성자가분명 위의 생성자에서는 nData 를 접근하는 명령이 없는데도 아래 부분에 있는private 😀int nData = 0;부분을 수행합니다.왜 그런지 질문 드립니다. 아울러 제가 초기화 부분 "= 0" 를 없애 버리면 수행되지 않습니다.
-
해결됨C개발자를 위한 최소한의 C++
R-value 참조에 대해서 질문이 있습니다.
r-value 참조에 대해서 질문이 있습니다. (02-rvalueRef 예제 강의 기준 r-value 참조 (임시 객체와 유효범위) 8분)코드를 포인터를 볼 수 있게 조금 수정했습니다.int testFunc(int param){ int result = param * 2; std::cout << &result << std::endl; return result;}int&& result = testFunc(10); std::cout << result << "pointer: " << &result << std::endl;임시 객체의 주소를 지우지 않고 가져다 쓰는것이라 하셔서 testFunc 함수의 return 하는 result 의 포인터를 확인 후 받는 result의 포인터가 같은지를 확인해 보았습니다. print된 2개의 result의 포인터 값이 다른 것을 확인했습니다. 혹시 임시 객체라는 것이 함수의 return result 값을 또 다른 포인터로 옮긴 뒤 받기 때문에 return result와 다르게 되는건가요?
-
미해결스프링 핵심 원리 - 고급편
ThreadLocal 관련 질문입니다.
traceId = traceId.createPreviousId(); // traceIdHolder.set(traceId.createPreviousId());두 코드의 결과에는 큰 차이가 없는 것 같은데, 굳이 traceIdHolder.set 을 사용해야 하는 이유가 있을까요??
-
미해결스프링 핵심 원리 - 고급편
Logtrace를 main함수에 등록하는 이유가 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ProxyApplication 메인함수에 @bean을 사용해 @Bean public LogTrace logTrace(){ return new ThreadLocalLogTrace(); } 이런식으로 logTrace를 등록해주는데, InterfaceProxyConfig가 아니라 main함수에 따로 등록해주는 이유가 무엇인가요?
-
해결됨스프링 핵심 원리 - 고급편
콘크리트프록시를 구현시 원본 구체를 파라메터로 받는이유
콘크리드프록시를 생성 할 때 기존 구체를 상속을 받고 오버라이딩 할 때 아래 예시와 같이 부모 메소드를 super를 통해서 호출이 가능한데요public class OrderControllerConcreteProxy extends OrderControllerV2 { private final LogTrace logTrace; public OrderControllerConcreteProxy(OrderServiceV2 orderService, LogTrace logTrace) { super(orderService); this.logTrace = logTrace; } @Override public String request(String itemId) { TraceStatus status = null; try { status = logTrace.begin("OrderController.request()"); //target 호출 String result = super.request(itemId); logTrace.end(status); return result; } catch (Exception e) { logTrace.exception(status, e); throw e; } } @Override public String noLog() { return super.noLog(); } }이렇게 super를 통해서 호출하지 않고 OrderControllerV2를 따로 new 해서 멤버 변수로 받고 그 원본 구현체를 호출하는 이유가 있을까요?
-
미해결스프링 핵심 원리 - 고급편
execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();강의에서는 pointcut을 위 코드와 같이 전역으로 선언하고 사용하고 있더라구요. pointcut을 전역으로 선언 후 테스트에서 사용하는데 beforeEach에서 초기화를 하지 않으면 다른 테스트에 영향이 갈 수 있지 않나? 생각이 들어서 , 한 번에 모든 테스트를 실행시켜 debug point를 찍으며 확인해봤는데요. 그런데 자동으로 테스트마다 pointcut이 초기화 되더라구요 이유가 있을까요??
-
미해결스프링 핵심 원리 - 고급편
스레드 / traceId 구분
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링부트 자체에서 찍어주는 log를 보면 스레드ID로 이미 충분히 구분이 되고 있는데, 선생님께서 진행해주시는 강의에서는 traceId를 추가해서 개발자가 직접 구분을 또 해주는 이유가 뭔지 알 수 있을까요?
-
해결됨스프링 핵심 원리 - 고급편
템플릿 콜백 패턴 V5 실행 관련 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.v5 코드를 작성했을 때, 아래와 같은 에러가 발생해서Description: Parameter 0 of constructor in hello.advanced.app.v5.OrderRepositoryV5 required a bean of type 'hello.advanced.trace.callback.TraceTemplate' that could not be found. Action: Consider defining a bean of type 'hello.advanced.trace.callback.TraceTemplate' in your configuration. Process finished with exit code 1TraceTemplate 클래스에 @Component 애노테이션을 추가했는데요.@Component @RequiredArgsConstructor public class TraceTemplate { private final LogTrace trace; public <T> T execute(String message, TraceCallback<T> callback) { TraceStatus status = null; try { status = trace.begin(message); T result = callback.call(); //로직 호출 trace.end(status); return result; } catch (Exception e) { trace.exception(status, e); throw e; } } }pdf에는 빈 등록과 관련된 부분이 없는 것 같은데, 빈 등록을 하지 않아도 실행이 되어야 하는 것인가요?스프링 부트 3.1.7 버전 사용하고 있습니다.감사합니다.
-
해결됨C개발자를 위한 최소한의 C++
예외 클래스에서 catch 안의 데이터형이 참조자인 이유
안녕하세요. 강의 잘 보고 있습니다.강의를 듣다가 궁금한 것이 생겨서 질문 드립니다. catch(MyException &exp) { // 생략 }이 강의 예제에서 catch의 예외 데이터형에 클래스 참조자를 받도록 하였는데 만약 아래처럼 참조자를 사용하지 않으면 복사생성이 되나요?catch(MyException exp) { // 생략 }
-
미해결스프링 핵심 원리 - 고급편
invoke에 대해서 궁금한점이 있습니다.
JDK동적 프록시를 도입후에 사용하게되면 내부에 target 메소드를 직접 호출하는 방식에서 invoke형태로 메소드를 호출하는 방식으로 변경이 되는데 해당 프록시객체의 메소드를 사용할때마다 invoke를 사용하는 방식으로 사용이 되는건가요? 만약에 그렇다면 일반적으로 알기론 일반메소드 호출보다 invoke를 사용한 메소드 호출이 속도면에서 안좋다고 들었는데 이런걸 감안하고 사용을 하는건가요?
-
미해결스프링 핵심 원리 - 고급편
InvocationHandler에 대해서 질문이 있습니다.
public class TimeInvocationHandler implements InvocationHandler { private final Object target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log.info("TimeProxy실행"); log.info("proxy={},proxyclass={}",proxy,proxy.getClass()); long startTime=System.currentTimeMillis(); Object result=method.invoke(target,args); //파라미터 인자값 넘겨줌 long endTime=System.currentTimeMillis(); long resultTime=endTime-startTime; log.info("TimeProxy종료 resultTime={}",resultTime); return result; } }@Test void dynamicA() { AInterface target=new AImpl();//원객체 TimeInvocationHandler handler=new TimeInvocationHandler(target); //프록시 객체 AInterface proxy=(AInterface) Proxy.newProxyInstance(AInterface.class.getClassLoader(),new Class[]{AInterface.class},handler); proxy.call(); log.info("targetClass={}", target.getClass()); log.info("proxyClass={} proxy={}",proxy, proxy.getClass()); } 해당부분에서 invoke의 파라미터로 넘어오는 proxy의경우 찍어보니우리가 만든 프록시 객체와 동일한 객체로 찍히던데 해당 파라미터를 사용하는경우가 존재하나요?프록시 체인을 사용하더라도 어차피 target을 이용해서 호출하는거기때문에 관련이 없을꺼같고