java
Java Efficient Integer Read
Java Efficient Integer Read Java에서 정수 입력받기 Java 코딩 테스트 문제를 풀 때, 많은 수의 정수를 입력받아야 하는 경우가 존재 일반적으로는 BufferedReader로 줄 단위로 입력받은 후 StringTokenizer를 이용해 parsing 그러나 이 방법은 입력이 클 수록 매우 많은 메모리와 시간을 요구하게 됨 System.in.read() 활용 Java의 System.in.read() 메소드를 활용하면 ASCII 코드를 빠르게 입력받을 수 있음 이를 활용해 다음과 같은 read() 함수는 매 번 정수를 읽어들여서 반환 private static int read() throws Exception { int number = System.
read morejava
Integration Test
Integration Test Integration Test 모듈 간 상호 작용 및 통합하는 부분에서 수행하는 테스트 외부 라이브러리를 사용하거나, DB에 접근하는 등 단위 테스트에서 불가능한 부분을 검증 가능 단위 테스트보다 오래 걸리고 복잡하므로 필요한 경우에만 수행 유형 Top-down 방식: 최상위 모듈부터 통합하며 테스트를 진행 Bottom-up 방식: 최하위 모듈부터 통합하며 테스트를 진행 스프링에서는 @SpringBootTest 어노테이션을 클래스 상단에 붙여 통합 테스트를 진행 가능 References https://needjarvis.tistory.com/443 https://miinsun.tistory.com/137 https://cjwoov.tistory.com/9 https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/
read morejava
Unit Test
Unit Test Unit Test 하나의 모듈에 대해 수행되는 가장 작은 단위의 테스트 특정 모듈만 독립적으로 테스트하기 때문에 다음과 같은 장점 존재 문제가 생긴 부분을 발견하기 쉬움 리팩토링이 안정적임 테스트 비용이 적게 들고 빠르게 수행 가능 각 모듈에서 문제가 없다는 걸 확인하게 해 주므로, 모듈들을 통합해 테스트 할 때 용이 다른 객체와 메시지를 주고 받는 과정이 필요한 경우, 가짜 객체 (Mock Object)를 주입해서 사용 좋은 단위 테스트의 특징 Assert 최소화 한 개의 테스트는 한 개의 개념만 테스트하도록 구성 Fast: 빠르게 동작해야 함 Independent: 다른 테스트와 독립적으로 작동해야 함 Repeatable: 반복 가능해야 함 Self-validating: 성공 / 실패의 boolean 값을 내야 함 Timely: 실제 코드 구현하기 전에 테스트를 구현해야 함 (TDD) References https://ko.
read morejava
Java Finalize
Java Finalize Java Finalize 메소드 Object 클래스의 메소드이며, 어떤 객체에 대한 참조가 없을때 GC가 수행하는 메소드 즉, 힙 영역에서 객체를 제거하는 역할을 하며, C++의 소멸자와 유사 이 메소드는 여러 가지 문제가 존재하며, 특히 수동으로 호출하는 경우 더욱 문제될 수 있음 Java 9에서 deprecated됨. 추후 삭제될 여정 Finalize 문제점 참조가 있는 객체를 가비지로 판단해 수집 하는 등 실행을 예측 불가 수동으로 호출해도 실행되지 않거나 아주 늦게 실행될 수 있음 죽은 클래스를 부활시킬 수 있음 이러한 불안정성 때문에 finalize를 활용한 구현이 매우 힘듦 References https://www.
read morejava
System gc
System gc system.gc() 함수 Java에서는 system.gc() 함수를 제공해서 개발자가 직접 garbage collection을 수행하도록 제공 그러나 이 함수는 무겁기 때문에 웬만해서는 사용하면 안 됨 Garbage collection 하기 전에 stop the world 과정을 수행하면서 성능 저하 또 모든 객체를 다 확인하면서 mark and sweep 과정을 거쳐야 하는 것도 부담이 큼 GC 자체가 이론적으로 굉장히 무거운 작업이기 때문 또한 확실하게 사용하지 않는 garbage를 정리해 주는 것도 아님 결국 자바에서 garbage collection은 JVM의 GC에 맡기는게 좋음 References https://codingdog.
read morejava
Garbage Collection
Garbage Collection Garbage Collection 더 이상 유효하지 않은 메모리를 garbage라고 함 (ex: 참조가 해제된 객체) C언어에서는 free() 함수를 통해 직접 메모리를 해제해야 함 자바는 JVM의 garbage collector(GC)가 garbage를 정리해주고, 이를 garbage collection이라고 함 개발자가 제어하지 않아도 돼 개발에 집중 가능하게 해 줌 개발자가 메모리 해제 시점을 알기 힘들다는 단점 존재 Heap 영역의 구분 자바에서 대부분의 객체는 일회성이며 금방 garbage가 됨 객체의 생존 기간에 따라 영역을 다르게 하기 위해, heap 영역을 다음과 같이 두 가지 영역으로 구분 Young 영역 새롭게 생성된 객체가 할당되는 영역 대부분의 객체는 young 영역에 생성된 후 사라짐, 크기가 작음 이 영역에 대한 GC를 minor GC라고 함 내부적으로는 eden 영역과 두 개의 survivor 영역 존재 이 때 survivor 영역은 두 개 중 하나씩 번갈아 가며 사용되고, 나머지 하나는 비워 둠 Old 영역 Young 영역에서 살아남은 객체가 할당되는 영역 Young 영역 보다 크며, garbage가 적게 발생 이 영역에 대한 GC를 major GC라고 함 GC 동작 방식 다음과 같은 두 가지 단계로 수행됨
read morejava
Local Class
Local Class Local Class 블록 안에 정의된 클래스. 메소드 내부, for 및 if 문 내부에서 정의 가능 Local class를 둘러싸고 있는 enclosing class의 멤버에 접근 가능 둘러싼 block의 지역 변수에도 접근이 가능하나, final로 선언되었거나 값이 변경되지 않는 변수만 사용 가능 둘러싼 block의 인스턴스 멤버에 접근이 가능하기 때문에 non-static이고, static 멤버를 선언 불가 static 멤버를 선언할 수 없다는 점에서 inner class와 유사 단, final static 상수는 선언 가능 References https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html https://live-everyday.tistory.com/189
read morejava
Mutable Immutable
Mutable Immutable Object의 type 자바를 포함한 대부분의 프로그래밍 언어에서 객체는 mutable / immutable 타입 중 하나 Mutable 인지 immutable인지에 따라 값을 변경할 수 있는 지가 달라짐 Immutable Object heap 영역에 저장된 값을 변경할 수 없는 객체 Boolean, String, Integer, Float, Long 등 primitive type의 wrapper class Immutable object를 가리키는 reference variable을 업데이트하려면 새로운 객체를 만들어서 재 할당해야 함 실제로 immutable object의 값 자체는 변화하지 않음 Atomic한 메소드를 만들 수 있고 동기화 처리가 별도로 필요없음 객체를 업데이트할 때 마다 새 객체가 필요하므로 추가 메모리 누수 및 성능 저하 발생 가능 업데이트되면서 사용되지 않는 객체는 GC가 처리함 Mutable Object heap 영역에 저장된 값을 변경 가능한 객체 List, ArrayList, HashMap, StringBuilder, Date 등 멀티스레드 환경에서 사용하려면 동기화 처리가 필요 References https://cantcoding.
read morejava
Reference Variable
Reference Variable Reference Variable new 연산자는 특정 클래스의 인스턴스를 생성하고, 해당 인스턴스의 주소값을 반환 이렇게 반환된 주소값을 저장하는 변수를 레퍼런스 변수라고 함 레퍼런스 변수를 통해 멤버 변수를 조작하거나 메서드를 호출하는 등의 행위를 수행 가능. 객체에 접근하기 위한 도구 값을 변수에 바로 저장하는 primitive variable과 저장 방식이 다름 직접 객체를 변수에 담기에는 너무 크기도 하고 크기가 유동적이기 때문에 주소값을 이용하는 방식 사용 References https://jjunii486.tistory.com/53 https://cloudstudying.kr/lectures/198 https://kimdabang.tistory.com/entry/%EC%9E%90%EB%B0%94-Reference%EC%99%80-Object%EC%9D%98-%EC%B0%A8%EC%9D%B4
read morejava
Java Sort Comparison
Java Sort Comparison Java sort Java에서는 다음과 같은 여러 경우의 데이터를 sort 메소드로 정렬 가능 Primitive type의 값으로 이루어진 array 레퍼런스 변수로 이루어진 array 레퍼런스 변수로 이루어진 List 데이터를 정렬하기 위해 2, 3 번의 경우에는 객체가 Comparable interface를 구현하거나, sort 메소드 인자에 별도로 Comparator 객체를 제공해야 함 sort 메소드를 실행했을 때 정렬하는 방법이 조금 다름. Java11 기준으로 설명 Primitive Type Array Primitive Type의 경우에는 Dual Pivot QuickSort를 사용 다른 Quick sort보다 빠르고 O(N^2)의 시간 복잡도가 덜 발생 Reference Variable Array TimSort라는 정렬 방법을 사용 Stable한 iterative merge sort의 일종이며, insertion sort와 merge sort를 합침 데이터가 정렬되어 있는 경우 O(NlogN)보다 적게 비교하며, 거의 정렬된 경우 O(N) 다만 정렬을 위해 추가적인 공간(N/2 이하)이 필요 Reference Variable List List의 sort 함수는 Array와 동일하게 TimSort 사용 별개로 Collections.
read more