Development

Study/이펙티브 자바

[Effective Java 3E] 제네릭과 가변인수를 함께 쓸 때는 신중하라

💥 개요 가변인수와 제네릭은 잘 어우러지지 않는다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어지는데(컴파일 시점에 변환됨) 내부적으로 처리해야하는 이 배열을 그만 클라이언트에 노출하는 문제가 생겼다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다. 매개변수화 타입의 변수가 타입이 다른 객체를 참조하면 힙 오염이 발생한다. 이렇게 되면 typesafe하지 않아 형변환 에러가 발생하고 제네릭 타입의 타입 안정성이 흔들린다. ☠️문제상황 public class Dangerous { // 코드 32-1 제네릭과 varargs를 혼용하면 타입 안전성이 깨진다! (191-192쪽) static void dangerous(..

Study/이펙티브 자바

[Effective Java 3E] 한정적 와일드카드를 사용해 API 유연성을 높이라

💥 개요 이전 포스팅에서 얘기했듯이 매개변수화 타입은 불공변이다. 즉 서로 다른 타입 Type1 , Type2가 있을 때 List은 List의 상위타입도 하위 타입도 아니다. List에는 어떤 객체든 넣을 수 있지만 List은 문자열만 넣을 수 있다. 즉, List은 List가 하는 일을 제대로 수행하지 못하니 하위타입이 될 수 없다.(리스코프 치환 원칙에 어긋난다.) 때로는 불공변 방식보다 유연한 무언가가 필요하다. 🛠️ 와일드 카드 타입 적용 이런 경우 와일드 카드 타입으로 해결이 가능하다. public class Stack { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 1..

Study/이펙티브 자바

[Effective Java 3E] 이왕이면 제네릭 타입으로 만들라

💥 개요 JDK가 제공하는 제네릭 타입과 메서드를 사용하는 일은 일반적으로 쉬운 편이지만, 제네릭 타입을 새로 만드는 일은 조금 더 어렵다. 그래도 배워두면 값어치는 충분히 한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size =..

Study/우아한 테크 코스

[우아한 테크 코스] 프리코스 - 4주차, 크리스마스 회고

✨ 목표 마지막 4주차 프리코스에서 피드백과 코드리뷰를 통해 적용 및 공부하기로 마음을 먹은 부분은 1.Stream을 활용 심화 2.객체는 객체스럽게 사용 3.필드의 수를 줄이기 위해 노력 4.ParameterizedTest 5.함수형 프로그래밍 활용 5가지였다. 🔍달성 Stream을 활용 심화 stream의 경우에는 코드리뷰를 받았는데, Stream에 대해서 제대로 공부하지 않고 주먹구구 식으로 사용했기 때문에, 이를 공부해 더 자유롭게 Stream을 활용할 수 있도록 마음을 먹었다. stream의 장점이라고 생각하는건 언제든 병렬로 처리할 수 있도록 큰 노력없이 변경이 가능하고, 가독성과 간결성을 챙기기 위해서다. 그리고 컬렉션을 잘 활용하기 위해 stream을 사용해야 된다고 생각했다. 객체는 객체..

Languege/Java & Spring

Stream 사용법

💥 개요 우테코 3주차 코드리뷰 진행 중 Lotto를 파라미터로 받은 개수만큼 새로운 객체를 생성하는 코드를 만드는데, 더 좋은 코드를 추천해주셔서 Stream의 활용과 심화에 대해 알아야겠다. 라고 생각했다. 1. Stream 생성하기 Java에서 Stream을 생성하는 방법은 다양합니다. 컬렉션, 배열, 특정 범위의 숫자 등에서 Stream을 생성할 수 있습니다. List list = Arrays.asList("a", "b", "c"); Stream stream = list.stream(); 2. Stream 가공하기(중간연산) Stream을 가공하는 중간 연산에는 여러 가지가 있습니다. 이들은 Stream을 변형하지만, 최종 연산이 호출되기 전까지는 실행되지 않습니다. [ 필터링 - Filter ]..

Study/이펙티브 자바

[Effective Java 3E] 배열보다는 리스트를 사용하라

💥 개요 배열과 제네릭 타입에는 중요한 차이가 두가지 있다. 배열의 경우 Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Superp[]의 하위 타입이 된다.(공변) 하지만 제네릭은 불공변이다. List가 List의 하위 타입이 아니다.(불공변) 그럼 제네릭이 더 안 좋은걸까? 배열의 문제점 Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException을 던진다. 위의 코드는 런타임에 실패한다. 하지만 다음 코드는 컴파일 시점에 실패한다. List ol = new ArrayList(); // 호환되지 않는 타입이다. ol.add("타입이 달라 넣을 수 없다."); 어느쪽이든 문자열을 넣..

Study/우아한 테크 코스

[우아한 테크 코스] 프리코스 - 3주차, 로또 회고

❤️ 서로 PR하기를 원하시는분은 https://github.com/woowacourse-precourse/java-lotto-6/pull/818 여기에 남겨주세요! 👍3주차 목표 3주차는 2주차에서 계획했던 목표인 mvc 패턴에 맞게 유효성 검사하기 public 메소드만 테스트하기 이 두가지에 중점을 뒀다. 이번주에 적용하기 위해서 해당 내용을 정리하여 블로그에 포스팅했는데, 덕분에 이번주차 미션을 해결하는데 도움이 많이 됐다. 특히 private 메소드를 테스트해야 하는 경우라면, 해당 클래스가 너무 많은 책임을 가진것이 아닌지 확인하라는 말에 많은것을 깨달았다. [해리&션 발표 중, 많이 실수하는 부분] https://mntdev.tistory.com/90#%ED%95%B4%EB%A6%AC%26%E..

Study/이펙티브 자바

[Effective Java 3E] 비검사 경고를 제거하라

💥 개요 제네릭을 사용하면 수많은 컴파일러 경고를 보게 된다. 익숙해질수록 마주치는 경고 수는 줄겠지만 새로 작성한 코드가 한번에 깨끗하게 컴파일되리라 기대하지는 말자. 대부분의 비검사 경고는 쉽게 제거가 가능하고, 컴파일러가 이를 알려준다. 이대로 수정하기만 하면 경고가 사라진다. 하지만 제거하기 어려운 경고도 있다. 하지만 포기하지말고 할 수 있는 모든 비검사 경고를 제거하라. 모두 제거하면 타입 안정성이 보장된다.(런타임에 ClassCastException이 발생할 일이 없다.) 경고를 제거할 수 없지만 타입 안전한 경우 @SuppressWarnings("unchecked") 어노테이션을 달아 경고를 숨기자. 단, 타입 안전함을 검증하지 않은 채 경고를 숨기면 경고없이 컴파일되지만, 런타임 시점에 ..

mntdev
'분류 전체보기' 카테고리의 글 목록 (3 Page)