반응형

김영한 14

태태개발일지 - flatMap

Java Stream과 flatMap Java의 Stream API는 컬렉션을 다루는 데 있어 매우 강력하다.특히 flatMap은 2차원 이상의 자료구조를 평탄화(flatten)할 때 필수적인 메서드이다.이번 글에서는 flatMap이 왜 필요한지, 그리고 실제로 어떻게 동작하는지 예제를 통해 쉽게 설명하겠다. 2차원 리스트List> list = Arrays.asList( Arrays.asList(1, 2), Arrays.asList(2, 4)); 이 리스트에 stream 사용 Stream> stream = list.stream(); 각 요소는 리스트이다. Stream> mappedStream = list.stream().map(innerList -> innerList.stream()); 그..

JAVA 2025.07.08

태태개발일지 - 김영한 고급JAVA (LAMBDA)

람다 메서드 참조 기존 람다 방식Lambda a = (int a, int b) -> {return a+b};Lambda b = (int a, int b) -> {return a+b}; 동일한 기능을 함수로 묶을 수 있다. Lambda a = (int a, int b) -> {add(a,b)};Lambda b = (int a, int b) -> {add(a,b)};public static int add (a ,b ){ return a+b;} 다음과 같이 함수로 묶을 수 있다. 하지만, 이것 역시 편리하게 사용할 수 있는 방법이 있는 것이다. 그것이 바로메서드 참조이다. 메서드 참조의 기본 문법 메서드 참조는 (::) 연산자를 사용한다.클래스명::메서드명(정적 메서드)참조변수::메서드명(인스턴스 메..

JAVA 2025.05.26

태태개발일지 - 김영한 자바 고급

람다 람다식은 함수형 인터페이스(추상 메서드가 하나인 인터페이스)의 인스턴스를 간결하게 표현하는 방법이다.Java 8부터 도입된 기능으로, 코드의 길이를 줄이고 가독성을 높여줍니다. 람다는 메서드만 전달하며, 익명클래스보다 더 간단하게 함수 객체를 만들 수 있습니다. 단, 람다는 함수형 인터페이스에만 사용할 수 있고, this 키워드는 외부 클래스의 인스턴스를 참조합니다 익명클래스 익명클래스는 이름이 없는 클래스로, 주로 일회성으로 인터페이스나 추상클래스를 구현할 때 사용한다. 예를 들어, Comparator나 Runnable 같은 인터페이스를 구현할 때 별도의 클래스를 만들지 않고 코드 내에서 바로 정의할 수 있다. 익명클래스는 여러 메서드를 구현할 수 있고, 내부에 필드나 초기화 블록도 선언할 수 있..

JAVA 2025.05.20

태태개발일지 - JAVA 고급편(3) 김영한 람다

람다&제네릭제네릭 사용 이유1. 중복과 가시성Function func1 = a -> a+3;Function2 func2 = a -> a+2; 이와같이 람다를 만들 때 비슷하거나 같은 코드를 여러개만든다면, 중복과 가시성에 문제가 생길 수 있음 2. 람다 대입Function func1 = a -> a+3;#Function2 func2 = a -> a+2;Function2 func2 = func1 (x) 아래와 같이 java 특성상 같은 값이라도 다른 자료형에 값을 대입할 수 없다. 즉 int s = 10String w = "10"w =s (x) 같은 값이라도 대입할 수 없기 때문이다. 제네릭&람다@FunctionalInterfacepublic interface Function { R apply(T ..

JAVA 2025.05.05

태태개발일지 - JAVA 고급편(3) 김영한 람다

고차함수 고차 함수(Higher-Order Function)는 함수를 인자로 받거나, 함수를 반환하는 함수를 의미한다 쉽게 말해서 기본적인 함수는 int, float, 객체 ... 간단한 자료형을 넘기지만, 함수자체를 넘기는 함수를 고차함수라고 한다. 즉, 함수 자체를 값처럼 전달하거나 반환할 수 있는 함수가 고차 함수다. 기본적인 함수는 int, float, 객체 등 단순 자료형을 인자로 받지만, 고차 함수는 함수 자체를 인자로 받거나 결과로 반환한다 import java.util.function.Function;public class HighOrderFunctionExample { // 함수를 인자로 받는 고차 함수 public static int compute(Function oper..

JAVA 2025.05.02

태태코딩 - 람다(김영한 실전자바 고급 3편)

요즘 AI공부를 시작하다보니, AI공부를 쉬고싶을 때 백엔드 공부로 치유하는 느낌이다,, 원래는 백엔드도 점점 공부라고 느껴지던 참이였는데,, 치료된건가..? 싶다 일단 AI 끝나면 멀티스레드를 마무리하고, 람다를 제대로 다시 공부해볼 예정이다. 효율적인 코드?역시 영한 강사님이다,, 아직 시작 부분이지만, 람다가 왜 필요한지 설명해주신다.머리속 코드로 작성해보자면 public void ex1(){ String ex1 = "행복"System.out.println("오늘은 "+ ex1+ "해요");} public void ex2(){ String ex2 = "우울"System.out.println("오늘은 "+ ex2+ "해요");}public class Main { public static void..

JAVA 2025.04.27

태태개발일지 - 고급 java (김영한) 컬랙션 동시성

전 글에서 CAS 연산을 다룬 후 컬랙션 동시성에 대해 글을 작성해보려한다. Collection 동시성? 자바에서는 List, Map, Set 컬랙션들은 기본적으로 동기화가 되어있지 않기 때문에, 멀티쓰레드 환경에서 사용할 경우 동기화를 고려해야한다.해결방법 1. 프록시를 사용하여 synchronized를 메서드 마다 붙여서 동시성을 보장해준다. 2. Collections.synchronizedXXX() 이라는 동기화된 컬렉션을 사용한다. 사실 1번과 2번 둘다 사용할 수 는 있지만, 현업에서는 더 간편하고 효율적으로 사용하기 위해서 java.util.concurrent를 사용한다. 종류(1) Concurrent List클래스특징CopyOnWriteArrayList- 읽기 연산이 많고, 쓰기 연산이..

JAVA 2025.03.19

태태개발일지 - 자바 고급 (김영한) CAS 연산

자바 원자적 연산 원자적 연산이란? 하나의 연산이 중간에 끊기지 않고 한 번에 수행되는 것  원자적 연산을 사용하는 이유멀티스레드 환경에서 동시에 여러 스레드가 공유 변수에 접근하면 경합이 발생할 수 있다.이 문제를 해결하기 위해 synchronized 와 같은 키워드로 lock을 걸어서 동기화 할 수 있지만, 락을 사용하면 성능이 저하될 수 있다. ex) 아래는 원자적인 연산이 아니여서 경합이 발생할 수 있는 코드이다.public void use(){if(i==10){}i++;}CAS CAS(Compare-And-Swap) 을 사용해서 동기화 없이(비블로킹, Lock-Free) 원자적 연산을 수행할 수 있도록 설계된 클래스  사용법 import java.util.concurrent.atomic.Atom..

JAVA 2025.03.17

태태개발일지 - java 고급 멀티스레드(김영한)

전 글에 이어서 작성하겠다.전 글을 요약하자면, 생산자와 소비자가 같은 대기공간에 들어가고 랜덤으로 깨어진다는 것이였다. ReentrantLock여기서 사용하는 것이 ReentrantLock 이다. 예시코드 public void awaitMethod() { lock.lock(); try { while (!ready) { // ready가 true가 될 때까지 대기 System.out.println(Thread.currentThread().getName() + " 대기 중..."); condition.await(); // 현재 스레드를 대기 상태로 만든다. } S..

JAVA 2025.03.08

태태개발일지 - java 고급 멀티스레드

생산자 스레드와 소비자 스레드 시뮬레이션가정:1. 생산자는 데이터를 가져와서 queue에 입력을한다.2. 소비자는 데이터를 queue에서 가져와서 제거한다.  기본 코드 예시 public synchronized void produce(int value) throws InterruptedException { while (queue.size() == MAX_SIZE) { System.out.println("Queue is full. Producer is waiting..."); sleep(); // Queue가 꽉 차면 기다림 } queue.offer(value); System.out.println("Produced..

JAVA 2025.03.06
반응형