일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 현금흐름표
- 미국주식
- 객체지향
- 기업분석
- Java
- 오버라이딩
- mco
- 다형성
- 주식
- Bandit
- 프로그래머스
- FCF
- 그리디 알고리즘
- 배당성장
- 접근제어자
- Redis
- XLF
- javascript
- S&P500
- StringBuffer
- 인플레이션
- 잉여현금흐름
- 무디스
- 알고리즘
- etf
- 주린이
- 자바
- 제태크
- 금리인상
- Today
- Total
목록JAVA (82)
Dukbong

Java I/O의 시작 - File과 하드디스크의 이해Java의 I/O(Input/Output) 기능은 운영체제를 통해 하드웨어 자원에 접근하며, 주로 파일, 네트워크, 콘솔 등의 입출력 작업을 수행하는 데 사용되며 가장 기본적인 파일에 관해 하드디스크부터 천천히 알아보겠습니다.하드디스크(HDD)의 논리적 구조하드디스크는 회전하는 원형 디스크(platter)와 이를 읽고 쓰는 기계적 팔(arm)으로 구성되어 있으며 플래터는 여러 개의 트랙(track)과 섹터(sector)로 나뉘어서 데이터를 저장할 수 있는 논리적 단위를 형성합니다.트랙(Track): 디스크의 중심에서 바깥 방향으로 동심원 형태로 번호가 매겨집니다 (0, 1, 2, ...)섹터(Sector): 각 트랙을 나누는 조각이며, 시계 방향으로 ..
컴퓨터는 오직 0 or 1 즉 바이트(byte)를 처리할 수 있고 사람이 알아보는 문자는 char 또는 String입니다. 쉽게 말하면 인코딩은 문자를 바이트로 디코딩은 바이트를 문자로 바꾸는 작업입니다.간단한 String 예시String message = "콜라 마시고 싶다.";// 인코딩 올바른 예byte[] bytes = message.getBytes(StandardCharsets.UTF_8);// 인코딩 잘못된 예byte[] failBytes = message.getBytes(StandardCharsets.ISO_8859_1);// 디코딩 올바른 예String success = new String(bytes, StandardCharsets.UTF_8);// 디코딩 잘못된 예String fail =..
개요Java에서 기본적으로 제공하는 인터페이스 Comparable과 Comparator에 대해 알아보겠습니다.기본적으로 Comparable과 Comparator는 제네릭 타입으로 동작하기 때문에 원시 타입은 사용할 수 없습니다.Comparable객체 내부의 요소를 활용한 정렬이 필요한 경우 사용됩니다.java.lang 패키지에서 제공합니다.정렬이 필요한 객체 내부에 compareTo를 구현해야 합니다.@Getterpublic class Coupon implements Comparable { private int maxDiscount; private String name; public Coupon(int maxDiscount, String name) { this.maxD..
Java에서 날짜와 시간을 포맷하거나 파싱 할 때 흔히 사용하는 SimpleDateFormat은 편리하지만 멀티스레드 환경에서 공유 자원으로 사용할 경우 동시성 문제를 일으킬 수 있습니다.이는 SimpleDateFormat이 Non-Thread-Safe로 설계되었기 때문인데 현재 회사 레거시 프로젝트에서 SimpleDateFormat을 공유 자원으로 사용하고 있는 코드를 발견했는데 이 문제를 해결하기 위해 동시성 문제의 원인을 분석하고 수정이 필요한 이유와 대안을 정리해 보았습니다.동시성 문제 발생 원인SimpleDateFormat의 동시성 문제는 주로 내부적으로 공유되는 Calendar 객체와 pattern 문자열의 상태 변경에서 비롯되는데 이 클래스는 날짜를 포맷하거나 파싱 할 때 Calendar 객..
공부를 하다 보면 "Java의 컨텍스트 스위칭 비용이 비싸다"라는 말을 자주 듣곤 하는데 이번 글에서는 왜 Java의 컨텍스트 스위칭 비용이 비싼지 정리해보았습니다.JAVA의 Thread 구조Java에서는 java.lang.Thread를 통해 스레드를 생성하게 되는데 이 과정에서 JVM은 플랫폼 스레드를 만들고 이를 OS 스레드와 연결되고 이 OS 스레드는 다시 커널 스레드와 연결됩니다. 즉, Java에서는 스레드가 JVM 플랫폼 스레드 → OS 스레드 → 커널 스레드의 1:1:1 관계로 동작합니다.- JVM 스레드 : 크기가 작음- OS 스레드 : JVM 스레드에 비해 훨씬 큼Context Switching컨텍스트 스위칭은 실행 중인 스레드를 변경할 때 현재 스레드의 상태(레지스터, 스택 포인터, 메모..
Java에서는 Pattern.matches 메소드를 통해 정규표현식을 쉽게 사용할 수 있지만 내부 동작 원리를 제대로 이해하지 못하면 성능 문제가 발생할 수 있습니다. Pattern.matches의 동작 원리Pattern.matches(String regex, CharSequence input)는 아래와 같은 과정을 거쳐 입력 문자열을 매칭합니다.> 정규표현식 컴파일메소드 호출 시 입력받은 정규표현식(regex)을 NFA(비결정적 유한 오토마타, Non-deterministic Finite Automaton)에서 정규표현식에 따라 DFA(결정적 유한 오토마타, Deterministic Finite Automaton)로 변환하며 이 과정에서 정규표현식을 해석하고 효율적으로 실행될 수 있는 내부 구조를 생성..
문제 발견레거시 프로젝트의 유지 보수를 맡게 되면서 모든 화면에서 로딩 시 약 170개의 쿼리가 실행되며 그중 약 60~70개의 변하지 않는 데이터를 반환하는 쿼리가 실행되고 있는 것을 확인했습니다.이로 인해 화면 로딩 시간이 길어지는 문제을 발견해서 처음에는 Redis를 도입하여 성능을 개선하려고 했으나 서버 확장이 불가능하다는 결론이 내려졌습니다.그래서 AOP를 이용한 인메모리 캐싱을 도입하기로 했고 메서드명과 매개변수를 조합하여 키를 생성하고 그에 따른 결과를 캐싱하는 방식으로 구현할 예정입니다.이 과정에서 동시성 문제를 해결해야 했고 synchronized, ReentrantLock, ReentrantReadWriteLock과 같은 다양한 동기화 방법에 대해 깊이 알아보았습니다.1. Synchro..
CPU - Bound 작업CPU-Bound 작업은 CPU 연산 능력이 성능에 영향을 주는 작업입니다.이런 작업은 병렬 처리를 통해 성능을 향상시킬 수 있습니다.이유는 각 Thread는 독립적으로 CPU 자원을 사용하여 작업을 처리하기 때문입니다. 하지만 실제 CPU 코어 수를 초과하는 Thread 개수를 사용하는 경우 성능에 악영향을 초래할 수 있습니다.I/O - Bound 작업I/O-Bound 작업은 입출력 연산 능력이 성능에 영향을 주는 작업입니다.이런 작업은 디스크 or 네트워크 속도에 의해 결정되기 때문에 Thread 수를 증가해도 성능 향상이 제한적입니다.또한 각 스레드가 I/O가 작업이 완료될 때까지 대기하는 병목현상이 발생하여 Thread 관리 오버헤드가 발생할 수 있습니다.성능 향상을 위해..
이 글에서는 Mockito를 활용하여 Java 애플리케이션에서 랜덤 값을 포함하는 함수를 어떻게 효과적으로 테스트할 수 있는지에 대해 알아보겠습니다.MockitoMockito는 자바에서 Mock 객체를 생성하고 관리할 수 있는 강력한 도구이며, 특히 랜덤 값과 같이 예측하기 어려운 요소가 포함된 함수를 테스트할 때 사용할 수 있습니다.Mock 객체란 실제 객체를 대신하는 가짜 객체를 말합니다.Mock 객체는 외부 의존성이 많은 코드나 복잡한 비즈니스 로직을 가진 코드를 테스트하는 데 매우 유용합니다.간단한 예제:import java.util.Random;import lombok.AllArgsConstructor;@AllArgsConstructorpublic class Game { private Rando..
Stream의 특징스트림(Stream)은 Java에서 일련의 데이터를 함수형 연산을 통해 효율적으로 처리할 수 있는 메커니즘입니다.기본적으로 스트림은 지연 평가를 사용하여 연산을 효율적으로 처리합니다.이를 통해 필요할 때만 연산을 실행하고 중간 연산 결과를 최적화할 수 있습니다.병렬 처리를 원할 경우, parallel() or parallelStream()를 사용하여 스트림을 병렬 처리 모드로 전환할 수 있습니다.병렬 Stream이 모든 상황에서 성능 향상을 보장하지 않습니다.이렇게 하면 멀티 코어 CPU를 활용하여 대량의 데이터를 빠르게 처리할 수 있고, 병렬 처리된 각 부분의 결과를 최종적으로 합치는 과정을 거칩니다.스트림의 이러한 특성 덕분에 Java에서는 복잡한 데이터 처리 작업을 보다 간편하게 ..