본문 바로가기

language, framework, library/Java28

[java] ThreadLocal에 관하여 안녕하세요. 오늘은 ThreadLocal에 대해서 알아보도록 하겠습니다. 변수를 공유하는 방법 객체는 Heap 또는 Stack 메모리 영역에 배치시킬 수 있습니다. Heap 영역은 일반적으로 모든 thread에서 접근 할 수 있으며 stack은 thread 하나당 만들어 지는 메모리 영역으로 thread간 접근이 불가능한 것으로 알려져 있습니다. 아래 코드의 UserRepository 변수는 Heap 영역에 만들어진 객체를 가리키고 있으며 다른 곳에서도 해당 객체를 바로 접근할 수 있습니다. 함께 공유해서 사용하기 때문에 여러 thread에서 사용할 때 공유된 정보로써 제공할 수 있습니다. 따라서 만약 UserRepository가 설정 정보를 가지고 있고 이를 변경한다면 사용하고 있는 모든 곳에서 영향을.. 2021. 5. 15.
[java] Java와 Lazy evaluation - Java8 Stream 안녕하세요. 이전시간에 우리는 Lazy evaluation에 대해서 알아보는 시간을 가졌었습니다. 오늘은 이어서 Java8의 Stream의 Lazy Evaluation에 대해서 알아보는 시간을 가져보겠습니다. 우리는 이전 시간 [Java] Java와 Lazy Evaluation 포스터에서 Lazy Evaluation의 장점을 필요하지 않는 연산을 하지 않는다라고 이야기했습니다. 그리고 Stream은 Lazy Evaluation을 사용하는 대표적인 연산방식입니다. 예제 아래와 같은 로직이 있다고 해보겠습니다. 1 ~ 30까지의 숫자의 List가 있습니다. 이 숫자에서 3의 배수의 숫자만을 걸러내고 10을 곱한 값중 앞에서 3가지만 취하도록 하겠습니다. 이런 로직을 가지는 메서드를 만든다고 해보겠습니다. C.. 2021. 4. 2.
[Java] Java와 Lazy Evaluation Lazy evaluation은 실제로 필요로 해지는 경우에 연산을 시작하는 것입니다. 이 반대로는 eager evaluation이 있으며 이는 할당되자마다 연산을 시작합니다. 기본적인 Java의 기조는 eager evaluation을 기본으로합니다. 하지만 일부 Lazy Evaluation이 있었으며 Java 8이 나오면서 Java에는 Lazy Evaluation을 좀 더 유연하게 사용할 수 있게되었습니다. 오늘은 Lazy Evaluation의 예제와 Java 8에서 어떻게 사용할 수 있을지에 대해서 알아보는 시간을 가져보도록 하겠습니다. 예제 오늩 테스트를 위해 사용하는 메서드는 아래와 같습니다. 해당 메서드를 실행하게되면 1초간 sleep을 하고 입력받은 파라미터에 a가 포함되어있는지 여부로 true.. 2021. 3. 26.
[Java] final 키워드에 대해서 알아보자 안녕하세요. 오늘은 여러분들과 java의 final 키워드에 대해서 알아보려고 합니다.finalfinal 키워드는 변수(variable), 메서드(method), 또는 클래스(class)에 사용될 수 있습니다. 이 final 키워드는 어떤 곳에 사용되냐에 따라 다른 의미를 가집니다. 하지만 final 키워드를 붙이면 무언가를 제한한다는 의미를 가지는 것은 공통적이 성격입니다.변수(variable)변수에 final을 붙여보겠습니다. 변수에 final을 붙이면 이 변수는 수정할 수 없다는 의미를 가집니다. 수정될 수 없기 때문에 초기화 값은 필수적입니다. 만약에 객체안의 변수라면 생성자, static 블럭을 통한 초기화까지는 허용합니다.수정 할 수 없다는 범위는 그 변수의 값에 한정합니다. 즉, 다른 객체를.. 2021. 3. 3.
[Java] Java의 정렬 알고리즘 - Arrays와 Collections 안녕하세요. 오늘 포스팅은 Java의 Collection에서 사용하고 있는 정렬에 대해서 알아보려고 합니다. Java를 사용하다보면 정렬해서 처리해야할 경우가 생깁니다. 그럴경우 아래와 같이코드를 작성하곤 합니다. 아래 코드를 볼때 결과값이 1, 2, 3, 4, 5로 정렬되게 나온다는 것을 예측할 수 있을것입니다. @Test public void arrayTest() { int[] array = new int[]{1, 3 , 5, 4, 2}; Arrays.sort(array); System.out.println("array = " + Arrays.toString(array)); } @Test public void collectionTest() { List collection = new ArrayList(.. 2021. 1. 19.
[Java] String Pool에 관하여 안녕하세요. 오늘은 여러분들과 String Pool에 대해서 이야기해보고자 합니다. 알고 계셨나요 ? Java에서는 String을 저장하는데 2곳의 메모리를 사용할 수 있습니다. 오늘은 String Pool에 대해서 여러분들과 공유하고자 합니다. String Interning Java에서의 String은 일반적인 Heap에 저장할 수 있고 또한 별도의 String constants Pool이라는 공간을 제공하고 있습니다. String Constants Pool에 저장하고 사용하는 것을 String Interning 이라고 합니다. 이렇게 String Interning에 저장된 String 값은 불변성(Immutability)을 가지게 됩니다. 불변성을 가진다는 의미는 값은 변함이 없으며 동일한 Strin.. 2021. 1. 17.
[java] Generic을 이용한 Box Class 안녕하세요. 오늘 포스팅은 Java Generic의 4번째 시간입니다. 오늘 여러분들과 공유하고자 하는 내용은 다시 기본으로 돌아가서 Generic을 이용한 Box Class라는 내용입니다. Box Class에 란 아래와 같이 어떠한 타입으로든 받을 수 있는 Class를 말합니다. 아래 예제를 보면 Box class 안에 Object 타입의 변수가 하나있으며 getter, setter 메서드가 각각 있습니다. Object Class는 모든 Class의 부모 클래스이기 때문에 setter 메서든에는 모든 Class가 들어올 수 있게되어 Box Class란 이름으로 사용할 수 있는 것입니다. public class Box { private Object object; public void set(Object .. 2020. 11. 22.
[Java] Java의 Super Type Token 안녕하세요. 오늘은 Java Generic의 3번째 시간입니다. 외부 통신을 할 때 가장 많이 사용하는 Spring의 Bean은 restTemplate 일겁니다. restTemplate을 사용할 때 응답값에 대해서 형변환을 할 때 배열로의 형변환을 타입을 new TypeReference() {} 이렇게 사용하곤 합니다. jackson에서도 마찬가지지요. 왜 이렇게 사용할까요? 이상하게 여기고 List으로 바꾸면 제대로 동작하지 않습니다. 위와같은 형태를 Super Type Token이라고 부릅니다. 오늘은 이 Super Type Token은 어떤것이며 왜 사용해야하는지 알아보는 시간을 가져보겠습니다. 제네릭의 Type Erasure jackson이라는 라이브러리가 있습니다. jackson은 json형태의.. 2020. 11. 17.
[Java] Java 제네릭의 형 변환(covariant & contravariant) 안녕하세요. 저희는 저번 포스팅에서 배열과 컬렉션 제네릭의 차이점에 대해서 알아보는 시간을 가졌습니다. 그리고 배열은 기본적으로 형변환이 자유로우며 컬렉션 제네릭은 무공변으로 형변환이 불가능 하다는 차이를 알게 되었습니다. 그렇다면 컬렉션을 이용해서는 다양한 형태의 데이터 처리가 불가능 할까요? 그렇지 않습니다. 오늘은 제네릭의 형 변환(covariant & contravariant)에 대해서 알아보는 시간을 가져보겠습니다. 공변성(covariant) 공변성이란 자신이 상속받은 부모 객체로 타입을 변화시킬 수 있다라는 것을 뜻합니다. 제네릭의 공변성을 사용하기 위해서는 extends 키워드를 사용해야합니다. 아래 예제는 이전 포스팅에서 사용한 예제입니다. 아래 처럼 사용하면 컴파일에러가 발생하는 건 우리.. 2020. 11. 11.
[java] 배열(Array)과 컬렉션 제네릭의 차이 자바의 객체 타입은 고정이 아닙니다. 객체 타입은 런타임에 자신이 상속받고 있는 타입으로 변하는 업 캐스팅(upcasting)과 자신 자신의 아래 클래스의 형태로 변할 수 있는 다운 캐스팅(downcasting)이 있습니다. 이를 자바에서는 객체가 다형성(Polymorphism)을 가지고 있다고 합니다. 상속 매커니즘과 더불어 이런 다형성은 객체의 재사용성을 높여주고 객체지향(OOP)를 잘 달성할 수 있게 도와줍니다. 그리고 ArrayList, HashMap과 같은 Collections을 자바 개발자는 자주 사용하게됩니다. 이때 타입의 안정성을 위해 제네릭(generic)을 사용합니다. 이 제네릭은 다양한 Type을 지원할 수 있도록 타입 파라미터(type paramter) T를 지원합니다. 오늘 여러분.. 2020. 11. 8.
[java8] 병렬 Stream Java에서는 다양한 방법으로 병렬 처리를 만들 수 있습니다. 기본적인 Thread 클래스를 이용할 수 있으며, ExecutorService를 이용하여 쓰레드풀도 쉽게 만들 수 있습니다. 그리고 CompleteFuture를 이용하면 쓰레드 간의 데이터 동기화, 실행 순서 등도 원하는 대로 조작할 수도 있습니다. 그리고 Java8애서 등장한 Stream은 병렬 처리를 쉽게 사용할 수 있게 메서드를 제공해줍니다. 만들어 놓은 Stream에 parallel를 추가하기만 하면 되죠. 오늘은 java8의 병렬 Stream에 대해서 알아보는 시간을 가져보겠습니다. Stream 예제 오늘 사용할 예제는 아래와 같습니다. 코드에는 java google style guide를 적용하였습니다. 메서드를 하나 만들도록 하겠.. 2020. 7. 26.
[Java9] Reactive Stream Flow - Processor 실습 안녕하세요. 우리는 이전 포스팅에서 Reactive Stream에 대해서 알아봤었습니다. Reactive Stream의 스펙으로 Publisher, Subscriber, Subscription을 소개해드렸었습니다. 하지만 저희가 알아보지 않은 스펙이 하나 더 존재합니다. 바로 Processor Interface 입니다. 오늘은 이 Interface에 대해서 간단하게 알아가보는 시간을 가지도록 하겠습니다. 개요 Processor는 리액티브 스트림에서 처리하는 이벤트의 변환 단계입니다. 예를 들어 Subscriber가 여러개 있을 때 하나의 Processor가 에러를 수신하면 이로부터 회복하거나 즉시 onError 신호를 모든 Subscriber에게 에러를 전파할 수 있습니다. 또한 Producer가 생성한.. 2020. 7. 17.