묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨김영한의 실전 자바 - 기본편
반복문 리팩토링 질문드립니다.
안녕하세요 영한님!질문은 처음 드리는거 같습니다~ 기본형과 참조형 '문제와 풀이' 시간에ProductOrder를 리팩토링하는 부분에서 질문이 있습니다. 리팩토링 하는 과정에서 for문 안에서 수행하던 print와 totalAmount를 계산하는 로직을 각각 메서드로 나누었는데요,이렇게 되면 한번만 수행되던 반복문이 메서드로 나누면서 각각 수행되어 2번이 되는데 이런 부분은 for문이 한번 더 돌게되어 오는 성능이슈보다, 깔끔하게 리팩토링 되는 부분이 더 이점이 큰 부분일까요? 사실 현업에서 업무를 할때도,for안에서 여러가지 로직이 수행되면 한번에 파악하기가 어려워서 나눠야지 싶어서 나누었지만, 한번만 돌던 반복문이 여러번 돌게 될 수 있어서 망설여지는 부분이 있었습니다. 이 부분 질문드립니다!감사합니다~
-
해결됨김영한의 실전 자바 - 기본편
상속 관계와 캡슐화 질문
안녕하세요 영한님 강의 잘 보고 있습니다.상속 관계와 캡슐화에 대해 궁금증이 있어 질문 남깁니다. 문제를 풀 때 부모와 자식은 각각 별도로 생성되지만, 하나의 묶음으로 생각되어 자식 클래스에서 부모 클래스의 필드에 직접 접근 가능하여야 한다 생각했습니다그리하여 부모 클래스의 필드를 protected로 생성하여 풀었는데, 영한님 문제 풀이를 보니 private 으로 감추시는걸 보고 의문점이 생겼습니다private으로 감춘다면 기존 부모 클래스 기능을 오버라이딩 하여 부모 필드에 접근이 필요 할 때는 getter/setter 같은 메소드를 만들어서 접근 해야 하는 걸까요?아래는 Car Class의 move 메소드를 GasCar Class가 재정의 하는 코드를 간략하게 작성해보았습니다public class Car { private int speed; public void move(){ speed++; System.out.println("speed : " + speed); } protected int getSpeed() { return speed; } protected void setSpeed(int speed) { this.speed = speed; } } public class GasCar extends Car{ @Override public void move() { int speed = getSpeed() + 2; setSpeed(speed); System.out.println("speed : " + speed); } } 따라서 상속 관계라도 일반 객체를 사용하는 입장과 동일하게 캡슐화를 해야 하고, 확장의 여지를 두고 부모 클래스의 필드에 접근하는 메소드를 만들어야 하는것인지 궁금합니다!
-
미해결김영한의 실전 자바 - 기본편
메모리 영역에 관해서 질문드릴게요
이 코드에서요 메서드영역,스택영역,힙영역이 조금 헷갈려서요public static void main(String[] args)이 main메서드는 스택영역이고public static int sum(int[] array){ int sum = 0; for (int sum1: array) { sum += sum1; } return sum; }이 sum 메서드는 메서드 영역,int[] array 매개변수는 heap영역sum메서드안에 있는 변수들은 stack영역 이렇게 이해하면될까요?
-
미해결스프링 핵심 원리 - 기본편
어노테이션 사용법에 대해 (feat: @ComponentScan.Filter)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. "컴포넌트 스캔과 의존관계 자동 주입 시작하기" 강의를 듣던 중 궁금한 것이 생겼습니다. 다른 언어를 주로 사용한 제가 자바 어노테이션에 익숙하지 않아서 생기는 궁금증인 것 같습니다. 위의 코드를 보면 @ComponentScan의 인자로 @ComponentScan.Filter가 사용되는 것을 볼 수 있습니다. 근데 특이하게 '@'가 붙어있습니다. 반대로 Configuration는 어노테이션인데도 불구하고 "@Configuration.class"가 아닌 "Configuration.class"라고 쓰입니다. 왜 어떤 것은 @가 붙고 어떤 것은 @이 안 붙는지 알 수 있을까요? reference로는 뭘 보면 될까요?
-
해결됨스프링 핵심 원리 - 기본편
ApplicationContext가 여러 인터페이스를 상속받은 것이 어느곳에 활용되는지 잘 모르겠어요.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. "BeanFactory와 ApplicationContext" 강의를 보던 도중 궁금한 것이 있어 질문을 드립니다. ApplicationContext가 단순히 BeanFactory를 넘어 여러 강력한 기능을 제공하기 위해 다른 인터페이스도 상속한다고 합니다. 그런데 EnvironmentCapable를 제외하고 다른 인터페이스들이 ApplicationContext에서 무엇을 위해 활용되는지 잘 모르겠습니다. MessageSource, ApplicationEventPublisher, ResourceLoader들이 ApplicationContext 인터페이스에서 실무에서 어떻게 응용되는지 알 수 있을까요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
no frameworks detected
안녕하세요. 다운 받은 소스파일을 실행하려고 하는데 강의에서 나온 순서로 진행했는데도 no frameworks detected 나와서 어떻게 해결해야 할 지 모르겠어서 질문드립니다.JDK21 사용중입니다.
-
해결됨스프링 핵심 원리 - 기본편
@Configuration 어노테이션 지정하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]메인 메서드에서 스프링 컨테이너를 생성하고 AppConfig 클래스를 구성 정보로 쓰기 위하여 ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class)를 하였습니다.그런데 AppConfig클래스를 환경 설정해주는 구성 정보 클래스로 지정하기 위해서 @Configuration 어노테이션을 지정하였는데 앞에서 AppConfig.class로 지정해줄 거면 굳이 @Configuration어노테이션으로 지정하는 이유가 궁금합니다
-
미해결김영한의 실전 자바 - 기본편
12.다형성과 설계.pdf 파일 오타 제보합니다.
김영한님 안녕하세요.유스방에서 늘 신세지고 있는 레이지 로딩 입니다.2년차 주니어로 일하며 기초가 제대로 잡히지 않았는데 너무 기술에만 집착하는 제 자신을 보며 초심으로 돌아가야 겠다고 마음먹은 참에 마침 감사하게도 자바 기초 강의를 내주셔서 감지덕지하며 공부하고 있습니다. 강의 보는 중 오타 발견하여 남겨둡니다. 먄약 -> 만약지난 3월에 출시하신 [스프링 부트] 강의에 이어 또 한번 강의에 미약하게나마 도움을 드릴 수 있어 영광입니다.내년에 또 인프콘에서 인사드릴 수 있으면 좋겠습니다.지식을 공유해 주셔서 항상 감사합니다.
-
해결됨객체 지향 프로그래밍 입문
객체의 기능보다 속성을 먼저 추출하는 것에 대해 의견을 여쭤보고 싶습니다.
안녕하세요. 강사님.객체는 제공하는 기능으로 정의된다!=> 회원 객체 (암호 변경하기 기능) 대부분의 프로그램은 정보 표현을 위한 데이터(구조체, 객체)는 존재하기 마련일텐데요. 제가 생각하기에 회원이라는 객체는 초기 설계 과정에서 제공해야 될 기능에 중점을 두기보다는 "일반적으로 표현해야 될 정보에 기반(표현 정보 = 관리해야 될 데이터)해서 추출되지 않나?" 가 저의 생각입니다.여기서 궁금한점은 표현해야 될(관리해야 될 데이터) 정보를 구조화한 것에 관련된 데이터를 조작하는 기능을 추가해도 외부에 제공하는 기능으로 정의된다는 말씀은 만족한다고 볼 수 있을까요 ?제가 강의를 듣고 정리하자면 객체를 설계할 때는 외부에 제공할 기능에 중점을 두고 설계를 해야되는 것이라고 받아들였는데 기능보다 데이터가 중심이 되는 구조체성 자료에 기능을할당하는 것도 올바른 방향인건지 여쭤보고 싶습니다. 감사합니다!
-
미해결김영한의 실전 자바 - 기본편
문제 풀이의 메소드에 public이 들어가는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]메모리구조와 static의 강의 부분에서 정답을 보면 메소드 부분에 public static ~~~로 시작하는 모습을 볼수가 있는대 public을 붙이는 이유가 있을까요?? 문제 조건에는 public을 붙여야 한다는 말이나 비슷한 어구(어디서든지 사용이 가능해야하며 등)도 없고 default로도 문제에서 요구하는 기능을 구현하는데 문제가 없어서요. 순수하게 궁금한 마음에서 여쭈어봅니다.
-
해결됨스프링 핵심 원리 - 기본편
[버그 가능성] "새로운 할인 정책 개발" 강의에서 int보다 floating point나 decimal을 사용해야 하지 않나요?
[질문 내용]안녕하세요. "새로운 할인 정책 개발" 부분을 보고 있다가 이부분이 그냥 마음에 걸려서 질문을 올립니다.사진을 보면 discountPercent를 int로 쓰셨는데 만약 price가 10 미만이면 discount가 항상 0이 나와서요. 아마 튜토리얼이라서 간단히 int를 쓰지 않았을까 하지만 질문을 올립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
싱글톤 관련 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.아래 코드에서 보면 SingletonService 클래스를 정의하고 그 안에 스태틱 변수로 SingletonService 타입인 instance를 정의하고 있습니다. 클래스 안에 같은 클래스를 또 정의하는 것이 이해가 안가는데, static이라서 가능한 걸까요?public class SingletonService { private static final SingletonService instance=new SingletonService(); public static SingletonService getInstance(){ return instance; } private SingletonService(){ } public void logic(){ System.out.println("싱글톤 객체 로직 호출"); } }
-
미해결김영한의 실전 자바 - 기본편
static에 대해서 궁금합니다!!
안녕하세요. static에 대해 궁금한 것이 있어서 질문을 남깁니다!! static의 생존주기가 메모리에 생성이 되면 Java를 새로 실행이 될 때까지 유지되는 것으로 알고 있어요. 그럼 Heap 영역의 GC처럼 static을 정리해주는 역할을 하는 것이 있을까요? 아니면 개발자가 메모리 누수가 없도록 따로 관리를 해줘야 하나요? 이 부분이 궁금합니다~
-
미해결김영한의 실전 자바 - 기본편
여러 생성자가 있을 때, this()의 역할
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요! 영한님 강의 너무 잘 보고 있습니다!생성자 강의를 듣고 있다가 this()에 관한 걸 배웠을 때, 이런 질문이 떠 올랐습니다. this()는 어떤 클래스의 생성자를 사용하고 싶을 때 사용하는 것이라고 했는데, 만약 오버로딩으로 만든 생성자가 3개 이상일 때, this()는 그 생성자들 중에서 어떤 것을 가리키는 걸까? 에 대한 의문이 생겼습니다. 제가 직접 IDE에서 실험을 했을 땐, this()에 어떤 파라미터를 사용하느냐에 따라, 해당 파라미터와 같은 생성자가 사용되는 것 같은 결과가 나왔습니다.그렇다면 this()에 대해, this() 안에 파라미터와 같은 생성자가 호출된다고 생각해도 되는 걸까요?
-
해결됨김영한의 실전 자바 - 기본편
매서드 캡슐화와 테스트 코드
선생님, 안녕하세요.내부에서만 사용하는 매서드는 private으로 캡슐화 해두는 것이 좋은 구현이라고 알고 있고, 이번 수업에서도 그런 내용을 확인할 수 있었는데요, private 매서드들도 테스트 코드를 작성해서 테스트 해보고싶은 경우가 자주 발생합니다... 이런 경우 고민을 하다가 몇 가지 방법이 있겠으나 ... 그냥 public 으로 열어버리고 테스트 코드를 두곤 했는데요, 이런 경우에 선생님은 실무에서 어떻게 하셨는지, 가장 좋은 practice가 무엇인지 알고 싶습니다. 항상 감사합니다..^^
-
해결됨스프링 핵심 원리 - 기본편
의존관계 자동주입 - 조회 빈이 2개 이상일 경우에 궁금증이 있습니다.
@Autowired 필드 명, @Qualifier, @Primary 강의 부분에서 궁금한 점이 생겼습니다.결국에 조회 빈이 2개 이상인 경우엔 위의 어노테이션을 활용해서 우선순위를 지정해준다고 되어있는데,필드명을 수정해주거나, Qualifier의 이름을 변경해야하는 상황이 생긴다면( ex) OrderServiceImpl의 discountPolicy를 fixDiscountPolicy 에서 rateDiscountPolicy 로 할인 정책을 변경하고 싶다면)직접 구현체들(클라이언트 코드)을 수정해줘야하는데( ex) Autowired 된 DiscountPolicy의 변수명을 수정하거나, @Qualifier의 이름을 수정해서)이는 OCP 원칙에서 위배되는 것은 아닌지 궁금합니다. 나아가 이런식으로 실제 구현체를 수정해줘야하는 것이라면 discountPolicy 의 타입명만 DiscountPolicy일 뿐이지, 타입명 자체를 FixDiscountPolicy 로 지정하거나 RateDiscountPolicy로 지정해서 사용하는 DIP 위반하는 코드들과 무슨 차이인지 잘 모르겠습니다. 순수 자바 코드 자체는 해당 원칙들을 지키고 있는 것이니까 상관없는것인가요?
-
미해결스프링 핵심 원리 - 기본편
질문있습니다
package hello.core.beanfind; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); @Test @DisplayName("부모 타입으로 조회 시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.") void findBeanByParentTypeDuplicate(){ assertThrows(NoUniqueBeanDefinitionException.class,()->ac.getBean(DiscountPolicy.class)); } @Test @DisplayName("부모 타입으로 조회 시, 자식이 둘 이상 있으면, 빈 이름 지정하면 된다.") void findBeanByParentTypeBeanName(){ DiscountPolicy rateDiscountPolicy=ac.getBean("rateDiscountPolicy",DiscountPolicy.class); assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class); } @Test @DisplayName("특정 하위 타입으로 조회") void findBeanBySubType(){ RateDiscountPolicy bean=ac.getBean(RateDiscountPolicy.class); assertThat(bean).isInstanceOf(RateDiscountPolicy.class); } @Test @DisplayName("부모 타입으로 모두 조회하기") void findAllBeanByParentType(){ Map<String,DiscountPolicy> beansOfType=ac.getBeansOfType(DiscountPolicy.class); assertThat(beansOfType).isEqualTo(2); for (String key : beansOfType.keySet()) { System.out.println("key= "+key+"value="+beansOfType.get(key)); } } @Test @DisplayName("부모 타입으로 모두 조회하기-Object") void findAllBeanByObjectType(){ Map<String,Object> beansOfType=ac.getBeansOfType(Object.class); for(String key:beansOfType.keySet()){ System.out.println("key = "+key +"value="+beansOfType.get(key)); } } @Configuration static class TestConfig{ @Bean public DiscountPolicy rateDiscountPolicy(){ return new RateDiscountPolicy(); } @Bean public DiscountPolicy fixDiscountPolicy(){ return new FixDiscountPolicy(); } } }여기서assertThrows(NoUniqueBeanDefinitionException.class,()->ac.getBean(DiscountPolicy.class)); 이 부분이 왜 부모 타입으로 조회하는 건지 이해가 안갑니다. 상속을 한 적도 없고 그냥 타입을 넣어줬을 뿐인데 말이죠..ㅠ
-
해결됨김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
인텔리제이 초기 실행화면
안녕하세요.섹션1 - 다운로드 소스 코드 실행 방법 강의에서 인텔리제이 첫 실행화면에서 화면과 같이 프로젝트 선택하는 창이 뜨는 것으로 보입니다.(강의 내용)그러나, 인텔리제이를 처음 다운로드해서 수업과 같은 방식으로 따라했으나,, 저런 화면은 뜨지 않고 이전 작업에서 창을 닫기 전의 모습이 그대로 뜹니다.강사님처럼 프로젝트를 선택하려면 별도의 설정이 필요한 내용인가요?
-
해결됨김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
초기화 선언 관련 질문
안녕하세요!!지금 배열 문제풀이 하고 있는데요,보통 int sum = 0;이런식으로 0값으로 초기화 시켜주잖아요근데 어떤때는 double avg;이런식으로 그냥 하는데 두개의 차이가 뭐지궁금해요 코드 만들다보면 계산식이 어디있냐에 따라어떤때는double avg; 쓰고 어떤때는 0으로 초기화시켜야 돌아가더라구요..! 혹시 정확하게 구분지을 수 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
xmlAppContext 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 계속 오류가 떠서 도움을 요청드리고자 글 남깁니다...해결 부탁드립니다..