무지를 아는 것이 곧 앎의 시작

Java 19

멤버 클래스는 되도록 static으로

이펙티브 자바의 아이템24. '멤버 클래스는 되도록 static으로 만들라' 부분을 읽고 정리하는 포스팅.✍️ 중첩 클래스 다른 클래스 안에 정의된 클래스. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외에 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다. 중첩 클래스 종류 정적 멤버 클래스 멤버 클래스 익명 클래스 지역 클래스 정적 멤버 클래스를 제외하고는 모두 비정적이며 내부 클래스(inner class)라고 부른다. 정적 멤버 클래스와 비정적 멤버 클래스 일반 내부 클래스는 바깥 클래스의 private 멤버에 접근할 수 있지만, 정적 클래스는 바깥 클래스와 관계가 없어야 함으로 private 멤버에 접근할 수 없다. 정적 멤버 클래스 public class Membe..

Java 2022.03.30

Stream.forEach() vs for-each

이펙티브 자바의 아이템46. '스트림에서는 부작용 없는 함수를 사용하라' 부분을 읽고 정리하는 포스팅.✍️ 아이템46. 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임의 핵심: 계산을 일련의 변환(transformation)으로 재구성 하는 부분. 이때 각 변환 단계는 이전 단계의 결과를 받아 처리하는 순수 함수인 것이 좋다. 순수 함수: 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 스트림 연산에 쓰이는 함수를 순수 함수로 만드려면? 중간 단계든 종단 단계든 스트림 연산에 건네는 함수 객체가 side effect가 없어야 한다. ex) 스트림 패러다임을 이해하지 못하고 사용한 코드 예시 Map freq = new HashMap(); try (Str..

Java 2022.03.14

표준 함수형 인터페이스

이펙티브 자바의 아이템44. '표준 함수형 인터페이스를 사용하라' 부분을 읽고 정리하는 포스팅.✍️ 아이템44 표준 함수형 인터페이스 정리 함수형 인터페이스란? 오직 하나의 추상 메소드만 저장하는 인터페이스. 필드 메소드를 파라미터화 할 수 있음. 많은 디폴트 메소드가 있더라도 추상 메소드가 오직 하나면 함수형 인터페이스다. @FunctionalInterface를 붙이지 않아도 추상 메서드가 한개면 함수형 인터페이스이다. ex) @FunctionalInterface public interface Predicate { boolean test(T t); // ... } 표준 함수형 인터페이스를 사용하라. 꼭 필요한게 아니라면, 굳이 함수형 인터페이스를 정의하지 말자. 필요한 용도에 맞는 게 있..

Java 2022.03.08

Collections.unmodifiableXX()는 방어적 복사가 아니다

바로 전에 작성했던 깊은 복사와 방어적 복사에 대한 포스팅에 이어서... 제가 복사에 대한 내용을 다루는 이유는 사실 제가 딱 하루 전까지만 해도 Collections.unmodifiableXX()이 방어적 복사라고 잘못 알고 있었기 때문이죠... 깊은 복사와 방어적 복사라는 개념을 잘 모르시겠다면 아래 포스팅을 보고 오시면 됩니다! 2022.03.05 - [개발 이야기/Java] - Collection의 깊은 복사와 방어적 복사 Collection의 깊은 복사와 방어적 복사 우아한테크코스 두번 째 미션을 진행하던 중... 제 미션의 리뷰를 맡아주신 리뷰어분이 깊은 복사와 방어적 복사에 대해 고민하고 적용시켜보라는 말을 해주셔서 포스팅을 해보려 합니다😄 깊 alexander96.tistory.com Co..

Java 2022.03.06

Collection의 깊은 복사와 방어적 복사

우아한테크코스 두번 째 미션을 진행하던 중... 제 미션의 리뷰를 맡아주신 리뷰어분이 깊은 복사와 방어적 복사에 대해 고민하고 적용시켜보라는 말을 해주셔서 포스팅을 해보려 합니다😄 깊은 복사 깊은 복사는 객체를 담는 컬렉션 몸통과 그 안의 객체 모두 새로운 주소를 가진 것으로 새로 만들어내는 것을 말합니다. 간단히 말하면 원본과의 관계를 완전히 끊어내는 복사라고 볼 수 있습니다. 그림으로 예시를 들면,, 위 그림처럼 새로운 컬렉션을 만들고, 그 안의 객체도 값이 같은 새로운 객체로 만들어서 복사한 객체를 담아서 원본과 전혀 관계가 없는 컬렉션을 만드는 것을 말합니다. 코드를 작성하면 이렇게 되겠네요 class Car { private String name; public Car(String name) { ..

Java 2022.03.05

추상 클래스와 인터페이스의 용도 차이

이펙티브 자바의 아이템20. '추상 클래스보다는 인터페이스를 우선하라' 부분을 읽고 정리하는 포스팅.✍️ 클래스에 특정 역할을 부여하는 데에는 인터페이스가 우선이다. 자바 8부터 인터페이스도 default 메서드를 지원하여 인스턴스 구현 메서드를 구현 형태로 제공할 수 있다. 그리고 추상 클래스는 정의한 타입을 구현하는 클래스가 반드시 추상 클래스의 하위 클래스가 되어야한다는 제약 조건이 따른다. 반면에, 인터페이스는 구현한 모든 클래스를 어떤 클래스를 상속했든 같은 타입으로 취급한다.그래서 인터페이스는 기존 클래스에도 새로운 인터페이스를 구현하도록 하는데 제약이 없다. 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다. 믹스인이란, 클래스가 구현할 수 있는 타입으로, '주된 타입'외에 특정 선택적 행..

Java 2022.03.03

생성자에 매개변수가 많아도 안무섭게 해주는 Builder!

이펙티브 자바의 아이템2. '생성자에 매개변수가 많다면 빌더를 고려하라' 부분을 읽고 정리하는 포스팅.✍️ 만약 필드의 갯수가 많고, 그 필드를 모두 생성자를 통해 받아야 하는 상황이라면?🤔 점층적 생성자 패턴 필수 매개변수만 받는 생성자, 필수 매개변수 + 선택 매개변수 1개 받는 생성자, 필수 매개변수 + 선택 매개변수 2개 받는 생성자 ... 이렇게 생성자를 늘려가는 패턴. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private fina..

Java 2022.02.28

IntelliJ(인텔리제이) 커스텀 자동완성 템플릿 만들기 - Live Template

자바 언어 쓰시는 분들 IDE 인텔리제이로 많이들 쓰시죠 최근 인프런에서 김영한님 JPA 강의 보고 있는데 인텔리제이의 Live Template으로 커스텀 자동완성 템플릿을 만들 수 있다고 하더라구요. (그래놓고 만드는 법은 안가르쳐주셨다..🤣) 궁금해서 바로 만들어봤습니다. 개발하다 보면 특정 패턴을 반복해서 코딩해야할 때가 있습니다. 자바 언어같은 경우 코드가 대체로 길게 나오기 때문에 이런 상황에 귀찮음이 많이 발생하구요, 인텔리제이에서 자바언어를 쓰신다면 기본적으로 psvm, sout 등 자동완성 템플릿을 지원하고 있습니다. 그런 템플릿들을 자동완성 명령어로 지정해두고 쓰면 너무 편하겠죠 그럼 만드는 법 알아봅시다. 일단 상단 메뉴에서 File > Settings 눌러서 키구요. (mac은 Pre..

Java 2022.02.18

Java String.split() 빈 문자열도 포함하는 방법

안녕하세여 알렉습니다! 우테코 자동차 경주 미션을 진행하는데 다음같은 요구사항이 있었어요 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. 예시) pobi,crong,honux 이런식으로 입력이 들어옵니다. 이걸 나눠서 각각 자동차 객체를 생성해줘야하는데, 당연히 문자열을 나누는 String.split() API를 사용하고 delimiter로 ","를 지정하면 되겠구나 생각했죠. 물론 잘린 문자열은 각각 검증 과정을 거치도록 구현을 했습니다. 그런데... 빈 문자열이 들어오면 에러메시지를 출력하면서 재입력을 받아야하는데요... ",,"이렇게 문자열이 들어오면 그냥 넘어가버리는게 아니겠어요?🤔 아 보니까 String.split() 메서드는 기본적으로 빈 문자열은 반환 요소에 포함시..

Java 2022.02.15