본문 바로가기

Java/공부공부

(29)
[Java] ConcurrentHashMap ConcurrentHashMapJava에서 멀티스레드 환경에서 안전하게 사용할 수 있도록 설계된 해시 기반의 Map.모든 메서드에 synchronized를 거는 HashMap과 달리 필요한 범위에만 lock을 걸어 성능과 안정성 보장.import java.util.concurrent.ConcurrentHashMap;ConcurrentHashMap map = new ConcurrentHashMap();map.put("apple", 3);map.put("banana", 5);int count = map.get("apple");key - value 구성으로, key와 value 모두 null 불가. putIfAbsent() 지정한 key에 값이 없을 경우에만 새 값을 저장.ConcurrentHashMap ma..
[JAVA] record (java 14 이상) * record 불변(immutable) 데이터를 간결하게 표현하기 위한 클래스 타입.생성자, getter, equals(), hashCode(), toString() 등이 자동 생성.(Java 14에 도입, Java 16부터 정식 기능으로 채택) 아래처럼 선언한다면,public record CommandResult(String status, String msg) {}다음과 같은 클래스가 자동 생성되는 것과 동일하다.import java.util.Objects;public final class Result {// final필드 private final String status; private final String msg;// 생성자 public Result(String status, S..
[JAVA] 타입 소거 (Type Erasure) 자바의 타입 소거? 자바의 설계 철학과 하위 호환성 때문에 생긴 개념. 기존 자바코드(JDK 1.4 이하)는 아래처럼 타입 안정성이 보장되지 않았었는데List list = new ArrayList();list.add("hello");list.add(123); // 문제 없음자바5부터 아래처럼 제네릭이 도입되면서 컴파일 과정에서 데이터 타입을 검사하게 됨.List list = new ArrayList();list.add("hello");list.add(123); // 컴파일 에러 제네릭 기능을 기존 자바 코드와 호환되게 하면서도, JVM 구조를 변경하지 않고 도입하기 위한 기법이 타입 소거!!컴파일 시에 제네릭을 검사하지만, 컴파일 이후에는 타입 정보가 사라지게 된다. 이로 인해 아래의 문제점들이 발생..
[Java] ObjectMapper (2) TypeReference, 설정메서드, 어노테이션 * TypeReference Jackson의 ObjectMapper에서 제공하는 클래스로역직렬화(deserialization) 과정에서 제네릭 타입 정보를 전달하기 위해 사용.** 단일 객체가 아닌 복잡한 타입인 경우, 런타임에 타입 정보가 사라지기 때문에 명시적으로 타입을 전달해줘야함.      List, Map, List>     JSON 문자열 --> List String json = "[{\"name\":\"phyho\",\"age\":10}]";List users = mapper.readValue(json, new TypeReference>() {});  JSON 문자열 --> MapString json = "{\"name\":\"phyho\", \"age\":10}";Map map = mapp..
[Java] ObjectMapper (1) 주요 메서드 * ObjectMapper  Jackson 라이브러리에서 제공하는 클래스로 JSON 데이터와 Java 객체 간의 직렬화 및 역직렬화에 사용. ( Java 객체 ↔ JSON ) ex) User 클래스public class User { private String name; private int age; // 생성자와 getter/setter 필수 public User() {} public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } ..
[Java] "".equals(null) (equals 메서드) String.equals(Object obj) 메서드는 내부적으로 매개변수가 null일 경우 false를 반환한다.null.equals("")는 예외를 발생시키지만, "".equals(null)은 안전하게 false를 반환!! (equals메서드 내부로직)@Overridepublic boolean equals(Object anObject) { if (this == anObject) { // 같은 객체인지 확인 return true; } if (anObject instanceof String) { // anObject가 String 타입인지 확인 String anotherString = (String) anObject; int n = value.le..
[JAVA] Thread.sleep() Thread.sleep()현재 실행 중인 스레드의 실행을 일시적으로 멈추게 하는 메서드. Thread.sleep(milliseconds);Thread.sleep(milliseconds, nanoseconds); - milliseconds : 대기 시간 (밀리초) - nanoseconds : 추가 대기 시간 (나노초)  ex) public class SleepExample { public static void main(String[] args) { System.out.println("Start"); try { Thread.sleep(2000); // 2초 동안 멈춤 } catch (InterruptedException e) { ..
[JAVA] port연결 확인 스케줄러 (ScheduledExecutorService, CountDownLatch) * port 연결 여부 확인 스케줄러 public int portWatcher(String port) throws InterruptedException { final int[]count = {0}; ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); CountDownLatch latch = new CountDownLatch(1); Runnable checkPortTask = new Runnable() { @Override public void run(){ try { Sock..