본문 바로가기

Java23

[Java] Synchronized 이해하기 자바에서는 멀티 쓰레드 환경에서 안정성을 부여하기 위해 synchronized라는 예약어를 제공합니다. 하지만 일반적으로 순수 자바로 프로그래밍을 하다보면 멀티 쓰레드를 경험할 일이 없어 해당 예약어에 대해 이해하는 것이 어려운데요. 이번 포스팅에는 synchronized예약어를 이해하고 간단하게 실습하는 시간을 갖고자 합니다. 소스코드 synchronized란? synchronized는 사전적으로 동시에 일어나다. 라는 의미를 갖고 있습니다. 그 의미처럼 자바에서도 동시에 일어나는 일에 대해 안정적으로 처리하기 위해 해당 키워드가 생겼습니다. 동시에 하나의 객체에 접근하는 여러 쓰레드에 대해 , 하나씩 들어오세요하며 안내하는 존재라고 생각하면 쉬울 것 같습니다. synchronized는 메서드와 블록으.. 2022. 3. 5.
[Java] StringBuilder와 String 연산 살짝 파보기 최근 미션을 진행하면서 output을 출력할 때 String 연산을 사용한다 vs StringBuilder를 사용한다로 선택지가 나뉘고 있습니다. 지난 백엔드 String 강의에서 네오가 ByteCode를 비교해준 것을 토대로 앞으로의 미션동안 제가 직접 사용할 output 연산에 대한 의사결정을 해보고자 합니다. String 연산의 발전 JDK 5 JDK 5 버전부터 String 연산은 JVM에서 StringBuilder로 최적화 되어 연산되었습니다. 아래 코드를 실행시켜봅시다. public String concat(String s, int i) { return s + i; } javap -c 명령어를 통해 바이트 코드를 간소화해서 확인해보면 아래와 같습니다. java.lang.String concat.. 2022. 3. 3.
[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] 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.