반응형

Dev/Java 13

Functional Programming In Java (ft. Lambda , StreamAPI)

지난 글에서는 함수형 프로그래밍 기본 개념을 정리하였고 이번 포스팅에서는 자바에서 함수형 프로그래밍을 어떻게 사용하고 있는지에 대해 알아보려고 합니다. Java8 버전부터 함수형 프로그래밍을 지원하기 위해 람다와 스트림이 도입되었습니다. 람다와 스트림을 사용하면 함수형 프로그래밍 스타일로 자바 코드를 작성할 수 있습니다. 물론 람다와 스트림을 사용하여 작성한 코드를 일반 스타일의 자바코드로 바꾸어 작성하는 것이 불가능하진 않습니다. 달리 말하면 람다와 스트림 없이도 자바 코드를 작성하는데 어려움이 없다는 뜻입니다. 하지만 그럼에도 불구하고 람다와 스트림을 사용하는 이유는 작성하는 코드의 양이 줄어들고 읽기 쉬운 코드를 만드는데 유리하기 때문입니다. 예전에 Stream 관련된 포스팅을 했었기 때문에 람다에..

Dev/Java 2023.06.18

Java Streams (2) - 가공하기 ⚒

Java Streams(1)- 스트림 생성하기👀👀 에서 언급했듯이 스트림에 대한 내용은 크게 세 가지로 나눌 수 있습니다. 생성하기 : 스트림 인스턴스 생성 가공하기 : 필터링 및 매핑등 원하는 결과를 만들어가는 중간 작업 (intermediate operations) 결과 만들기 : 최종적으로 결과를 만들어내는 작업 (termianl operations) 이번 포스팅에서는 가공하기 에 대한 내용을 정리하겠습니다. 가공하기 전체 요소 중에서 다음과 같은 API를 이용해서 내가 원하는 것만 뽑아낼 수 있습니다. 이러한 가공 단계를 중간 작업(intermediate operations) 이라고 하는데, 이러한 작업은 스트림을 리턴하기 때문에 여러 작업을 이어 붙여서(chaining) 작성할 수 있습니다. L..

Dev/Java 2022.12.29

Java Streams (1) - 스트림 생성하기 👀

Streams 자바 8에서 추가한 스트림은 람다를 활용할 수 있는 기술 중 하나입니다. 자바 8 이전에는 배열 또는 컬렉션 인스턴스를 다루는 방법은 for문 혹은 foreach문을 돌면서 요소 하나씩을 꺼내서 다루는 방법이었습니다. 간단한 경우라면 상관없지만 로직이 복잡해질수록 코드의 양이 많아져 여러 로직이 섞이게 되고, 메소드를 나눌 경우 루프를 여러 번 도는 경우가발생합니다. 스트림은 '데이터의 흐름'입니다. 배열 또는 컬렉션 인스턴스 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있습니다. 또한 람다를 이용해서 코드의 양을 줄이고 간결하게 표현할 수 있습니다. 즉, 배열과 컬렉션을 함수형으로 처리할 수 있습니다. 또 하나의 장점은 간단하게 병렬처리(multi-thread..

Dev/Java 2022.12.27

[Java] JVM 메모리 구조

JVM (Java Virtual Machine) 이란? JVM은 Java Virtural Machine의 약자로, 자바 가상 머신이라고 부릅니다. JAVA와 운영체제 사이에서 중계자 역할을 합니다. -> JAVA가 운영체제 종류에 영향받지 않고 돌아 갈 수 있는 이유 메모리 관리를 자동으로 해줍니다(GC : Garbage Collection) 여기서 핵심은 JVM이 운영체제와 플랫폼 종류에 의존적이지 않고 독립적으로 JAVA 프로그램이 실행 된다는 것(WORA) 입니다. WORA : Write Once, Run Anywhere -> 한 번 작성한 코드는 어디서든 실행 할 수 있는 자바의 대표적인 장점 JVM 메모리 구조 자바 소스 파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클래스 파일이 됩니다. ..

Dev/Java 2022.12.05

[Java] Default Method in Java8

1. Default Method의등장 배경 1.1기존의 Interface의 문제점 위 그림은 ClassA,ClassB,ClassC 총 3개의 클래스가 InterfaceA를 구현하고 있습니다. 이때 요구사항이 추가 되면서 interfaceA에 특정 추상 메서드 methodA를 추가해야 하는 상황이 발생했습니다. 인터페이스 원칙에 의해 ClassA~C 모두 methodA를 구현해야만 합니다. 클래스의 수가 적으면 상관 없겠지만 (상관없지 않음) 만약 아래와 같은 상황이 온다면 어떨까요? classA~Z 모든 클래스 마다 methodA를 구현해줘야 합니다. 수많은 클래스들마다 methodA를 구현하면서 human mistake를 발생하지 않을 수 있을까요? 설상가상으로 methodA를 수정해야 한다면 어떨까요..

Dev/Java 2022.11.07

[Java] Garbage Collection(가비지 컬렉션) 톺아보기

1. Garbage Collection(가비지 컬렉션)이란? 프로그램을 개발 하다 보면 유효하지 않은 메모리 인 가비지(Garbage)가 발생하게 됩니다. C언어를 이용하면 free()라는 메서드를 통해 메모리 해제를 해주어야 하지만 Java나 Kotlin을 이용해 개발을 하다 보면 개발자가 직접 메모리를 해제해주는 일이 없습니다. JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문입니다. 대신 Java에서 명시적으로 불필요한 데이터를 표현하기 위해서는 일반적으로 null로 선언 해줍니다 Person person = new Person(); person.setName("ahkong"); person = null; // 가비지 발생 person = new Person(); pserson.se..

Dev/Java 2022.10.02

[JAVA] 메모리 누수(Memory Leak)

자바에서의 메모리 누수 자바의 메모리 누수는 더 이상 사용되지 않는 객체들이 가비지 컬렉터에 의해 회수되지 않고 누적이 되는 현상 을 의미합니다. Old 영역에 누적된 객체로 인해서 메이저 GC가 빈번하게 발생하게 되면 프로그램의 응답속도가 늦어지다 결국 OOM(OutOfMemory)오류로 프로그램이 종려 됩니다. 가비지 컬렉션을 통해 소멸 대상이 되는 객체가 되기 위해서는 유효한 참조가 존재하지 않아야 합니다. 즉, 다 쓴 객체에 대한 참조를 해제하지 않으면 가비지 컬렉션의 대상이 되지 않아 계속 메모리가 할당 되는 메모리 누수가 발생하게 됩니다. 메모리 누수가 발생하는 원인 static 변수가 객체를 참조하고 있는 경우 static 변수는 프로그램 종료 시점에 메모리가 반환되고, 사용하지 않아도 메모..

Dev/Java 2022.09.18

쓰레드 동기화 (Thread Synchronization)

동기화란? 특정 객체를 동시에 접근하여 변경하기를 막는 기법. 멀티 쓰레드 환경에서 쓰레드A가 자원을 이용하는데 동시에 그 자원을 사용하면 안될 때 동기화가 필요. 자바에서 동기화 기법을 적용하는 방법은 synchronized 예약어를 사용하는 방법 ,synchronized block 2가지 방법이 있다. 동기화가 왜 필요 할까? 헬스장에 런닝 머신은 1대가 있고 런닝머신을 이용하기를 희망하는 사람은 10명이 있다고 가정해보겠습니다. 일반적인 상황이라면 가장 먼저온 1명이 런닝머신 이용이 끝난 후 다음 사람이 이용하겠죠? 암묵적으로 헬스장의 기구(자원)을 이용하려는 사람(스레드)은 동기화를 실천하는 중인 셈이죠. 하지만 그렇지 않은 상황이라면 어떻게 될까요? 런닝머신에 10명이 동시에 올라가 속도를 멋대..

Dev/Java 2022.08.06

Optional의 안티 패턴을 피하는 방법 😎

비는 태양을 피하는 방법을 노래하고 저는 Optional의 안티 패턴을 피하는 방법을 포스팅 하겠습니다. ??? : 짤쓰려고 글 쓰시는건가요 ? 나 : Yes -! 이전 포스팅 에서는 Optional이 무엇이고 어떤 메서드가 내장 되어있는지를 확인하였습니다. Optional은 왜 JAVA 8에서 도입이 되었을까요? stack overflow에서는 Optional을 만든 의도 에 대해 다음과 같이 설명하였습니다. ... Our intention was to provide a limited mechanism for library method return types where there needed to be a clear way to represent "no result" ... 우리의 의도는 "no res..

Dev/Java 2022.07.22

Optional 제대로 알고 쓰는건가요?

To. me Optional 제대로 알고 쓰는건가요? from java // userRepository.findById()의 리턴 타입: Optional User user = useRepository.findById(id).getorElse(null); if(user == null){ // user가 null 인경우 } else { // user가 null 이 아닌경우 } 이상한 점 느끼셨나요 ? Optional의 존재 이유를 정확하게 알고 계신 분이 위의 코드를 봤다면 대충 저런 표정을 짓고 계시지 않으실까 싶습니다^^. 놀랍게도 제가 진짜 프로젝트에 적용했던 코드의 예시랍니다,,ㅎㅎ Java 8 Optional 자바 옵셔널은 자바 8에서 최초로 도입 되었습니다. 예상하지 못한 NPE(NullPoint..

Dev/Java 2022.07.10
반응형