본문 바로가기

우아한테크코스 4기/레벨125

[Java] public final vs private final 저는 불변하는 Value Object를 만들 때 field를 private final로 선언합니다. 불변 객체이기 때문에 필드를 변경할 수 없게 만들 뿐 아니라 외부에서의 직접 접근을 막기 때문에 안정성이 높다고 생각하기 때문입니다. 이때 자바를 공부하는 또 다른 사람이 만약 아래와 같은 이야기를 한다면 어떻게 답변을 할 수 있을까요? 불변임을 보장하기 위해서는 public final을 사용해도 충분하지 않나요? 오히려 getter를 만들지 말라는 중론에 더 부합하지 않을까요? 게다가 외부에서 변경하려 해도 컴파일 에러가 발생해서 불변도 보장되는데요? 아래 코드를 보면 정말 private final보다 명료한 것 같기도 하면서 불변성도 잘 보장해주고 있습니다. public class Member { pu.. 2022. 3. 2.
[Java] Optional 잘 사용하기 자바 8 이전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지가 두가지 있었습니다. null 반환 Exception 호출 하지만 null을 반환하는 코드는 null을 처리하기 위한 추가 로직히 필요할 뿐 아니라, 만약 null이 제대로 처리되지 않을 경우 NullPointerException 이 발생할 가능성이 커지게 되죠. 또, 예외를 던지는 것은 JVM이 비정상적인 상황이라고 판단하고 최적화를 해주지 않기 때문에 그 비용이 꽤 큽니다. 그러나 자바 8 버전이 등장하면서 Optional이라는 새로운 선택지가 생겼습니다. Optional 자바 docs에서 제공하는 설명에 따르면 Optional은 null이 아닌 값을 포함하거나, 포함하지 않을 수 있는 컨테이너 개체라고 합니다. .. 2022. 3. 1.
[Java] 31이란.. 흔히 equals 와 hashcode를 함께 재정의 하라는 이야기를 들어봤을 것입니다. 저도 당연히 알고 있었지만,, 조금 더 아는체하기 위해 내부 구현을 뜯어봤습니다. 그러자 등장하는 31. 과연 이 녀석의 정체는 무엇일까요?? equals, hashcode 재정의 Object 명세서에서는 equals와 hashcode에 대해 다음과 같이 언급하고 있습니다. 동등성 비교에 사용되는 정보가 변경되지 않는다면, hashcode 메서드는 일관되게 같은 값을 반환한다. equals 메서드가 두 객체를 같다고 판단한다면 두 객체의 hashcode값은 같다. 두 객체가 equals 하지 않다고 해서 두 객체의 hashcode가 다를 필요는 없다. (하지만 성능이 떨어진다 -> Linked로 관리할거임 아마 ;;).. 2022. 2. 28.
[Java] 코드로 객체 지향 기본 용어 알아보기 객체지향을 처음 공부할 때 관련 내용을 검색 하면 책임, 협력, 다형성 등 알 수 없는 용어들이 잔뜩 등장하는 것을 본 경험이 있을 것입니다. 오늘 포스팅에서는 코드를 통해 객체 지향 기본 용어들을 정리하고 앞으로 코드를 작성할 때 의도적으로 이 내용을 떠올릴 수 있도록 도움을 주는 글을 작성하고자 합니다. 책임 책임 이란 객체가 맡아야하는 역할입니다. 한 User가 하나은행에 돈을 입금한다고 가정해봅시다. 비즈니스 상 User는 돈을 입금한다 는 역할을 갖게 됩니다. public class User { public void depositMoney() { //... } } 다음으로는 HanaBank라는 은행 객체를 만들겠습니다. 은행은 입금과 출금에 책임을 갖게 됩니다. public class HanaB.. 2022. 2. 27.
[Java] Stream docs 훑어보기 로또 미션을 진행하면서 의도적으로 Stream API를 사용하려고 노력했는데요. 지금까지 개념적 정립이 되지 않은 상태에서 Stream을 사용했다보니 어려움을 많이 겪었습니다. 오늘 포스팅에서는 Stream docs를 파헤쳐서 Stream에 대해 이해하고자 합니다. Stream이란? Stream은 컬렉션에서 map, reduce 처럼 요소의 스트림에 기능적 작업을 지원해주는 클래스입니다. int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(); 위 코드를 보면, Collection의 인스턴스를 stream 소스로 변경하여 빨간색을 갖는 내부 객체의 무게 합을 구하는 reduction 과.. 2022. 2. 24.
[Java] 인스턴스를 캐싱하여 성능 개선하기 (feat. 로또) 오늘 포스팅은 빈번하게 사용되는 인스턴스를 캐싱하여 성능을 개선하는 방법에 대해 작성해보고자 합니다. 정적 팩토리 메소드의 장점을 떠올리면 이름을 가질 수 있다 가 가장 먼저 떠오릅니다. 하지만 정적 팩토리 메소드에는 또 다른 장점이 존재합니다. 바로 자주 사용하는 인스턴스를 캐싱하여 성능을 개선하는 방법인데요. Integer 코드를 통해 이 내용을 확인해봅시다. public static Integer valueOf(int i) { if (i >= IntegerCache.low && i 2022. 2. 23.