묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨김영한의 실전 자바 - 중급 2편
타입 매개변수 제한 강의 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.//문제 2: 개 타입 반환 //dogHospital.setAnimal(dog); Dog bigger = dogHospital.bigger(new Dog("멍멍이2", 400)); System.out.println(bigger);문제점 2번에서dogHospital.setAnimal(dog); 선언을 새로 한 이유가 있나요 ? 주석처리하고 컴파일해도 정상적으로 작동해서 여쭤봅니다.
-
해결됨김영한의 실전 자바 - 중급 1편
내부 클래스 질문입니다.
안녕하세요. 내부 클래스 관련하여 물어 볼게 있습니다. 외부 클래스 내의 내부 클래스가 있을 때 외부 클래스의 인스턴스만 생성할 때 메모리 구조가 궁금합니다. (외부 클래스만 생성하면 힙 메모리에는 외부 클래스만 생성 되는지, 내부 클래스는 클래스 정보가 있는 메소드 영역에 있는지, 내부 클래스가 생성 되어야만 힙 메모리에 생성 되는지)외부 클래스를 생성 후 참조 변수를 통해 내부 클래스를 생성하는데 내부 클래스의 인스턴스가 필요 없게 될 경우 힙 메모리에 있는 외부 클래스와 내부 클래스가 동시에 가비지 컬렉션이 삭제하는지 궁금합니다.감사합니다.
-
해결됨김영한의 실전 자바 - 중급 2편
다른 타입의 데이터 나머지 연산 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]해시 인덱스를 ([데이터 값] % [배열 크기])로 지정하는 원리라는 것을 알게 되었습니다.데이터 값이 Integer라서 나머지 연산이 가능했는데,데이터가 다른 타입이면 나머지 연산을 어떻게 하나요?
-
해결됨스프링 핵심 원리 - 기본편
섹션 5
@Test @DisplayName("싱글톤의 주의할 점") void statefulServiceSingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean("testConfig", StatefulService.class); StatefulService statefulService2 = ac.getBean("testConfig", StatefulService.class); statefulService1.order("userA", 10000); statefulService2.order("userB", 20000); assertThat(statefulService2.getPrice()).isSameAs(20000); } 오류 메시지 java.lang.AssertionError: Expecting actual: 20000 and: 20000 to refer to the same object이렇게 테스트 했더니 오류가 뜹니다!ㅠㅠㅠAssertions.assertThat().isSameAs()Assertions.assertThat().isEqualsTo()두 개의 차이점이 궁금합니다!
-
해결됨김영한의 실전 자바 - 중급 2편
클래스 작성 시 줄바꿈 질문
강의에서 클래스를 작성하실 때,public class Marine extends BioUnit { // 줄바꿈 public Marine(String name, int hp) { super(name, hp); } }다음과 같이 한 줄 띄고 작성을 하시는데 그 이유가 있나요? 어떤 특별한 컨벤션 같은게 존재하는건지 아니면 편의상 이렇게 작성하시는건지 해당 줄바꿈의 의도가 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
jdk 오류 질문드립니다
섹션3 - 스프링으로 전환하기 부분 9:47[질문 내용]세팅에서 Gradle(Default)랑 Intellij IDEA 둘 다 변경해봤는데도 오류뜹니다도와주세요 ㅎ그흑
-
미해결김영한의 실전 자바 - 중급 1편
String 질문
안녕하세요.String을 구현한 클래스 설명해주신 부분에서 이해가 안가는 게 있어서 문의드립니다.StringBuilder와의 차이점에서 StringBuilder가 가변적일 수 있는 이유로 아래 필드가 final인지(String) 아닌지(StringBuilder)로 설명해주셨는데요.final byte[] value라면 value 변수는 참조변수 일꺼고 그렇기에 참조값만 변경이 되지 않으면 참조하고 있는 객체의 내부 상태들은 변경이 가능할텐데 예를 들어String a = newString("abc");여기에서 c를 d로 바꾼다 한들 value가 참조하는 내용이 아닌 참조값도 바뀌어야 하는 이유가 궁금합니다.StringBuilder의 경우에는 final 선언이 안 되어 있으니 value 필드의 참조값이 바뀌던 안바뀌던 상관 없을텐데 String 같은 경우에는 final이긴 하지만 value가 참조하는 내용을 바꿨다고 해서 참조값이 무조건 바뀌게 되는 이유가 궁금합니다.private final byte[] value;
-
미해결김영한의 실전 자바 - 중급 1편
AuthGrade 문제2 - 인증 등급 열거형 조회
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]문제2에서 AuthGradeMain1 클래스를 만들어서 코드를 작성하는 과정에서 for문 안에서 바로 출력을 하는 코드를 작성하셨는데, EnumRefMain3_4에서public static void main(String[] args) { int price = 10000; Grade[] grades = Grade.values(); for (Grade grade : grades) { printDiscount(grade, price); } } private static void printDiscount(Grade grade, int price) { System.out.println(grade.name() + " 등급의 할인 금액 : " + grade.discount(price)); }따로 print 메서드를 뽑아서 리팩토링 하셔서 제가 스스로 AuthGradeMain1 풀이할 때에도public static void main(String[] args) { AuthGrade[] grades = AuthGrade.values(); for (AuthGrade grade : grades) { printAuthGrade(grade); } } private static void printAuthGrade(AuthGrade authGrade) { System.out.println("grade = " + authGrade + ", level = " + authGrade.getLevel() + ", 설명 = " + authGrade.getDescription()); }이런 식으로 메서드를 뽑아서 풀었습니다. 결과는 결국 똑같이 나오겠지만 메서드를 뽑아서 print하는 코드와 for문에서 직접 print하는 코드 둘 중 어느 걸 사용하는 것이 좋은 건지 어떻게 알 수 있는 걸까요?
-
해결됨스프링 핵심 원리 - 기본편
섹션 4
public class ApplicationContextSameBeanFindTest { ApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회 -> 같은 타입이 둘 이상 있으면 중복 오류 발생") void findBeanByTypeDuplicate() { MemberRepository bean = ac.getBean(MemberRepository.class); System.out.println("bean = " + bean); } @Configuration class SameBeanConfig { @Bean MemberRepository memberRepository1() { return new MemoryMemberRepository(); } @Bean MemberRepository memberRepository2() { return new MemoryMemberRepository(); } } }너....무 기본적인 질문같지만 아직 부족해서 질문드립니다!ㅠㅜ현재는 복습중입니다. 본문:이 테스트 코드를 실행하면 오류가 납니다.->UnsatisfiedDependencyExceptionApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class); 여기서 중첩 클래스로 SameBeanConfig를 만들었습니다.그런데 SameBeanConfig에 static을 붙이지 않으면 왜 오류가 뜨는지 잘 모르겠습니다....이전 강의에서 만들었던 AppConfig는 static클래스가 아닙니다.그럼에도 AnnotationConfigApplicationContext()에 설정 정보로 넘겨줘도 실행하는데 지장은 없었습니다. 한 마디로 AppConfig도 객체를 따로 생성해서 넘긴 게 아니라 AppConfig.class로 넘겼습니다.그러면 SameBeanConfig.class도 정상 작동해야하는 게 아닌가...합니다....
-
미해결비전공자를 위한 자바
super 키워드
강사님 궁금한게 있습니다main( ) 메서드 에서 클래스를 만들고 부모 클래스에 있는 인스턴스를 . 을 이용해서 가져올때 부모와 자식 클래스에 이름이 같은 변수 를 가져올 때 main() 메서드 에서는 super 키워드 를 사용할수 있나요 ?
-
해결됨김영한의 실전 자바 - 기본편
자바 메모리 관련 질문
메서드 영역은클래스 정보static 영역런타임 상수 풀이렇게 세가지로 구성되어 있는걸로 알고 있습니다.static 메서드와 그냥 메서드 둘다 클래스 정보에 저장되는게 맞지만, 둘의 차이는 참조값(인스턴스) 없이 호출 가능하느냐, 아니냐의 차이가 맞을까요?만약 아니고 static 메서드는 static 영역에 저장된다고 한다면, static 영역에 있기 때문에 static 메서드는 참조값 없이 호출 가능한것 인가요?
-
미해결김영한의 실전 자바 - 중급 1편
자바 메모리 관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]메서드 영역은클래스 정보static 영역런타임 상수 풀이렇게 세가지로 구성되어 있는걸로 알고 있습니다. static 중첩 클래스, static이 없는 내부 클래스는 메모리 구조상 어디에 저장 되나요?
-
해결됨김영한의 실전 자바 - 중급 2편
장바구니 minus 질문있습니다!
public void minus(Product product, Integer minusQuantity) { Integer quantity1 = cartMap.get(product); int newQuantity = quantity1 - minusQuantity; if (newQuantity <= 0) { cartMap.remove(product); } else { cartMap.put(product, newQuantity); } } 정말 기본적인 질문인거같은데 이해가 안돼서 질문드립니다 저 else문을 안쓰고 그냥 put하면 수량은 0이 되는데 키가 지워지지 않더라구요 근데 else문을 사용하니까 키가 사라지는데 무슨 차이일까요 ㅠㅠ remove는 이미 if문에서 실행이 돼야되는거 아닌가요
-
미해결김영한의 실전 자바 - 중급 2편
타입 이레이져 예시 관련 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]class EraserBox<T> { public boolean instanceCheck(Object param) { return param instanceof T; // 오류 } public void create() { return new T(); // 오류 } }public class MyArrayListV4<E> { private static final int DEFAULT_CAPACITY = 5; private Object[] elementData; private int size = 0; @SuppressWarnings("unchecked") public E get(int index) { return (E) elementData[index]; // 오류 X }두 예시 모두 런타임 시점에 타입을 활용하는 걸로 보이는데 처음 예시에 있는 두 메서드는 불가능하고 두번째 예시에 있는 get 메서드는 어째서 가능한지 궁금합니다.
-
미해결김영한의 실전 자바 - 중급 2편
add(int index, Object newValue)에서 루프 조건질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]```javapublic void add(Object e, int index) { if (size == elementData.length) { grow(); } for (int i = elementData.length - 1; i > index; i--) { elementData[i] = elementData[i - 1]; } elementData[index] = e; size++; }```for문 조건에서 for (int i = elementData.length - 1; i > index; i--)i의 초기값을 배열의 길이로 주는 것보다는 현재 배열에 담고 있는 요소의 수인 (size-1)변수로 주는 것이 루프문의 범위를 줄이고 정말 미세한차이겠지만 조금 더 효율적이라고 생각하는데 혹시 (size-1)변수로 반복문 초기값을 설정했을 때 문제될 점이 있을까요??
-
해결됨스프링 핵심 원리 - 기본편
섹션 10. 빈 스코프 질문
public class PrototypeTest { @Test void PrototypeBeanTest() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); System.out.println("find PrototypeBean1"); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); System.out.println("find PrototypeBean2"); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); System.out.println("prototypeBean1 = " + prototypeBean1); System.out.println("prototypeBean2 = " + prototypeBean2); assertThat(prototypeBean1).isNotSameAs(prototypeBean2); } static class PrototypeBean { @PostConstruct public void init() { System.out.println("PrototypeBean.init"); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }결과prototypeBean1 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222prototypeBean2 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222 강의에서 프로토타입 스코프를 코드로 작성하고 실행하는 도중 깜빡하고 스코프 애노테이션을 넣는 걸 깜빡했습니다.그런데 prototypeBean1 과 prototypeBean2 의 참조값이 같게 나왔습니다.@Configuration을 적지 않았는데 왜 싱글톤이 적용이 된 건지 잘 이해가 가지 않습니다...
-
미해결김영한의 실전 자바 - 중급 2편
Deque에서 Queue인지 Stack인지는 데이터를 추가 할 때 결정되는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예제를 따라하면서 호기심에deque.push(1); deque.push(2); deque.push(3); System.out.println("deque.pop() = " + deque.poll()); System.out.println("deque.pop() = " + deque.poll()); System.out.println("deque.pop() = " + deque.poll());pop을 -> poll로 바꿔봤는데 결과값이 똑같이 나오고그 반대로 offer / pop 으로 해도 마찬가지더라구요!Deque<Integer> deque = new ArrayDeque<>();혹시 이 Deque가 queue / stack 둘 다 지원하기 때문에데이터를 추가 할 때 자료구조가 결정되는게 맞는건가요?
-
해결됨스프링 핵심 원리 - 기본편
섹션 8. 빈 생명주기 콜백
@Bean에 초기화 소멸 메서드 등록할 때 질문입니다!public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); } public void setUrl(String url) { this.url = url; } //서비스 시작시 호출 public void connect() { System.out.println("connect: " + url); } public void call(String message) { System.out.println("call: " + url + " message = " + message); } //서비스 종료시 호출 public void disConnect() { System.out.println("close + " + url); } public void init() { System.out.println("NetworkClient.init"); connect(); call("초기화 연결 메시지"); } public void close() { System.out.println("NetworkClient.close"); disConnect(); }@Configuration static class LifeCycleConfig { @Bean(initMethod = "init", destroyMethod = "close") public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello-spring.dev"); return networkClient; } } 결과생성자 호출, url = null NetworkClient.init connect: http://hello-spring.dev call: http://hello-spring.dev message = 초기화 연결 메시지 13:33:10.029 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing NetworkClient.close close + http://hello-spring.dev스프링 빈에 하기위해 networkClient객체가 생성되고 의존관계 주입까지 끝난 다음에 networkClient.setUrl("http://hello-spring.dev"); 로 url을 초기화하기 전에init() 메서드가 실행되는 걸로 이해를 했는데, 그럼 init() 메서드가 connect 호출 할 때 url은 여전히 null일테니 url의 초기화가 먼저 일어나야 합니다.그런데 초기화 콜백은 스프링 빈이 객체를 생성하고 의존관계 주입이 완료된 후,초기화가 되기 전에 일어나는 거 아닌가요..이럼 앞뒤가 안 맞는데 제가 놓치고있는 부분을 알려주시면 감사하겠습니다.
-
해결됨김영한의 실전 자바 - 기본편
함수와 메서드
안녕하세요.수업 정말 잘 듣고 있습니다.입문 편이랑 기본 편 복습 중에 질문 하나 드립니다.인터넷에서 검색해 보니static이 붙은 정적 메서드, 클래스 메서드를 함수라고 부르기도 하고static이 붙지 않은 인스턴스 메서드를 메서드라고라고 부르기도 한다는데요.위와 같이 구분해서 부르는 건 맞는 건가요?
-
미해결김영한의 실전 자바 - 기본편
메서드 영역의 메서드 질문
안녕하세요.메서드 관련 질문입니다.메서드는 공통된 기능이기 때문에 인스턴스 변수처럼 내부에 가지고 있지는 않고 메서드 영역에 있는 걸 필요할 때(호출할 때) 가져와서 쓴다.이것과 관련하여 질문 3가지 문의 드립니다.1. 각각의 객체에는 필드값만 가지고 있고 메서드는 아예 가지고 있지 않은거죠 ?2. 컴파일이 될 때 메서드 영역 > 클래스 영역 이 부분에 클래스의 관련 코드들이 다 들어가 있는 걸로 이해했는데 그러면 다음의 두 경우는 어떻게 이해하면 될까요 ? (두 경우 다 추상 클래스, 인터페이스에는 메서드의 바디가 작성되어 있지 않고 나중에 작성되는 경우) -> 메서드 영역의 클래스 영역에 처음에는 바디가 없으니 관련 정보가 전혀 없을 거 같은데 이와 같이 나중에 오버라이딩을 해주었을 때 메서드 영역의 클래스 영역에서 어떻게 되는지 궁금합니다. 새로운 클래스 영역에 메서드로 정의되는 부분이 아니라 기존에 클래스 영역에서 정의가 되어야 하는데 문제는 클래스 영역의 기존 메서드를 수정하자니 다음의 두 케이스는 해당 객체를 생성할 때에만 적용되는 일회성 코드라 ...2.1 AbstractAnimal은 추상클래스로 sound()가 추상 메서드입니다.AbstractAnimal animal = new AbstractAnimal() { @Override public void sound() { System.out.println("test"); } };2.2 InterfaceAnimal interface 입니다.InterfaceAnimal interfaceAnimal = new InterfaceAnimal() { @Override public void sound() { System.out.println("test"); } @Override public void move() { System.out.println("test"); } };