spy()spy() 메서드를 사용하면 실제 객체의 일부 기능을 유지하면서 일부만 Mock으로 대체할 수 있습니다.이는 실제 객체의 일부 메서드 동작을 유지하면서, 특정 메서드 호출에 대한 Mock 동작을 정의할 때 유용합니다.List list = new LinkedList();List spy = spy(list);//optionally, you can stub out some methods:when(spy.size()).thenReturn(100);//using the spy calls *real* methodsspy.add("one");spy.add("two");//prints "one" - the first element of a listSystem.out.println(spy.get(0));//si..
자바 가비지 컬렉터(Garbage Collector) 자바 가상 머신(JVM)에서 메모리 관리를 담당하는 주요 구성 요소 중 하나입니다. 가비지 컬렉터는 더 이상 사용되지 않는 객체들을 식별하고 메모리에서 해제하여 자동으로 관리합니다. 이를 통해 개발자가 명시적으로 메모리를 할당하거나 해제할 필요 없이 프로그램이 메모리를 효율적으로 사용할 수 있습니다. Unused Object 식별: 가비지 컬렉터는 더 이상 사용되지 않는 객체들을 식별합니다. 이는 객체가 더 이상 참조되지 않을 때 발생합니다. 메모리 해제: 가비지 컬렉터는 사용되지 않는 객체들을 메모리에서 해제하여 다시 사용할 수 있는 공간을 만듭니다. 이는 메모리 누수를 방지하고 시스템의 성능을 향상시킵니다. 메모리 최적화: 일부 가비지 컬렉터는 메..
Microbenchmark 마이크로벤치마킹은 컴퓨터 시스템의 성능을 측정하고 비교하기 위해 작고 간단한 테스트를 사용하는 것을 의미합니다. 이는 주로 소프트웨어 라이브러리, 함수 또는 알고리즘의 성능을 평가하거나, 하드웨어 구성 요소의 성능을 테스트하는 데 사용됩니다. 마이크로벤치마킹은 특정 작업의 성능을 목표로 하며, 작업이 작고 빠르기 때문에 여러 번 반복하여 평균 실행 시간을 측정합니다. 빠른 실행: 마이크로벤치마킹 테스트는 작고 간단하기 때문에 빠르게 실행할 수 있습니다. 이는 결과를 빠르게 얻을 수 있고, 변경된 코드나 하드웨어 구성 요소의 성능 변화를 신속하게 측정할 수 있게 해줍니다. 세밀한 분석: 마이크로벤치마킹은 작은 단위의 작업을 실행하므로 세밀한 성능 분석이 가능합니다. 이는 코드나 ..
JVM JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신(VM)입니다. JVM은 자바 프로그램을 컴파일된 바이트 코드 형태로 실행하고, 이를 하드웨어와 운영 체제에 맞게 해석하여 실행합니다. 이를 통해 자바 프로그램은 특정 플랫폼에 종속되지 않고 다양한 환경에서 실행될 수 있습니다. 바이트 코드 실행: JVM은 자바 컴파일러에 의해 생성된 바이트 코드를 실행합니다. 이 바이트 코드는 자바 소스 코드를 컴파일한 결과물로, 플랫폼 중립적이며 특정 운영 체제나 하드웨어에 종속되지 않습니다. 메모리 관리: JVM은 자바 프로그램이 사용하는 메모리를 관리합니다. 이는 객체의 생성 및 소멸, 가비지 컬렉션 등을 포함합니다. JVM은 힙(heap) 영역과 스택(stack) 영역..
Java에서 List.of와 Arrays.asList는 리스트를 생성하는 방법이지만 두 메서드의 차이점이 있다. 불변성 List.of: 생성된 리스트는 불변(immutable)하며, 요소를 추가, 제거 또는 변경할 수 없다. add, remove, set 등의 메서드를 사용할 수 없다. Arrays.asList: 생성된 리스트는 크기는 변경할 수 있지만, 요소를 추가하거나 제거하는 등의 변경 작업은 안된다. set은 가능하고, 변경은 원본 배열에 반영된다. List listOf = List.of("A", "B", "C"); try { listOf.add("D"); // UnsupportedOperationException 발생 } catch (UnsupportedOperationException e) {..
CPU 바운드 작업 CPU 바운드 작업은 주로 계산이 많이 필요한 작업으로, CPU의 처리 능력이 주요 병목 지점이 되는 상황입니다. 이러한 작업들은 주로 CPU 연산이 많이 필요하며, I/O 작업이 상대적으로 적은 경우입니다. CPU 바운드 작업에서는 CPU의 성능이 주요 제약 요소가 되므로, 다중 코어를 활용하여 병렬처리를 하는 것이 성능 향상에 도움이 될 수 있습니다. 계산적인 작업: 수학적 계산이 많이 필요한 작업은 CPU 바운드 작업에 해당합니다. 예를 들어, 대규모 행렬의 곱셈, 복잡한 수학적 함수의 계산 등이 여기에 속합니다. 이미지/비디오 처리: 이미지나 비디오 처리 작업 중에서 CPU를 많이 사용하는 작업은 CPU 바운드 작업에 해당할 수 있습니다. 예를 들어, 이미지 필터링, 변환, 비..
Enum 특징 JVM에서 인스턴스를 단 한 번만 생성하기 때문에 인스턴스의 제어가 용이 Enum 상수가 프로그램 내에서 오직 한 번만 생성되고, 그 이후에는 항상 동일한 인스턴스를 참조 JVM에서 스레드 안전(thread-safe)하게 초기화 자동으로 직렬화되며, 역직렬화될 때도 항상 동일한 인스턴스를 반환 Enum Singleton Pattern Enum의 특징을 활용해서 각 Enum 상수에 대해 특정 비즈니스 객체를 생성하도록 코드를 작성해서 싱글톤으로 생성된 비즈니스 객체를 재사용할 수 있도록 구현한다. 구현 객체 생성을 Enum에 위임해서 Client에서는 Interface를 통해서 사용할 수 있다. Calculator enum에 비즈니스 객체를 생성하는 요소 public enum Calculat..
함수 추출하기 '목적과 구현을 분리'하는 방식 함수의 목적이 눈에 확 들어오고, 본문 코드에 대해서는 더 이상 신경 쓸 일이 거의 없다. 함수를 짧으면 캐싱하기가 더 쉽기 때문에 컴파일러가 최적화하는 데 유리할 때가 많다. #AS-IS function printOwing(invoice) { printBanner(); let outstanding = calculateOutstanding(); console.log('고객명: ${invoice.customer}'); console.log('채무액: ${outstanding}'); } #TO-BE function printOwing(invoice) { printBanner(); let outstanding = calculateOutstanding(); prin..
리팩터링을 제대로 하려면 불가피하게 저지르는 실수를 잡아주는 견고한 Test suite가 뒷받침돼야 한다. 컴파일할 때마다 테스트를 함께하면 디버깅 시간이 크게 줄어든다. 테스트 스위트는 강력한 버그 검출 도구로, 버그를 찾는 데 걸리는 시간을 대폭 줄여준다. 테스트를 작성하기 가장 좋은 시점은 프로그래밍을 시작하기 전이다. 기능을 추가해야 할 때 테스트부터 작성한다. 원하는 기능을 추가하기 위해 무엇이 필요한지 고민하게 되고 구현보다 인터페이스에 집중하게 된다는 장점 TDD(Test Driven Development) 처음에는 통과하지 못할 테스트를 작성하고, 이 테스트를 통과하게끔 코드를 작성하고, 결과 코드를 최대한 깔끔하게 리팩터링하는 과정을 짧은 주기로 반복한다. 테스트-코딩-리팩터링 실패해야 ..
리팩터링 정의 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법 여러가지 리팩터링 기법을 적용해서 소프트웨어를 재구성한다. 리팩터링하는 동안에는 코드가 항상 정상 작동하기 때문에 전체 작업이 끝나지 않아도 언제든 멈출 수 있다 누군가 "리팩터링하다가 코드가 깨져서 며칠이나 고생했다"라고 한다면, 리팩터링한 것이 아니다 두개의 모자 소프트웨어를 개발할 때 목적이 '기능 추가'냐, 아니면 '리팩터링' 이냐를 명확히 구분해 작업 기능을 추가할 때는 '기능 추가' 모자를 쓴 다음 기존 코드는 절대 건드리지 않고 새 기능을 추가하기만 한다. 리팩터링할 때는 '리팩터링' 모자를 쓴 다음 기능 추가는 절대 하지 않기로 다짐한 뒤 오로지 코드 재구성에만 전념한다...