| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- C 언어 코딩 도장
- datastructure
- 알기쉬운 알고리즘
- buffer
- 이스케이프 문자
- 이것이 자바다
- Graph
- R
- s
- stream
- Selection Sorting
- insertion sort
- C programming
- Algorithm
- Serialization
- coding test
- Stack
- 윤성우 열혈자료구조
- 혼자 공부하는 C언어
- list 컬렉션
- 메모리구조
- ㅅ
- 윤성우의 열혈 자료구조
- JSON
- Today
- Total
목록Programming Language/Java (46)
Engineering Note
동시성 제어테스트를 위한 멀티쓰레드 코드 흐름 파악하기private int 주문_동시요청(int 요청개수) throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(10); CountDownLatch latch = new CountDownLatch(요청개수); AtomicInteger exceptionCount = new AtomicInteger(0); for (int i = 0; i { try { orderService.placeOrder(userId, productId, 1); } catch (OutOfStockExc..
얕은 복사참조변수의 주소 값만 복사깊은 복사참조 변수 값을 복사하는게 아니라, 각 요소의 값을 복사하여 새로운 인스턴스를 만들어 복제하는 것. 배열은 복사할 때 참조변수만 전달하는 얕은 복사를 하면 원본 데이터가 변하면 새롭게 복사된 배열도 함께 변하는 문제가 발생합니다. 이는 두 배열이 사실 같은 배열이었기 때문에 발생하는 문제입니다. 얕은 복사 코드와 메모리 int[] originArr = {1,2,3,4,5}; //카피할 배열 int[] copyArr = originArr; 깊은 복사 코드와 메모리 int[] copyArr1 = new int[10];for(int i = 0; i String 문자열 얕은 복사가 괜찮은 이유String 객체는 immutable 객체이기 때문에 값을..
List 변수가 있을 때, 새로운 List 변수에 값을 할당하기만 하면, 두 변수는 같은 List를 가리키고, 하나의 List를 변경하면 다른 List도 변경되게 된다. 사실상 하나의 List기 때문에 두 List가 변하는건 아니고 사용하는 쪽은 변하는 것처럼 보일 수 있다.이러한 복사를 얕은 복사라고 한다. 그렇다면 새로운 List를 만들어서, import java.util.ArrayList;import java.util.List;class Item { String name; int price; public Item(String name, int price) { this.name = name; this.price = price; } @Override..
프로그램이 완벽하게 동작하면 좋다. 개발자가 사용자의 행동을 예측해서 정상동작하는 구조로 프로그램을 만들면 예외처리를 할 필요는 없지만, 현재의 프로그램은 현재의 상황에서 완벽하게 동작하는 프로그램일 가능성이 높다.예외처리는 그래서 필요하다. 몇 년동안 개발자를 하면서 예외처리를 하는 이유를 기계적으로 암기하고 있었다. 오늘 A사 기업 과제를 하면서 리팩토링과 코드리뷰를 통해 예외처리가 중요한 이유를 배웠다. 코드 리팩토링 한 과정 단위 테스트를 작성하면서 Optional의 데이터의 .get()을 많이 활용했다. 우선 값이 잘 저장되었는지 확인하기 위해서 사용했는데 별로 좋은 코드가 아니었다.Optional은 null을 반환할 수 있는 환경의 문제를 해결하기 위해 Java 8부터 생긴 특수한 타입이다. ..
문제 상황도메인 주도 개발로 데이터의 불변성을 보장하기 위해 setter사용을 지양하는 방향으로 개발.하지만 JPA양방향 연관관계 선언시 실수를 방지하기 위해 연관관계메서드를 선언하는데 setter가 있어야 현재 엔티티를 세팅하면서 반대편 참조 엔티티의 값을 동시에 값을 세팅할 수 있었다.그래서 package-private 의미의 (default) 접근제어자로 setter용 assignMember메서드를 만들어주었다.(Java에서 접근제어자를 선언하지 않으면 default 접근제어가 선언된다.) 그리고 동작여부를 테스트 코드에서 setter를 사용해보았는데 동작했다. 원인 분석Java는 package 선언으로 패키지를 판단하므로, src/main과 src/test가 달라도 package 선언이 같으면 같..
1. 개요동일성 : 두 객체가 메모리상에서 같은 주소를 가리키고 있는가?(완전히 같은 인스턴스인가?)동등성 : 두 객체가 주소는 다르더라도 들고 있는 값이 같은가? 2. Java 연산자를 통해 알아보는 동일성과 동등성1. a == b (동일성 비교)'== '연산자는 비교하고자 하는 대상의 주소값(Refrence)을 직접 비교합니다. 기본 타입(int, boolean) : 변수에 실제 값이 직접 저장되므로, 값 자체가 같은지 비교합니다.참조 타입(String, Object) : 객체가 저장된 메모리 주소를 비교합니다. 아무리 내용이 같아도 서로 다른 메모리 공간에서 생성되었다면, false를 반환합니다. 정리하면 Java에서 주소가 같아야 진짜 같은 객체다. 2. a.equlas(b) (동등성 비교)e..
List 컬렉션은 필드로 선언할 때 new ArrayList(); 던지 다른 컬렉션으로 초기화를 해주어야 한다. 초기화를 해주지 않으면, 값을 추가할 때 NullPointException이 발생한다. 예시 코드// ❌ 초기화 안 함@Entitypublic class Order { private List orderItems; public void addOrderItem(OrderItem item) { this.orderItems.add(item); // 💥 NullPointerException! }}// ✅ 초기화 함@Entitypublic class Order { private List orderItems = new ArrayList(); publ..
Entity와 DTO 변환 과정을 for문 대신 Stream으로 변환하면서 알게된 내용을 정리하려고 한다. 1. 초기 forEach를 사용한 비효율적인 방식 코드public List converWithForEach(List orderEntities) { List orderDtos = new ArrayList(); orderEntities.stream().forEach(order ->{ OrderDto dto = OrderDto.from(order); orderDtos.add(dto); }); return orderDtos;} forEach 방식의 문제점함수형 프로그래밍 위반: 스트림 파이프라인 외부에서 선언된 orderDtos라는 변이 가능한 상태를 스트림 내부에서 변경해야 하는데 이는 함수형 프로..