묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
자바 입문 강의: ScannerWhileEx3 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요, 자바 입문 강의를 수강하고 있는 병아리 입문자입니다. 일단 지나치게 기초적인 질문이라면 죄송합니다. 다만 강의와 수업 자료에 설명이 생략되어 있어 질문 드립니다. 자바 입문 강의의 ScannerWhileEx3 문제에서(7. 훈련 파트) int input에 scanner.nextint() 기능으로 사용자 입력을 받는다는 것은 이해했습니다. 그런데 어차피 매개변수 input에 사용자 값을 입력 받을 텐데 굳이 int input = 0;으로 초기화하는 이유는 무엇인가요? 강의를 듣기 전에 제가 input를 선언하기만 하고 바로 사용자 값 입력을 받았을 때는 무탈히 프로그램이 작동된 것 같아 더 의문이 듭니다. 답변 기다리겠습니다. 강의 잘 듣고 있습니다. 감사합니다!
-
해결됨진짜! 자바스크립트(Javascript) - 기초부터 고급까지
nvm 설치 오류입니다.
아래와 같이 에러가 납니다.
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
조합 관계에 대해 질문있습니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요.이번 강의에서 상속 구조를 조합으로 풀어내면 유연해진다고 하셨는데Cell의 공통 부분을 뽑아내서 CellState로 만들어서 EmptyCell, LandMineCell, NumberCell에서 사용하게 되는데 이러면 결국 CellState와 결합도가 높아지는 것 아닌가요??EmptyCell, LandMineCell, NumberCell과 CellState사이에 인터페이스를 만들지 않는 이상 Cell을 부모로 사용할 때와 큰 차이가 없는 것 같은데 ( 결국 CellState에서 변경이 일어나면 CellState를 사용하는 곳에서도 변경을 해줘야 하니까 부모인 Cell에서 변경이 일어나면 자식도 변경을 해줘야 한다는 것과 동일하다고 생각했습니다 )잘못 생각하고 있는 부분일까요..?
-
해결됨진짜! 자바스크립트(Javascript) - 기초부터 고급까지
console 이 안보입니다.
console 및 미리보기 hello world가 안보입니다.
-
미해결김영한의 실전 자바 - 중급 1편
중첩클래스 static
안녕하세요 . 중첩클래스 관련하여 NetworkMessage를 static으로 중첩클래스로 만들면 외부클래스와 논리적으로 엮인다는것은 이해했습니다. 다만 static영역으로 관리할시 NetworkMessage 안 인스턴스의 값이 공통으로 관리되는 것아닌가여? 즉 content의 값은 매요청마다 동일한 값을 공유하게 되는것 아닌가여??
-
미해결스프링 핵심 원리 - 기본편
3개 이상 다중 디비 연결
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]실무에서 데이터베이스가 3개 이상이고 로직 비율이 비슷할 때는 Primary와 Qualifier를 사용하나요?모두 Qualifier를 붙여주기는 귀찮아서 패키지 구조로 각 데이터 베이스를 호출하도록 나눠놨는데 더 좋은 방법이 있을까요?
-
미해결스프링 핵심 원리 - 기본편
AllBeanTest에서 @Autowired 유무
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]AllBeanTest 코드에서 DiscountService 생성자 위에 @Autowired를 쓰지 않아도 테스트가 정상적으로 실행되는데요,ApplicationContext 스프링 컨테이너가 생성되면서 DiscountService가 스프링 빈으로 등록되고, 이에 따라 스프링 빈의 경우 생성자가 하나이면, @Autowired를 명시하지 않아도 자동으로 주입되어 오류 없이 실행된 건가요?그렇다면 @Autowired를 명시하지 않아도 되는건가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
동기화
동기화 강의 중Room room = new Room(); Runnable cleaner1 = new Runnable() { @Override public void run() { System.out.println("-- 직원1 청소 시작 --"); for (int i = 1; i <= 5; i++) { room.clean("직원1"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } if (i == 2) { throw new RuntimeException("못해먹겠다!!"); } } System.out.println("-- 직원1 청소 끝 --"); } }; Runnable cleaner2 = () -> { System.out.println("-- 직원2 청소 시작 --"); for (int i = 1; i <= 5; i++) { room.clean("직원2"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } System.out.println("-- 직원2 청소 끝 --"); }; Thread cleanerThread1 = new Thread(cleaner1); Thread cleanerThread2 = new Thread(cleaner2); cleanerThread1.start(); cleanerThread2.start();수업에 사용한 위 코드가 10번방까지 출력이 되는 것은, for 반복문으로 1~5 까지 5개씩의 반복을 두 개 만들었기 때문에 자연적으로 10번까지 출력할 수 있는건가요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
Casting3 클래스에서 형변환 값이 수업과 다르게 나옵니다
[질문 내용]강사님이 말씀하신 것 처럼 오버플로우가 발생하지 않고 값이 그대로 출력됩니다 ㅠ*코드 입니다*컴파일 결과입니다
-
미해결김영한의 실전 자바 - 중급 2편
트리 구조의 구현에서의 노드 객체 필드
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]"트리 구조의 구현" 부분에서 Node0의 왼쪽 노드는 자신의 왼쪽 자손 노드, 오른쪽 노드는 자신의 오른쪽 자손 노드라고 할 때 Node 객체의 필드를 구성하는 prev, item, next에서 prev는 left, next는 right로 생각하면 될까요? 해당 교재 내용에서 Node 객체 필드가 prev, item, next라고 되어있어 질문드립니다.
-
미해결김영한의 실전 자바 - 중급 1편
enum 마지막 문제 질문
[질문 내용]여기에 질문 내용을 남겨주세요.enum의 마지막 문제 정답인데, 어떻게 values()를 아무런 호출변수없이 바로 호출이 가능하나요?
-
미해결김영한의 실전 자바 - 기본편
확장 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강사님 Closed for modification: 기존의 코드는 수정되지 않아야 한다. 이 부분에서 클라이언트는 수정되면 안되는 것으로 이해를 했는데 만약 Car에서 옵션기능이 추가 됐으면 Driver도 사용 할 수 있게 추가 되어야 될텐데 OCP 원칙을 어기는 걸까요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
실행 시켰을 때 화면이 좀 다르게 나와서 고치고 싶습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.실행 했을 때 강사님과의 실행 결과 화면이 다르게 나오는데 혹시 세팅하는 방법을 좀 알 수 있을까요?
-
미해결스프링 핵심 원리 - 기본편
컴포넌트스캔 오류
@Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(this.memberRepository()); } @Bean public OrderService orderService() { return new OrderSerivceImpl(this.discountPolicy(), this.memberRepository()); } @Bean public MemberReposotory memberRepository() { return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new FixDiscountPolicy(); // 또는 RateDiscountPolicy()로 변경 가능 } } @Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { }수동등록빈,자동등록빈으로 제일 상위패키지에 구현해두웠고 @Component @Getter public class MemberServiceImpl implements MemberService { // private final MemberReposotory memberReposotory = new MemoryMemberRepository(); private final MemberReposotory memberReposotory; public MemberServiceImpl(MemberReposotory memberReposotory) { this.memberReposotory = memberReposotory; } @Override public void join(Member member) { memberReposotory.save(member); } @Override public Member findMemer(Long memerId) { return memberReposotory.findById(memerId); } }여기서 오류가나는데 Could not autowire. There is more than one bean of 'MemberReposotory' type.Beans:memberRepository (AppConfig. java) memoryMemberRepository (MemoryMemberRepository. java) 이렇게 오루가납니다;;강의에서는 오류가안나던데 저는 왜 오류가날까요
-
미해결김영한의 실전 자바 - 중급 2편
자바 중급 마지막 문제 코드리뷰 및 아이콘 출력 부탁드려요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.코드리뷰 및 아이콘 출력 부탁드려요안녕하세요. 자바 중급 마지막 문제를 풀어보았는데, 코드가 난잡한거 같습니다.혹시 코드 리뷰나 틀린점을 짚어주시면 감사하겠습니다.또한 아이콘 출력은 어려워서 이름으로 출력하게 했는데 아이콘 출력 나온는 법도 알려주시면 감사하겠습니다.참고로 Suit 클래스는 영한님의 클래스를 재사용 하였습니다.마지막으로 List가 비교적 사용이 쉬워서 List를 통한 풀이를 진행했는데,HashMap이나 다른 컬렉션을 이용한 풀이도 있을까요? package class2_8Iterator.MyArray.cardGame; /** * 카드에 대한 속성을 정의하는 클래스 * 1. 문양을 가진다 * 2. 번호를 가진다 * 3. 소팅이 가능하다 */ import static class2_8Iterator.MyArray.cardGame.Suit.*; public class Card implements Comparable<Card>{ private final Suit suit; private Integer cardNumber; public Card(Suit cardIcon, Integer cardNumber ){ this.cardNumber = cardNumber; this.suit = cardIcon; } /**문양을 비교하기 위해 숫자로 변환한다. * */ public Integer iconConverter(String cardIcon) { if(SPADE.getIcon().equals(cardIcon)) { return 1; } else if(HEART.getIcon().equals(cardIcon)){ return 2; } else if(DIAMOND.getIcon().equals(cardIcon)) { return 3; } else if (CLUB.getIcon().equals(cardIcon)) { return 4; } return 0; } public Suit getSuit() { return suit; } /* @Override public String toString() { return "Card{" + "icon=" + icon + ", cardNumber=" + cardNumber + '}'; } */ @Override public String toString(){ return cardNumber+"("+suit+")"; } /** * 문양을 비교하고 같은 문양이면 숫자가 더 큰게 먼저 앞으로 나온다. * */ @Override public int compareTo(Card card) { Integer thisIcon = iconConverter(this.suit.getIcon()); Integer inputIcon = iconConverter(card.suit.getIcon()); if(this.cardNumber==cardNumber){ return thisIcon<inputIcon ? -1 : (thisIcon==inputIcon ? 0 : 1); } else return this.cardNumber<cardNumber ? -1 : (this.cardNumber==cardNumber ? 0 : 1); } public int numberCompareTo(Card card){ return this.cardNumber<card.cardNumber ? -1 : (this.cardNumber==card.cardNumber ? 0: 1); } public Suit getIcon() { return suit; } public Integer getCardNumber() { return cardNumber; } public void setCardNumber(Integer cardNumber) { this.cardNumber = cardNumber; } }package class2_8Iterator.MyArray.cardGame; public enum Suit { SPADE("♠"), // 스페이드(♠) HEART("♥"),// 하트(♥) DIAMOND("♦"),// 다이아몬드(♦) CLUB("♣");// 클로버(♣) private String icon; Suit(String icon){ this.icon=icon; } public String getIcon() { return icon; } }package class2_8Iterator.MyArray.cardGame; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import static class2_8Iterator.MyArray.cardGame.Suit.*; /** * 카드를 이용하여 덱을 구성한다. * */ public class Deck { private Card card; private List<Card> masterDeck; private List<Card> spadeDeck = new ArrayList<Card>(); private List<Card> heartDeck = new ArrayList<Card>(); private List<Card> diamondDeck = new ArrayList<Card>(); private List<Card> clubDeck = new ArrayList<Card>(); /*** * */ public Deck(){ for(int i =1 ;i <= 13; i++){ card = new Card(SPADE,i); spadeDeck.add(card); } for(int i =1 ;i <= 13; i++){ card= new Card(HEART,i); heartDeck.add(card); } for(int i =1 ;i <= 13; i++){ card = new Card(CLUB,i); clubDeck.add(card); } for(int i =1 ;i <= 13; i++){ card =new Card(DIAMOND,i); diamondDeck.add(card); } /**배열 합치기 * */ List<Card> mergedDeck1 = Stream.of(clubDeck, diamondDeck) .flatMap(Collection::stream) .collect(Collectors.toList()); List<Card> mergedDeck2 = Stream.of(spadeDeck,heartDeck) .flatMap(Collection::stream) .collect(Collectors.toList()); masterDeck = Stream.of(mergedDeck1, mergedDeck2) .flatMap(Collection::stream) .collect(Collectors.toList()); Collections.shuffle(masterDeck); /*** * 덱 생성 확인을 위한 디버깅 */ // for(Card cardEntry :deck){ // // System.out.println(cardEntry.getCardNumber() + "," + cardEntry.getIcon()); // // } // System.out.println("size ie "+ deck.size()); // System.out.println( masterDeck.getClass()); } public List<Card>getMaterDeck(){ return masterDeck; } }package class2_8Iterator.MyArray.cardGame; import java.util.ArrayList; import java.util.List; /** * DECK에서 카드를 뽑아 패에 넣는다. * */ public class Player { List<Card> hands = new ArrayList<>(); Deck deck = new Deck(); // new 연산자 (메모리에 올리기) 안쓰면 nullPointerException 터진다 Integer [] cardNumberList = new Integer[5]; Integer totalNumber = 0; public void drawCard(int turn){ List<Card> playableDeck = deck.getMaterDeck(); Card inputCard = playableDeck.get(turn); hands.add(inputCard); playableDeck.remove(turn); } public Integer getSumOfCardNumber(){ for(int i = 0 ; i <5;i++){ Card handCard = hands.get(i); cardNumberList[i] = handCard.getCardNumber(); totalNumber = totalNumber+cardNumberList[i]; } return totalNumber; } } package class2_8Iterator.MyArray.cardGame; import java.lang.reflect.MalformedParameterizedTypeException; import java.util.*; public class CardGameMain { public static void main(String args[]) { Player player1 = new Player(); Player player2 = new Player(); Deck deck = new Deck(); // List<Card> playerList1 = new ArrayList<>(); // List<Card> playerList2 = new ArrayList<>(); for (int i = 0; i < 10; i++) { if(i%2!=0){ player2.drawCard(i); } else player1.drawCard(i); } //Player 클래스의 hands에 값을 넣었으나 다른 값을 참조하니까 자꾸 OUTOFINDEX 에러 나옴 //다음 코드는 hands내 값을 디버깅 할때 사용 한다 System.out.println("player1의 카드 리스트 "+Arrays.toString(player1.hands.toArray())); System.out.println("player2의 카드 리스트 "+Arrays.toString(player2.hands.toArray())); /*** TODO * 1.손패 카드를 소팅하고 * 2. 카드 번호의 계를 구한다. */ Arrays.sort(player1.hands.toArray()); Arrays.sort(player2.hands.toArray()); System.out.println("==================정렬후 카드 패=================="); System.out.println("player1의 카드 리스트 "+Arrays.toString(player1.hands.toArray())); System.out.println("player2의 카드 리스트 "+Arrays.toString(player2.hands.toArray())); System.out.println("================== 카드 패 숫자 합계 ============="); System.out.println(player1.getSumOfCardNumber()); System.out.println(player2.getSumOfCardNumber()); if(player1.getSumOfCardNumber()> player2.getSumOfCardNumber()){ System.out.println("플레이어 1이 이겼습니다"); }else { System.out.println("플레이어 2가 이겼습니다"); } } }
-
미해결스프링 핵심 원리 - 기본편
7장 질문입니다
public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member(1L, "userA", Grade.VIP); int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy"); assertThat(discountService).isInstanceOf(DiscountService.class); assertThat(discountPrice).isEqualTo(1000); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); System.out.println("discountCode = " + discountCode); System.out.println("discountPolicy = " + discountPolicy); return discountPolicy.discount(member, price); } } }7장 조회한 빈이 모두 필요할때 테스트 코드인데요 ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);여기서 스프링컨테이너에 등록하는건데 DiscountService는 @Configuration이나 @Component가 안붙었느데 어떻게 스프링빈으로 등록이되는거죠?
-
미해결김영한의 실전 자바 - 중급 1편
dayIterator를 따로 두신건 반복문에서의 가독성을 위해서일까요?
firstDayOfMonth를 그대로 사용하시지 않고 dayIterator 변수를 따로 두신건 가독성을 위함일까요?
-
미해결김영한의 실전 자바 - 기본편
다형성 참조 질문입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 이 부분에서 Animal이 에서 시작한다고 하셨는데 동적 바인딩은 런타임 시 실제 인스턴스를 기준으로 동작하는 것으로 알고 있습니다. 여기서 '시작'이라는 것이 컴파일 단계를 말씀하시는 건가요? 이 부분이 헷갈려서 질문드립니다 :)
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
유즈케이스 프로토콜과 구현체의 분리 이유
덤벨로퍼님 안녕하세요! 덕분에 좋은 강의 잘 듣고 있습니다!!유즈케이스의 경우 프로토콜과 구현체를 분리해서 구현하셨고, 보통 다른 사람들도 분리해서 구현하더라구요.만약 기능 단위로 유즈케이스를 구현하게 된다면 굳이 프로토콜과 구현체를 분리안해도 될 것 같은데, 둘을 분리하여 얻을 수 있는 이점이 궁금합니다!의존성 관리 측면에서 이점이 있다고 생각은 되는데 잘 와닿지가 않아서요ㅠㅠ답변해주시면 감사하겠습니다 :)
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
파일용량의 기준에 대한 질문!
readAllBytes()를 사용할때 가장 빠르지만, 결과적으로 메모리를 한번에 많이 사용하기 때문에 파일의 크기가 작아야 한다.라고 알려주셨습니다. 개인적으로 알아보면서 "단순히 파일의 크기만이 아니라, JVM의 메모리 관리 특성과 실제 운영환경의 종합적으로 고려해야함" 으로 이해하게 되었는데요.(해당 부분에 대한 서칭이 잘못 되었다면 바로 잡아주세요.) 저에게는 이 말 조차도 두루뭉술하게 느껴져서 "작다/크다"에 대한 기준을 가늠하기에 어려움이 있는것 같습니다. 정확한 기준이 필요하기보단 어느정도 가늠을 할 수 있는 방법이 필요한것 같습니다. 파일 용량 기준에 대한 간단한 계산 방법이 있을까요?