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

전체 글 41

타입 안전 이종 컨테이너

아이템33 타입 안전 이종 컨테이너 타입 안전 이종 컨테이너란?🧐 컨테이너 Set, Map, List 등 여러 요소를 담는 컬렉션들과 ThreadLocal, AtomicReference등 단일원소를 담는 클래스들. 타입 안전 이종 컨테이너 여러 타입을 안전하게 담을 수 있는 컨테이너 List는 오직 Integer 타입만 담을 수 있음. 그럼 여러 타입을 담게 하려면 어떻게 해야할까? Object에 저장하기 public class ObjectContainer { public static void main(String[] args) { List container = new ArrayList(); container.add("1"); container.add(1); container.add(1L); contai..

Java 2022.04.05

멤버 클래스는 되도록 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

상대방 저장소의 커밋을 내 저장소로 가져오기

우테코의 페어 프로그래밍은 초기 단계에 페어와 함께 개발을 하다가 적절한 시점에 페어와 헤어진 후 개인으로 미션을 이어나가는데요, 페어 프로그래밍 하는 동안 한 사람의 저장소에 커밋을 저장하니 다른 한 사람은 해당 내용을 자신의 저장소로 복사해와야 합니다. 덕분에 재밌는걸 배웠어요👍 아래 순서대로 명령어 수행하시면 됩니다. 로컬에서 상대방 저장소를 내 로컬 저장소에서 연결 git remote add [상대방 저장소의 별칭] [상대방 저장소 주소] // 별칭은 여기서 지어주시면 됩니다. 상대방 작업브랜치를 가져오기 git fetch [위에서 지은 별칭]/[가져올 브랜치명] // 별칭과 브랜치 사이에 `/`를 넣었을 때 인식을 못할 수도 있습니다. 그럴 땐 " " 공백으로 구분하면 되더라구요... 기준은 잘..

git, github 2022.02.15