묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨C개발자를 위한 최소한의 C++
안녕하세요. 이동의미론에 대해 제가 잘 이해했는지 궁금합니다.
testdata는 class명 입니다. 1. testdata t1 = testdata(1);이 예전에는 임시객체를 생성해서 복사 생성을 했었음. 2. 그런데 그게 비용이 비합리적이니까 move sementic이라는게 나왔고 testdata t1 = std::move(testdata(1));을 사용해서 임시객체를 그냥 t1으로 shallow copy시킴. (C++11)3. 그런데 최근에는 이런 이동의미론 없이 testdata t1 = testdata(1)이라고 써도. 컴파일러가 자동으로 생성자만 호출하는 t1 인스턴스를 생성하는 코드로 평가를 해버림.제가 잘 이해하고 있는지 궁금합니다추가 : Test func(Test src): return src; 해당 함수를 실행 시키면, 값을 반환 할 때, 이동 생성자가 호출되는데반환시는 해당 콜스택이 사라지는 시점이기 때문에 이전까지는 좌측값이였지만,다음 라인에 사라지게 될 src를 우측값 취급을 해서 임시객체를 생성하는것으로 이해했습니다.이렇게 해석해도 괜찮을까요?
-
해결됨스프링 핵심 원리 - 고급편
오타? 및 내용 질문
안녕하세요 선생님 강의 듣다가 질문이 생겨서 글 작성해봅니다 제가 알기로 스프링 2.6 ? 이상에서 순환 참조가 자동으로 비활성 되어서 private final ObjectProvider<CallServiceV2> callServiceProvider; 을 사용해도 lazy 조회가 되지 않는것으로 알고 있습니다 그래서 application.yml 파일에서 이 설정을 true 로 바꿔주거나 test 시 @TestPropertySource(properties = "spring.main.allow-circular-references=true") 이 어노테이션을 추가하려 순환 참조를 활성화 시킨 후에 테스트 해봐야지만 정상 작동 되는걸로 알고 있는데 제가 알고 있는 내용이 다른지 궁금합니다
-
미해결TS/JS 디자인 패턴 with Canvas: 제로초에게 제대로 배우기
싱글톤 강의
싱글통 강의에서 숙제에 대한 답변도 볼 수있는 곳이 있을까요?
-
미해결TS/JS 디자인 패턴 with Canvas: 제로초에게 제대로 배우기
리스코프 치환원칙은 반,공변성과 같은 원리인가요?
class Parents { // 좁은 파라미터 method(name: string, test: string) { // 넓은 반환 타입 return { key: "" }; } } class Child extends Parents { // 넓은 파라미터 override method(name: string) { // 좁은 반환 타입 return { key: "", name: "" }; } } 안녕하세요,리스코프 치환원칙을 보니 반,공변성의 원칙과 같이매개변수는 반공변성을 리턴은 공변성을 가지는 것 같은데, T<child> -> T<parents> 개념이 되는 타입의 정의 원칙을 리스코프 치환 원칙이라 하는 것일까요?
-
미해결스프링 핵심 원리 - 고급편
proxyFactory.setProxyTargetClass(true); 궁금한거 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]proxyFactory.setProxyTargetClass(true);하면 인터페이스가 있어도 CGLIB로 프록시를 만든다고 했는데CGLIB는 클래스를 상속해서 프록시를 만드는 거 아니었나요? 어떻게 인터페이스만 있는데 이걸 CGLIB기술로 프록시를 생성하는거죠
-
미해결스프링 핵심 원리 - 고급편
빈 후처리기에 프록시 객체 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강사님훌륭한 강의 항상 잘 보고 있습니다.다름이 아니라, 이번에 빈 후처리기와 프록시 패턴에 대해 질문이 있습니다. 아래와 같이 빈 후처리기에서 A 객체를 A 프록시로 바꿔치기 해서 스프링 빈에 저장하고, A 프록시를 싱글톤으로 관리한다라고 이해했습니다. 이때, 궁금한 부분이A 프록시가 A 객체를 상속받아서, 부가기능인 advisor 기능을 추가한 A 프록시라는 객체를 새롭게 생성해서 스프링 빈으로 등록을 한다라고 이해하면 되는건가요?예를 들어, A 클래스가 A 메소드만 구현한 클래스라면A 프록시 객체는 A메소드와 A advisor라는 부가기능이 추가된 클래스같은 형태로 구현되고, 스프링 빈으로 등록된다고 이해를 하면 되는건가요?? 왜냐하면, 제가 이해한게 맞다면, 아래와 같이 proxy가 advisors를 호출한 뒤에, target을 호출한다는 개념이 잘 이해가 되질 않습니다. proxy가 target의 비지니스 로직도 가지고 있고, advisor도 가지고 있는 객체라서 proxy에서 내부적으로 로직을 다 처리하면 되는 것 아닌가요?? 설명 부탁드립니다 감사합니다
-
미해결스프링 핵심 원리 - 고급편
스프링의 빈 후처리기와 프록시 그리고 타겟에 대해 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 항상 강의 잘 보고 있습니다. 강의에서 1.생성 : 스프링이 스프링 빈 대상이 되는 객체를 생성함 2.전달 : 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달함 ~ 그 후에프록시 적용대상인 클래스가 있으면3.프록시 생성 : 프록시 적용 대상이고, 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록한다. 라고 말씀하셨습니다. 그 후에, 생성된 프록시와 어드바이저의 동작 과정을 설명하실 때 , client -> ( proxy <-> advisors ) -> target 이런 동작 과정이라고말씀하셨는데 이 부분에서 이해가 안되는 부분이 있습니다. 1.프록시 객체를 생성했는데 target을 호출하는 이유가 무엇인가요?예를 들어,프록시 객체는 target을 기반으로 만들어진 클래스라고 이해를 했습니다.그러면 프록시 객체는 target의 구현체로서 target의 메소드도 가지고 있고, advisor 메소드도 가지고 있는 것 아닌가요?그래서 그냥 타겟을 호출할 필요없이, 프록시 객체에서 모든 요청을 처리하면 되는것 아닌가요?? 왜 프록시 객체는 advisor을 호출하고, 다시 타겟을 통해서 메서드를 또 실행하는건가요? 즉, 전 프록시 객체를 만든다는 것을 아래와 같은 예시로 이해를 했습니다. 그래서 굳이 target을 다시 호출하지 않고, 프록시 객체가 모든 요청을 처리하는게 맞는거 같은데 왜 target을 다시 호출하는건가요?? // AClasspublic class AClass { public void say() { System.out.println("Hello from AClass!"); }}// LoggingAspectㅇ@Aspect@Componentpublic class LoggingAspect { @Before("execution(* com.example.AClass.say(..))") public void logBefore() { System.out.println("Before calling say method"); }} //Proxypublic class AClassProxy extends AClass { @Override public void say() { logBefore(); // 로그 출력 super.say(); // 실제 AClass의 say 메서드 호출 } public void logBefore() { System.out.println("Before calling say method"); }}감사합니다.
-
미해결스프링 핵심 원리 - 고급편
빈 후처리기와 프록시 그리고 @Transactional 관련 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 강사님. 항상 강의 잘 보고 있습니다.해당 강의를 듣고 개인 학습을 하던 중에 @Transactional에 대해 궁금한 점이 생겼습니다. 특히, **"@Transactional은 접근 제어자가 public이 아닌 메서드에는 적용되지 않는다"**는 부분에 대해 잘 이해가 되지 않았습니다.저는 이전에 강사님 강의를 듣고, @Transactional을 메서드에 적용할 때 빈 후처리기와 프록시 방식에 대해 아래와 같이 이해했습니다.A 클래스의 A 메서드에 @Transactional을 적용스프링은 해당 메서드에 트랜잭션을 적용할 수 있도록 AOP 기반으로 동적 프록시를 생성함.스프링 컨테이너가 @Transactional이 붙은 메서드를 가진 클래스는 AOP가 적용된 클래스임스프링은 @Transactional이 적용된 메서드를 감지하여, 트랜잭션을 적용하기 위해 AOP 기능을 사용함.스프링 컨테이너에 A 클래스를 bean으로 등록할 때, 빈 후처리기에서 A 클래스의 프록시 객체를 스프링 빈으로 등록스프링에서는 빈 후처리기에서 트랜잭션을 적용하는 프록시 객체를 생성함. 실제 A 객체가 아닌 프록시 객체가 빈으로 등록되며, 이 프록시 객체는 실제 A 클래스의 메서드들을 호출할 때 트랜잭션을 관리하는 추가 로직을 삽입함.그런데 이렇게 생성되고 사용될 때, **"@Transactional은 접근 제어자가 public이 아닌 메서드에는 적용되지 않는 이유"**가 잘 이해되지 않습니다.예를 들어, 아래와 같은 코드에서:public class MyService { @Transactional public void performAction() { // 트랜잭션이 필요한 메서드 } } 프록시 객체는 다음과 같이 생성될 것이라고 생각했습니다:public class MyServiceProxy extends MyService { @Override @Transactional public void performAction() { // 트랜잭션 관련 로직 추가 (시작, 커밋, 롤백 등) // 원래의 MyService.performAction() 호출 super.performAction(); } } 그런데, "왜 @Transactional이 붙은 메서드는 public이 아닌 접근 제어자에는 적용되지 않나요?" 이 부분에 대한 설명이 부족하여 궁금합니다.왜냐하면, 어차피 기존 클래스를 바탕으로 만들어지는게 프록시 객체라면 @Transactional을 적용할때, 접근 제어자가 왜 중요한지 잘 이해가 안됩니다설명 부탁드립니다
-
미해결스프링 핵심 원리 - 고급편
pointcut.setExpression 문자열에 컨트롤+마우스 좌클릭
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서는 pointcut.setExpression 문자열에 컨트롤+마우스 좌클릭하면 선언부로 이동 되는데 저는 되지 않습니다. 인텔리제이 올팩 구독해서 쓰고 있습니다. 뭔가 설정같은게 달라서 그럴까요?
-
해결됨C개발자를 위한 최소한의 C++
인스턴스의 개념에 대해 int a(3), int(5) 예시를 바탕으로한 질문입니다.
안녕하세요, 강사님.int a(3)은 인트형식(혹은 클래스)의 인스턴스 a를 3으로 초기화 한것이고, 상수 5가 int(5) 인트형식(클래스)의 인스턴스 5라고 한다면,Q1 인트형식의 상수들은 다 인스턴스인 것인가요?Q2 int(5)라는건 식별자가 없는 인스턴스 인거고 가령, int(5) + int(3) == int(7) 이렇게 기술했을때 참이 되나요?
-
해결됨얄코의 떠먹여주는 객체지향 디자인 패턴
빌더패턴 질문있습니다!
2분대에 나오는 PizzaBuilder static내부 클래스에 기본 생성자가 없으면 뒤에 나오는 main문에서 new Pizza.PizzaBuilder()가 가능한가요??
-
미해결스프링 핵심 원리 - 고급편
proxyFactory cglib 자동적용 관련 질문
@Bean public Advisor logTraceAdvisor(LogTrace logTrace) { LogTraceAdvice logTraceAdvice = new LogTraceAdvice(logTrace); DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut(), logTraceAdvice); return advisor; } @Bean public Pointcut pointcut() { NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut(); pointcut.setMappedNames("request*", "order*", "save*"); return pointcut; } @Bean public OrderControllerV2 orderControllerV2(LogTrace logTrace) { OrderControllerV2 target = new OrderControllerV2(orderServiceV2(logTrace)); ProxyFactory proxyFactory = new ProxyFactory(target); // 이걸 넣었더니 되네요 proxyFactory.setProxyTargetClass(true); // proxyFactory.addAdvisor(logTraceAdvisor(logTrace)); return (OrderControllerV2) proxyFactory.getProxy(); } @Bean public OrderServiceV2 orderServiceV2(LogTrace logTrace) { OrderServiceV2 target = new OrderServiceV2(orderRepositoryV2(logTrace)); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.addAdvisor(logTraceAdvisor(logTrace)); return (OrderServiceV2) proxyFactory.getProxy(); } @Bean public OrderRepositoryV2 orderRepositoryV2(LogTrace logTrace) { OrderRepositoryV2 target = new OrderRepositoryV2(); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.addAdvisor(logTraceAdvisor(logTrace)); return (OrderRepositoryV2) proxyFactory.getProxy(); }proxyFactory.setProxyTargetClass(true); 이 없더라도 자동으로 ProxyFactory가 인터페이스 기반이 아닐경우 cglib으로 프록시를 생성해야하는데 위의 주석사이의 코드가 없을 경우 다음과 같은 에러가 뜹니다.(jdk로 하려다가 실패하는 모양인데 이 말은 자동으로 cglib으로 proxyfactory가 돌리지 못했다... Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [hello.proxy.app.v2.OrderControllerV2]: Factory method 'orderControllerV2' threw exception; nested exception is java.lang.ClassCastException: class jdk.proxy2.$Proxy50 cannot be cast to class hello.proxy.app.v2.OrderControllerV2 (jdk.proxy2.$Proxy50 is in module jdk.proxy2 of loader 'app'; hello.proxy.app.v2.OrderControllerV2 is in unnamed module of loader 'app')강제로 setProxyTargetClass(true)로 하여금 설정해준다면 자동 설정기능을 사용하지 않은 것이라.. 왜 이런지 궁금하네요.제 코드가 실습 실제 코드와 약간 달라 실습 코드를 복사해서 쳐봐도 동일한 증상이 나타났어요.또한 setPorxyTargetClass를 지정해줘야 한다면 왜 컨트롤러에서만 해도 다 되는지도 의문입니다.
-
미해결스프링 핵심 원리 - 고급편
오타 제보....
안녕하세요 강사님강의 잘 듣고 있습니다.수업 내용을 정리하다가 별거 아니지만....오타 제보 입니다! 창구 지원 -> 창구 직원
-
해결됨C개발자를 위한 최소한의 C++
식별자 검색 순서 관련 namespace 생략 관련 오류에 관한 질문
강의 식별자 검색 순서 5분 50초 쯤에서 namespace안 Test int data를 주석하는 경우namespace Test 안의 cout << data<< endl; 에서 data가 모호성이 발생해서 에러가 나는 예시를 보여 주셨습니다. 그 이유를 data의 모호성으로 인해서 global space에 만 data가 있고 cout을 하는 Test namespace에서 data가 없으면 에러를 발생 한다고 하셨는데 std::data 와의 모호성 때문에 생기는 거로 생각 되고 namespace test안에 없고 외부에만 변수가 있더라도 std 같은 중복되지 않는 경우에는 빌드할 때 모호성때문에 에러가 발생 하지는 않지 않나요?물론 이렇게 하면 코딩할 때 햇갈리긴 할꺼 같습니다.
-
미해결스프링 핵심 원리 - 고급편
InterfaceProxyConfig에 관한 질문
@Configuration public class InterfaceProxyConfig { @Bean public LogTrace logTrace() { return new ThreadLocalLogTrace(); } @Bean public OrderControllerV1 orderController() { return new OrderControllerInterfaceProxy(new OrderControllerV1Impl(orderService()), logTrace()); } @Bean public OrderServiceV1 orderService() { return new OrderServiceInterfaceProxy(new OrderServiceV1Impl(orderRepository()), logTrace()); } @Bean public OrderRepositoryV1 orderRepository() { return new OrderRepositoryInterfaceProxy(new OrderRepositoryV1Impl(), logTrace()); } }강의 보기 전에 멈춰서 제가 먼저 configuration을 만들어봤는데 결과는 똑같은 거 같더라구요강의와 config하는 방식이 다른데 로직 자체는 똑같은 거 맞나요?(혹시나 logTrace를 빈으로 등록하고 사용해서 일관성이 깨질 수도 있나 생각했습니다.)그리고 parameter로 받는 것과 이렇게 빈으로 등록한 것의 차이가 무엇일까요?
-
해결됨스프링 핵심 원리 - 고급편
프록시 객체가 생겼다는 가정 하에 this와 target이 설명되어서 조금 헷갈리는 것 같습니다
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]프록시 적용 여부와 어드바이스 적용 여부가 한번에 설명되어서 약간 헷갈리는 것 같습니다.예제에서 사용한 방식은 컴포넌트 스캔으로 등록된 빈을 후처리기를 통하여 프록시로 생성합니다강의를 들은 후 위의 그림처럼 this(hello.aop.member.MemberServiceImpl) 포인트 컷으로 사용한 어드바이저만을 등록하는 경우를 시험해 보았습니다.아예 프록시 객체가 생성되지 않을 것 이라고 예상하였는데 로그를 보면예상과 다르게 프록시 객체가 생성되었음을 확인하였습니다.그렇다면 @Around("this(hello.aop.member.MemberServiceImpl)") 여기에서1. 프록시 객체를 생성할 때는 hello.aop.member.MemberServiceImpl 만을 보고 생성해 준다2. 후에 어드바이스를 적용할 지 판단할 시에는 this까지 고려하여 판단한다. -> 강의 내용에 따라 적용 안됨라고 정리할 수 있을까요??
-
해결됨스프링 핵심 원리 - 고급편
어드바이스에 매개변수를 전달한다 는 개념이 잘 이해가지 않습니다
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]aop가 적용되는 메서드(joinpoint)의 정보 를 어드바이스에서 편하게 사용하려고 전달하는 걸까요?또한 @Before("allMember() && args(arg,..)") public void logArgs3(Integer arg) { log.info("[logArgs3] arg={}", arg); }이렇게 hello메서드의 매개변수가 String이었는데 Integer로 설정해주게 되면 필터링 역할도 같이 수행하는 것으로 보이는데 제대로 이해한 것이 맞는지 궁금합니다
-
해결됨얄코의 떠먹여주는 객체지향 디자인 패턴
파사드 패턴에 대해 질문이 있습니다.
안녕하세요 강의 잘 보고 있습니다.파사드 패턴에 대해 질문이 있습니다.얄코님이 올려주신 예시에선 다음과 같이 두 상황이 나온다고 이해했습니다.다양한 서브 시스템을 파사드 클래스로 조합해 하나의 새로운 로직을 만듦.여러 서브 시스템을 생성시키고 세부 로직을 파사드 클래스에 위임.1번의 경우는 일종의 추상화로 이해하였으며, 2번의 경우 서브 시스템에 대한 의존성 주입을 파사드 클래스에 위임 및 세부적인 로직을 캡슐화하는데 의의를 두었다고 이해했습니다. 만약 의존성 주입은 자동으로 이루어지는 3-layer 아키텍쳐에서 파사드 패턴을 도입할 경우 이미 service 레이어에서 내부 로직에 대해 캡슐화가 되었으므로 다양한 서브시스템을 파사드 클래스로 조합하는 것(ex. 1번)에만 집중하면 될까요?
-
해결됨스프링 핵심 원리 - 고급편
JDK 동적 프록시 호출 메서드 감지?
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]proxy의 call을 호출한 후 어떻게 InvocationHandler.invoke() 를 호출하는 걸까요?
-
해결됨C개발자를 위한 최소한의 C++
nullprt vs null
안녕하세요. 마지막 주소록 예제를 따라하면서 궁금한 부분이 있어 질문드립니다. 두 가지 예제를 비교했을 시, 포인터를 초기화 시, NULL / nullptr 두 가지 방식을 모두 사용되고 있습니다. NULL로 초기화와 nullptr 초기화 방식에 있어, 어떠한 기준이 있는지 궁금합니다 ~ int MyList::addNewNode(const char* pName, const char* pPhone) { UserData* pNewUser = nullptr; // nullptr로 초기화 if (findNode(pName) != nullptr) return 0; pNewUser = new UserData; strcpy_s(pNewUser->name, sizeof(pNewUser->name), pName); strcpy_s(pNewUser->phone, sizeof(pNewUser->phone), pPhone); pNewUser->pNext = NULL; // NULL로 초기화 return 0; }void CMyList::releaseList(void) { CUserData *pTmp = m_Head.pNext; CUserData *pDelete = NULL; while (pTmp != NULL) { pDelete = pTmp; pTmp = pTmp->pNext; delete pDelete; } m_Head.pNext = NULL; }