전체 글 143

Java - String pool과 불변

Java에서 String은 불변(Immutable) 객체입니다. 이 불변 객체는 객체가 생성된 후 내부의 상태가 변하지 않고 계속 유지되는 객체로, 변수에 객체가 한 번 할당되면 해당 객체의 참조를 변경할 수도, 내부의 상태를 수정할 수도 없는 것입니다. 이를 immutable, '불변성'이라고 하는데, String을 불변 객체로 만든 이유에 대해 알아보겠습니다. 1. String Pool Java에서는 String Pool이라는 공간에 String을 포함시켜 매번 String 객체를 새로 생성하기보다 값이 같은 String이라면 String Pool에 있는 객체를 재사용할 수 있도록 구현했습니다. 이는 값이 같은 String은 String Pool 내에서 String 객체를 공유하도록 한 것이다. 이 ..

Skills/Java 2022.12.12

Java - 불필요한 객체 생성을 피하라

인스턴스를 사용할 때, 똑같은 기능의 객체를 매번 생성하는것 보다 객체 하나를 재사용하는 편이 나을 때가 많은데, 예시를 통해 안좋은 예를 살펴보겠습니다. 1. 예시 public class ex1 { public static void main(String[] args) { String s = new String("ROME"); String n = new String("ROME"); } } new String(String) 으로 생성 시, 매번 새로운 주소를 할당한 인스턴스를 생성하지만 두 객체는 기능적으로 완전히 똑같습니다. 이 때, 같은 문자열을 가진 String 인스턴스를 생성한다면, public class ex2 { public static void main(String[] args) { // s1..

Skills/Java 2022.12.10

Java - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

코드를 짜다보면 많은 클래스들이 하나의 리소스에 의존합니다. 아래의 예시를 통해 살펴보겠습니다. 1. 예시 1.1 정적 유틸리티 public class SpellChecker{ private static final Lexicon dictionary = ...; private SpellChecker(){} public static boolean isValid(String word){...} public List suggestions(String type){...} } 1.2 싱글톤 public class SpellChecker{ private final Lexicon dictionary = ...; private SpellChecker(...){} public static SpellChecker INSTA..

Skills/Java 2022.12.05

Java - Stream 결과 생성

이전 Stream 사용법 포스트에서 내용을 보충하고자 작성한 글입니다. 이전 포스트 끝자락에서도 설명했지만 Filter나 Map 같은 데이터 수정(가공) 즉, 중간 작업만으로는 의미있는 Stream 객체를 만들 수 없기 때문에, 이 가공한 값을 출력하거나 컬렉션으로 모으는 등 마무리 작업이 필요합니다. 이 마무리 작업에 대해 설명해보겠습니다. 1. 결과 생성 1.1 집계(Aggregate) int sum = IntStream.range(1, 10).sum(); int count = IntStream.range(1, 10).count(); int max = IntStream.range(1, 10).max(); int min = IntStream.range(1, 10).min(); int avg = IntS..

Skills/Java 2022.11.30

독서 - 다정한 것이 살아남는다

'다정한 것이 살아남는다.' 책 제목만 본다면 인생에서 다정하게 행동하면 살아남기 편하다는 자기개발서같지만, 책을 까고 보면 과학적 실험과 이성적인 근거에 기반을 둔 유전생물학책입니다. 신체적으로 더 좋은 스펙을 가진 네안데르탈인보다 호모 사피엔스가 끝까지 생존한 이유나 같은 조상에서 갈려져나온 개와 늑대 중 개는 어떻게 개체 수를 늘려나갔고, 어째서 늑대는 멸종위기종인지 이를 근거를 들며 설명합니다. 이러한 생물학에 관련된 이슈를 이야기하면 빼놓을 수 없는 인물이 있죠. 바로 '찰스 다윈'. 다윈에 의해 처음으로 제시된 '자연선택' 즉 주어진 환경에서 생존과 번식에 유리한 성질을 가진 종들이 그 성질을 후대로 전달하여 널리 퍼지게된다는 원리에서 '강한 것'에 목적을 둔 것이 아니라 '다정함'에 그 목적..

독서 2022.11.27

Java - Stream 사용법 및 예제

1. Stream Stream은 Java 8부터 추가된 Collections의 저장 요소를 참조하여 처리할 수 있는 반복자를 말합니다. API 설명을 직역하면 Colletion의 map-reduce(?) 변환과 같이 함수 스타일(람다식을 의미하겠죠?) 작업을 지원하는 클래스라고 적혀있습니다. 한 줄로 설명하면 Collection에 저장되어 있는 element들을 순회하면서 처리할 수 있는 코드패턴이라고 보면 되겠네요. 코드로 한번 살펴보겠습니다. 2. 사용법 2.1 Stream 객체 생성 List list = Arrays.asList("a","b","c"); Stream stream = list.stream(); Stream을 사용하려면 Stream 객체를 생성해야합니다. Collection 객체들은 s..

Skills/Java 2022.11.25

우아한테크코스 - 프리코스 4주차 회고

프리코스 대망의 4주차 미션은 다리 건너기 게임입니다. https://github.com/Voyager003/java-bridge/tree/Voyager003 GitHub - Voyager003/java-bridge Contribute to Voyager003/java-bridge development by creating an account on GitHub. github.com 1. 시작하며 3주차 미션인 로또를 끝내고, 다른 지원자들이 올린 코드를 살펴봤는데 적잖이 충격을 받았습니다. 제가 작성한 코드는 진짜 동작만을 하도록 설계했다고 느껴졌다면, 올려진 코드들을 보면 객체를 객체답게 다루는 설계임을 확실히 느낄 수 있었습니다. 여기에 자극받아 4주차 미션에서는 어떤 코드가 좋은 코드인지 깊이 고민..

Java - FIrst Class Collection(일급 컬렉션)

1. First Class Collection Java에서 일급 컬렉션은 Collection을 Wrapping하고 있으면서, 그 외에 다른 멤버 변수가 없는 것을 의미합니다. 코드로 살펴보면 public class FirstClassCollection() { private List FCC; public FirstClassCollection(List FCC) { this.FCC = FCC; } } 위와 같이 List(Colletion)인 FCC 멤버 변수를 Wrapping하고, 그 외의 변수는 선언하지 않은 상태를 말합니다. 이렇게 일급 컬렉션으로 얻는 이점이 무엇일까요? 2. 장점 2.1 하나의 인스턴스 에서 관리하는 비즈니스 로직 프리코스 2주차 미션인 Lotto 게임의 한 클래스입니다. LottoGe..

Skills/Java 2022.11.17

우아한테크코스 - 프리코스 3주차 회고

프리코스 3주차의 미션은 로또 입니다. 구현코드 GitHub - Voyager003/java-lotto: 로또 미션을 진행하는 저장소 로또 미션을 진행하는 저장소. Contribute to Voyager003/java-lotto development by creating an account on GitHub. github.com 1. 프로그램 설계 기능 구현은 크게 4가지로 구분하였고, 로또 구입과 번호 생성, 당첨 번호 입력과 통계 출력으로 구분했습니다. exception 클래스와 상수를 나타내는 enum 같은 경우 포스트에서 따로 설명하지는 않겠습니다. 2. 로또 구입 2.1 LottoPurchase 먼저 구현목록 순서에 따라 로또를 구입하는 기능부터 구현했습니다. Console.readLine()으..

Java - NumberFormatException 에러

3주차 프리코스 중 테스트 코드 실행에서 막힌 에러인데 원인과 해결방법을 정리했습니다. 1. NumberFormatException 원인 공식 문서를 살펴보면 java.lang.NumberFormatException은 문자열을 숫자 유형 중 하나로 변환할 때 발생하며, 문자열에 적절한 형식이 없다는 것을 나타내기 위한 에러입니다. 또한 입력된 수가 자료형의 범위를 벗어나 해당 자료형으로 표현할 수 없는 경우 발생합니다. private int inputAmount() { String input = Console.readLine(); return Integer.parseInt(input); } 에러가 발생한 메서드입니다. Console.readLIne();은 Scanner와 같이 입력을 받는 메서드입니다. ..

Skills/Java 2022.11.14