묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
접근제어자에 대하여..
public class BlackBoxRefurbish { String modelName; String resolution; private int price; String color; public String getModelName() { return modelName; } public void setModelName(String modelName) { this.modelName = modelName; } } 1.접근 제어자는 변수, 메서드, 성생자에 대한 접근 권한을 지정할 수 있고, getter와 setter는 메소드이기 때문에public String getModelName() {} 처럼"public을 통해 메소드인 게터와 스케터를 접근을 제어할 수 있다" 고 알고있으면 되는 걸까요?2. 접근제어자(후반전) 강의 중 6분에서 alt + enter를 누르면 import class를 하셨는데 이거는 어떤 기능인가요? 맨 위에 import chap_07.A; 라고 뜨는데 뒤에서 배우는 부분인가요?3.동일 강의 5분 38초 쯤에서 class A를 입력한 직후 기존 BlackBoxRefurbish 파일이 끝에 .java가 붙었습니다. 파일에 변화가 생긴건가요? 아니면 원래 클래스와 .java는 같은 건가요?그리고 이후 자바 파일 내에서는 클래스를 여러 개 만들 수 있다고 하셨는데, 일반적인 클래스 파일 내에서는 여러 개의 클래스를 만들 수 없나요? 설명이 빈약하지만..(새로운 강의를 시작할 때 마다) 패키지에 만드는 새로운 클래스 내부에 또다른 새로운 class를 적용할 수 없는 건지 궁금합니다..감사합니다 ^^
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
생성자에 대하여..
안녕하세요 생성자를 공부 하던 중 궁금한게 생겨서 질문 드립니다!! ^^ 생성자를 정의하는 방법이 헷갈려서 질문 드립니다!1.클래스와 같은 이름을 가진 메소드를 만드는 것이 생성자를 만드는 방법이라고 할 수 있는건가요? (2.그리고 class Calculator는 Calculator라는 클래스를 만드는 것이고, public Calculator는 메소드 오버로딩처럼 이미 만들어진 Calculator 클래스를 수정하는건가요?)package chap_07; class Calculator { int left, right; public Calculator(int left, int right) { this.left = left; this.right = right; } public void sum() { System.out.println(this.left + this.right); } }3.위 코드에서 class Calculator 로 클래스를 만들고 이후 public Calculator 로 클래스와 같은 이름인 메소드를 만듬으로써, calculator 클래스를 열면 바로 int left,right를 입력하도록 하는 생성자를 만든 것인가요?public class CalculatorDemo1 { public static void main(String[] args) { Calculator c1 = new Calculator(); // 에러 발생 c1.sum();4.그리고 Calculator() 괄호 안에 아무것도 입력하지 않으면 오류가 생기는 것을 미루어 보아새로운 인스턴스를 만들 때 생성자가 작동하는 것이 맞나요?감사합니다.
-
미해결백엔드 프레임워크 만들기 (개정판)
m1 맥북 환경 구성 오류
m1에서 /waf/callList 호출할 때 위와 같은 에러가 발생합니다.sqlite-jdbc 버전이 문제인 것 같은데 어디서 수정해야 하는지를 모르겠습니다. 수정해보려고 했는데 기존에 스프링 부트로만 프로젝트를 하다보니 방식이 너무 달라 어떻게 해결해야 할지 감이 안잡히네요...어떻게 수정하면 될까요?
-
미해결스프링 핵심 원리 - 기본편
추상화비용이 발생한다는 것이 궁금합니다 영환님!
영환님 인터페이스를 활용할 때 추상화 비용이라는 것이 발생한다고 하셨는데 구글링 검색해도 정확한 지식을 얻기 힘들어서 질문 드립니다.수업 내용의 기능을 확장할 가능성이 없다면, 필요할 때 리팩터링해서 인터페이스를 도입하는 방법 등 수업 내용은 이해했으나 추상화라는 비용이 정확히 무엇인지 궁금합니다!
-
미해결Java TPC (생각하고, 표현하고, 코딩하고)
static 멤버 사용
static 멤버를 수업 설명과 같이 객체 생성없이 클래스 이름으로 접근한다는것은 강사님 설명 덕분에 잘알았습니다!!그렇다면 static 멤버를 사용하는 이유는 객체 생성없이 클래스이름으로 바로 접근가능하다는 것인데, 객체 생성없이 메소드를 접근하게되면 어떤점이 좋은가요???객체 생성이 필요없으니 코드를 줄일 수 있는것이 장점일까요?이유를 알아야 잘 활용할 수 있을거 같아 질문남깁니다!
-
미해결스프링 핵심 원리 - 기본편
@Coponent가 붙는 클래스는 무조건 public이어야 할까요?
@Repository class ReviewRepositoryImpl implements ReviewRepository {...}이런 식으로 class 접근제한자를 default로 하면 안되던데 왜 그런걸까요??저는 스프링 빈으로 구현체가 등록되고, 컨테이너에 있는 빈들이 자동으로 생성자 주입될테니, 구현 클래스를 숨기고 싶어 default로 변경했습니다! 항상 좋은 강의 감사합니다 :)
-
해결됨스프링 핵심 원리 - 기본편
JAVA 문법 질문 - 매개변수 객체 생성 / @RequestMapping 질문
@RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); MyLogger myLogger = provider.getObject(); myLogger.setRequestURL(requestURL);위 코드는 강의에 나온 코드 입니다 . @RequestMapping : 특정 URL로 요청(Request)을 보내면 Controller에서 어떠한 방식으로 처리할지 정의 여기서는 "log-demo" 로 요청 하면 logDemo 메서드를 호출한다 위 코드와 아래 코드가 같다고 볼 수 있을까요 ? @RequestMapping("log-demo") @ResponseBody public String logDemo() { HttpServletRequest request = new HttpServletRequest; String requestURL = request.getRequestURL().toString(); MyLogger myLogger = provider.getObject(); myLogger.setRequestURL(requestURL); 매개변수로 넣었을 때랑 뭐가 다른지 잘 모르겠습니다
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
HashMap 내 \t 출력에 문제가 있습니다.
안녕하세요, 해시맵 부분 수강하던 중 강사님과 다르게 출력되는 부분이 있어 문의드립니다.아래 코드를 출력한 결과 제 화면에서는 \t 만큼 띄워지지 않고, key와 포인트 부분이 한 칸(스페이스바 하나)만 띄워서 출력됩니다. 강사님이 올려주신 파일로 실행을 해도 문제가 해결되지 않습니다. 일반 sout 문에서는 문제없이 \t를 사용할 수 있는데, 아래 코드에서만 제대로 출력되지 않는 것 같습니다. 읽어주셔서 감사합니다. // Key & Value 함께 확인 for (String key : map.keySet()) { System.out.println("고객 이름 : " + key + "\t포인트 : " + map.get(key)); } System.out.println("------------------------");
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
강사님, 질문사항 있습니다!
LinkedList 와 ArrayList 는 기능이나 선언, 입력, 삭제하는 문법이 대부분 같은데요. 분명 각각의 용도나 목적이 있으니 이 둘이 구분된 것으로 생각하고 있습니다. 혹시 각각 어떤 목적으로 어떤 용도로 사용하는지 구분을 알 수 있을까요? (실무에서는 이럴 때 뭐를 사용하고, 어떤 경우엔 뭐를 사용한다, 이런 내용도 좋을 것 같습니다!)
-
미해결스프링 핵심 원리 - 기본편
빈 이름으로 조회 테스트 관련 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빈 이름으로 조회하는 test를 작성할 때 강사님께서 "memberService가 MemberServiceImpl의 인스턴스 이면 성공" 이라고 하셨는데1. AppConfig의 memberService 메소드가 실행되고 반환된 MemberServiceImpl이 memberService 객체에 저장됨그러므로 memberService가 MemberServiceImpl의 인스턴스임 성공의 의미가 맞을까요?아니면 AppConfig의 memberService 메소드가 MemberServiceImpl의 인스턴스라는 걸까요..? 이건 말이 안 된다고 생각해서요..
-
미해결스프링 핵심 원리 - 기본편
statefulService 참조를 2개 선언하는 이유
싱글톤 방식의 문제점 코드에서, @Test void statefulServiceSingleton() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean("statefulService", StatefulService.class); StatefulService statefulService2 = ac.getBean("statefulService", StatefulService.class); // 스레드 A: A 사용자가 10000원 주문 statefulService1.order("userA", 10000); // 스레드 B: B 사용자가 20000원 주문 statefulService2.order("userB", 20000); // ThreadA: A 사용자 주문 금액 조회 int price = statefulService1.getPrice(); //ThreadA: 사용자A는 10000원을 기대했지만, 기대와 다르게 20000원 출력 System.out.println("price = " + price); assertThat(statefulService1.getPrice()).isEqualTo(20000); }다음과 같이 statefulService1, statefulService2 로 StatefulService의 참조 변수를 2개 선언해주는데 이렇게 선언해주신 이유가 뭔가요? 다른 스레드라도 어차피 같은 참조를 호출하게 되지 않나요..? 단순히 스레드의 개념을 보여주시기 위해 Service 참조변수를 여러개 선언하신 건가요?
-
미해결스프링 핵심 원리 - 기본편
AppConfig 가 스프링 빈으로 등록되는 과정이 궁금합니다.
강의 내용을 보면 AppConfig 클래스의 경우 스프링 빈으로 등록이 될 때 임의의 클래스를 만들어서 AppConfig 를 한번 상속 받고 CGLIB 라이브러리를 이용해 바이트코드를 조작한 후 스프링 컨테이너에 빈으로 등록된다고 말씀하셨습니다.이전 강의에서는 스프링 컨테이너에 빈이 등록될 때 beandefinition이 먼저 생성되고 beandefinition에 등록된 메타정보를 바탕으로 빈을 생성하여 스프링 컨테이너에 등록된다고 말씀하셨었는데요.그렇다면 AppConfig 클래스의 경우에는beandefition 생성 -> 임의의 클래스 생성 후 상속 및 CGLIB 를 이용한 바이트코드 조작 ->스프링 컨테이너에 bean 등록과 같은 절차가 진행되는건가요??
-
미해결스프링 핵심 원리 - 기본편
NoUniqueBeanDefinitionException 에러
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,getDiscountPolicy이 에러가 나서 원인을 찾아보니 AppConfig의 @Bean public DiscountPolicy getDiscountPolicy() { //return new FixDiscountPolicy(); return new RateDiscountPolicy(); }이 부분과@Component public class RateDiscountPolicy implements DiscountPolicy {}이 부분때문에 RateDiscountPolicy 빈이 2개로 등록되어서 그런 것 같아 AppConfig에서 @Bean어노테이션을 주석처리하니 정상적으로 테스트가 됐는데요. 궁금한 점은 AutoAppConfig 에서 AppConfig에 대한 부분은 제외를 시켰는데 왜 중복이 되는가입니다....@Configuration @ComponentScan( basePackages = "hello.core.member", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) // 기존 AppConfig.java 때문에 컴포넌트 스캔 대상에서 제외시킴 public class AutoAppConfig {}
-
미해결스프링 핵심 원리 - 기본편
Repository는 싱글톤 상태인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]AppConfig 리팩토링 강의에서 질문드립니다!DIP를 지켜주기 위해 AppConfig의 MemberRepository()를 inject하는 과정에서,memberRepository() 메소드가 MemoryMemberRepository() 객체를 생성해서 넘겨주게 되는데,이 경우에, OrderService로 넘어가는 memberRepository와 MemberService로 넘어가는 memberRepository 객체가 동일한 객체인가요??public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } private static MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); } public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } 제가 생각한 바로는, MemberService, OrderService 각각에 들어가는 객체가 new로 들어가, 다른 repository를 참조하는 것 같아서요! 예시를 위해 이렇게 구현하신 건지.. 아니면 실제 repository가 싱글톤으로 돌아가는지 궁금합니다..!!싱글톤으로 돌아간다 하더라도, 어떻게 각각에 new를 해줬는데 싱글톤일 수 있는지도 궁금하네요..!! 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
@Transactional 안에서 외부 서비스 api call 관련 질문있습니다.
@tranactional 이 붙은 메소드 안에서 외부 서비스 api를 call 해야하는 상황이 있는데컨트롤러 단에서 로직 분리가 힘든 상황입니다. @tranactional 이 붙은 메소드 안에서 아래와 같이 TransactionSynchronizationManager를 선언하고 override한 aftercommit 내부에서 호출하게 될 경우마찬가지로 외부 서비스 api에 장애가 발생했을 때도 본 서비스에 장애로 이어질 수 있을까요?? TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { // 여기서 외부서비스 api 호출 } });
-
미해결스프링 핵심 원리 - 기본편
프록시와 스코프에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1.CGLIB 라이브러리 관련 얘기를 싱글톤을 배울 때@Configuration 이 들어간수동 빈 등록 혹은자동 빈 등록@ComponantScan 에 자동으로 CGLIB이 적용 된다고 이해하면 되는걸까요 ?? 2.프록시를 보면서 가짜 프록시 객체를 생성하고 진짜객체를 조회 할 때까지 지연 처리 한다 적혀있는데CGLIB 이 적용된 @Bean 을 생각해 보면스프링 컨테이너에 myLoger 빈이 있으면 그대로 사용없으면 myLogger를 등록 후 리턴해서 싱글톤 보장이 된다고 이해를 했는데.request 스코프 빈은 요청이 와야 생성할 수 있으며Proxy,Provicder 가 지연 처리를 하며 ( localhsot~~~~ log-demo 들어갈때까지)CGLIB 기능(빈이 있으면 사용 없으면 새로 생성해서 리턴)myLogger@CGLIB(상속받은객체) 가 프록시 객체에 들어가며'가짜 프록시 객체는 실제 요청이 오면 그때 내부에서 실제 빈을 요청하는 위임 로직이 들어있다.'→ 가짜 프록시 객체 실행 시(myLogger.log 등..) @Componant 진짜 myLogger 빈을 사용해서기능 실행제가 이해한 Proxy,Provider 역할이 맞을까요 ? 3. @Scope는 싱글톤 스코프가 기본값으로 적용 되어있는데 여태까지 로직처리나 그런 부분은 따로@Scope를 설정 안했는데 DB연결 이나 네트워크 관련(페이지 이동? 로그인?) 일 때 주로 사용하는게 맞나요 @Scope에 대해서 어려움이 있어 질문 남깁니다..ㅠ
-
미해결[코드팩토리] [입문] Dart 언어 4시간만에 완전정복
초급자 질문
안녕하세요 dart강의로 코딩을 시작해보려고 강의를 들어봤습니다 제가 너무 초급자라서 그런지 잘 이해를 못하는 것 같은데 선행으로 하면 좋을 언어가 있을까요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
9강 실제 메모리에 존재하는 것과 무관하게 게터와 세터를 만들 수 있다
안녕하세요. 9강 마지막 요약 부분에서 '실제 메모리에 존재하는 것과는 무관하게 getter,setter를 만들 수 있다.' 라고 말씀해주신 부분에 대해서 질문 드립니다.쭉 이어서 설명해주신 것처럼, 코틀린으로 작성한 getter.setter가 byte코드 변환 시 함수로 생성되는데요. 그럼 실제 메모리에는 함수로 존재하는거 아닌가요?..아니면 코틀린에서 그부분은 캡슐화?.. 처럼 내부구현을 가려놔서 사용자인 개발자들은 메모리에 없는 것처럼 느낀다? 라고 말씀해주신 걸까요?? 궁금해서 질문드려봅니다!
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
인스턴스에 대해
안녕하세요~ 공부를 하다가 막히는 부분이 생겨 질문 드립니다. 인스턴스와 인스턴스 변수는 서로 다른건가요? 검색해보니 인스턴스 변수는 인스턴스가 생성될 때 생성된다. 라고 나와있는데 잘 이해가 가지 않습니다. 그리고 인스턴스 메소드도 잘 이해가 가지 않습니다.. BlackBox b1 = new BlackBox(); 에서 b1이 새로운 객체(인스턴스)인 것 까지는 알겠는데 단어가 비슷하다보니 잘 이해가 가지 않네요..!!
-
미해결스프링 핵심 원리 - 기본편
컨테이너 생성시 파라미터 전달하여 빈 등록하기
@Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); DiscountService.class 를 파라미터로 넘기면서 해당 클래스를 자동으로 스프링 빈으로 등록한다고 알고 있습니다 .static class DiscountService { private final Map<String, DiscountPolicy> policyMap; public DiscountService(Map<String, DiscountPolicy> policyMap) { this.policyMap = policyMap; DiscountService 클래스가 빈으로 등록되었으니 그럼 여기 DiscountService 생성자는 @Autowired 가 생략되어있다고 볼수 있는건가요? @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class); DiscountService discountService = ac.getBean(DiscountService.class);@Component static class DiscountService { private final Map<String, DiscountPolicy> policyMap; @Autowired // 생성자가 1개인 경우 생략 가능 public DiscountService(Map<String, DiscountPolicy> policyMap) { this.policyMap = policyMap; 위의 코드와 아래 코드는 동일하다고 볼 수 있나요?