Skills 68

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

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

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

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

Java - 간단한 예외처리 테스트

이 글은 Junit5.8.1, assertj3.21 기준으로 작성되었습니다. 1. assertThrows Assertions.assertThrow는 예상가능한 Exception를 던지고, 그 Exception을 반환합니다. 이 때 예외가 발생하지 않거나 다른 유형의 예외가 발생한다면 메서드는 실패하게 됩니다. 코드로 살펴보면 import static org.junit.jupiter.api.Assertions.assertThrows; @Test void test1( { Assertions.asserThrows(RuntimeException.class, () -> { voyage.test(); }); } 람다식으로 voyage.test() 메서드를 실행하여 첫 인자인 RuntimeException과 같은지 ..

Skills/Java 2022.11.12

Java - Lambda

이 글은 프리코스 진행 중 람다식의 사용법을 정리하고 작성한 글입니다. 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어입니다. 익명 함수라고 하는 이유는 글짜 그대로 함수의 이름이 없는 함수라는 것입니다. 이 익명함수들은 일급객체(First Class Citizen)라는 특성을 지닙니다. 일급 객체는 일반적으로 다룰 객체들에 적용 가능한 연산을 모두 지원하는 개체를 말합니다. 메서드를 값으로 사용할 수도 있으며, 패러미터로 전달하거나 변수에 대입하는 연산들이 가능합니다. 1. 표현식 반환Type 메서드명 = (Parameter)->{구현코드}; Java에서 기본 람다식은 '->'를 기준으로 그 왼쪽에는 람다식을 실행하기 위한 패러미터가 그 오른쪽에는 패러미터를 이용한 구현할 ..

Skills/Java 2022.11.06

Java - Comparable & Comparator

우테코 프리코스 1주차 미션 중, 다중정렬조건을 적용하던 중 Comparator에 대한 이해가 부족하여 정리하고자 작성한 글입니다. 1. Comparable java.lang.Comparable의 인터페이스인 Comparable는 compareTo라는 메서드가 선언되어 있습니다. 이는 인터페이스이기 때문에 Comparable을 사용하려면 compareTo 메서드를 override해줘야 합니다. 하지만! Java 8부터는 인터페이스에서도 일반 메서드를 구현할 수 있도록 변경되었습니다. Comparable은 정렬 수행시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의해 놓은 인터페이스로 Java에서 제공되는 정렬이 가능한 클래스(Integer, Double, Long 등 내림차순, String 클래스의 ..

Skills/Java 2022.11.01