본문 바로가기

언어 & 라이브러리/자바12

[자바] BigDecimal 클래스란? BigDecimal BigDecimal은 자바 언어에서 숫자를 정밀하게 다룰 수 있는 유일한 방법이다. 돈과 소수점을 다룰땐 BigDecimal을 반드시 써야한다. 불변 클래스라는 특징이 있다. BigDecimal은 다른 타입보다 상대적으로 느리다는 단점이 있다. 소수점을 저장할 수 있는 float, double은 정밀도가 정확하지 않아 정확한 값을 출력하지 못한다. double의 부정확함 자바는 IEEE 754 부동 소수점 방식을 사용해 정확한 실수를 저장하지 않고, 근사치 값을 저장하기 때문에 정확한 값이 저장이 안된다. 따라서 정수를 이용해 실수를 표현하는 BigDecimal을 사용해야 한다. BigDecimal의 변수 intValue: 정수 scale: 지수, 소수점 첫째 자리부터 0이 아닌 자리.. 2022. 10. 14.
[자바] ConcurrentHashMap이란 무엇인가? ConcurrnetHashMap이란? ConcurrentHashMap이란 HashMap 클래서에서 보장하지 않는 Thread-Safe를 보장할 수 있도록 하는 클래스이다. ConcurrentHashMap은 읽기 작업에는 여러 쓰레드가 동시에 읽기가 가능하지만 쓰기 작업 시에는 특정 버킷에 대한 락을 사용한다는 것을 알 수 있다. public class ConcurrentHashMap extends AbstractMap implements ConcurrentMap, Serializable { public V get(Object key) {} public boolean containsKey(Object key) { } public V put(K key, V value) { return putVal(key, .. 2022. 10. 14.
[자바] Hashmap의 동작 원리에 대해 알아보자 HashMap은 충돌 시 Separate Chaining 방식을 사용한다. Java 7 이전까지는 LinkedList 자료구조를 사용하고, Java 8 부터는 Red-Black Tree를 이용해 동작한다. 어떠한 차이가 있는지 알아보자. 해시 충돌이란? 두 개의 동일하지 않은 객체에 해시 함수를 적용했을때 서로 같은 값이 나와 Key 값이 충돌하는 경우를 말한다. 따라서 이를 해결하기 위한 두 가지 방법이 있다. Open Addessing Seperate Chaining Open Addressing 해시 버킷이 사용 중인 경우 다른 해시 버켓에 넣는 방식이다. Searate Chaining 이 방식은 충돌이 생기면 해시 버킷을 연결하여 해결하는 방식이다. 두 개의 방식 모두 최악의 경우 O(M)이 된다... 2022. 10. 14.
[자바] JVM 설정 옵션 JAVA GC 알고리즘 튜닝 처리량 관점 -> Parallel GC 클라이언트 응답시간 관점 -> CMS GC, G1 GC Serial GC 32비트 JVM에서 돌아가는 싱글 쓰레드 어플리케이션에서 주로 사용한다. 실제론 거의 사용하지 않는다. Parallel GC Full GC 시 compact 작업이 수행되기에 GC 시간은 많이 든다. 하지만 처리량은 가장 많다. CMS GC compact 작업을 수행하지 않아 stop-the-world가 짧으나 자주 compaction이 발생할땐 오히려 시간이 더 걸릴 수 있다. 메모리 파편화의 단점 G1 GC 가장 성능이 우수한 GC로서 Java 9부터 default GC로 채택되었다. JVM 메모리 설정 메모리가 클땐 GC 발생 횟수 감소, 그러나 GC 수행 시.. 2022. 10. 8.
[자바] String, StringBuilder, StringBuffer 차이점 정리 공통 특징은 String을 저장하는 클래스이다 그러나 여러 다른 특징들을 가지고 있다. String String은 두 가지 생성 방식이 있다. JVM의 힙 영역에 저장되어 가비지 컬렉터의 관리를 받게 된다. 그러나 리터럴 방식으로 생성하면 String Pool 영역에 생성되어 절대 변하지 않는 값을 가지고 있다. 그렇기에 만약 for문으로 String에 "+" 를 붙이는 것을 10개 돌리면 10개의 String 객체가 새로 생기게 된다. 생성된 String은 String Pool에 지속적으로 생기게 된다. 이렇게 되면 가비지 컬렉터가 지속적으로 추적하여 메모리 해제를 해야하는 문제가 있다. 불변성을 갖고 있기에 Thread-Safe하다는 특징 있다. String first = "first"; //리터럴 .. 2022. 9. 23.
[자바] 자바 8에 새롭게 변화된 기능들 자바 8로 오면서 많은 부분이 바뀌게 되었다. 오늘 날 배포 환경에서는 8이나 11 버전을 많이 사용하는 것으로 알려져 있는데 무엇이 추가되었는지 알아보자 목차 1. 람다 표현식 2. 스트림 API 3. Optional 4. Interface의 Default 메소드 5. 날짜 관련 클래스 람다 표현식 자바8부터 지원 함수형 프로그래밍 지원 메소드를 하나의 식으로 표현한 것 메소드를 람다식으로 표현하면 메소드의 이름과 반환타입이 없으므로, 익명함수라고도 한다. 람다식 장단점 장점 코드가 간결, 가독성이 좋다. 함수 만드는 과정 없이 한번에 처리 가능 병렬 프로그래밍 용이 단점 디버깅이 까다롭다. 재귀식에는 부적합 스트림 API (이것이 자바다) Collections 또는 Array의 요소를 하나 씩 참조해.. 2022. 9. 23.
[자바] 자바를 사용하는 이유 JAVA를 많이 사용하는 이유 객체 지향 언어 자바는 객체 지향 언어로 여러 객체의 협력을 통해 프로그램을 개발한다. 프로젝트를 독립적인 객체 단위로 분리해 작업할 수 있기에 규모가 크더라도 유지보수나 확장성이 좋다. 플랫폼에 독립적인 언어 자바는 플랫폼에 영향을 받지 않아 다양한 운영체제 환경에서 제약없이 사용할 수 있다. C언어로 개발한 프로그램이 있을때, prog.c 라는 파일을 만들어 컴파일러가 컴파일 하게 되면 prog.exe가 만들어진다. 이러한 실행 파일은 해당 운영체제에 맞게 제작되었기에 다른 운영체제에서는 실행할 수 없다. 따라서 타 운영체제에 맞는 실행 파일을 만들어야 한다. 그러나 자바는 Prog를 만들어 컴파일하게 되면 Prog.class가 생성된다. 운영체제에 맞는 기계어가 아닌 .. 2022. 9. 23.
[자바] 상속보다 합성을 사용해야 하는 이유 상속이란? 상속은 상위 클래스에 로직을 구현하고 하위 클래스에스 코드를 재사용하는 방법이다. IS-A 관계로 불린다. 상속으로 얻는 장점? 외부의 접근으로 인한 다형성을 보장하고 공통된 로직을 사용할 수 있다. 하위 클래스에 따라 구현 로직만 변경해주면 된다는 장점이 있다. 그러나 Java 8의 인터페이스 Default 메소드 기능으로 이러한 상속의 장점도 불필요하게 되었다. 잘못된 상속으로 인한 오류들 1. 불필요한 인터페이스 상속 문제 하위 클래스에 부적합한 부모 클래스의 메소드를 물려받기에 자식 클래스의 캡슐화가 깨지는 문제가 발생한다. 대표적으로 자바의 Stack과 Vector 클래스가 있다. stack 클래스는 vertor를 상속받는 설계로 의도치 않는 동작이 실행되어 캡슐화를 깨뜨린다. 2. .. 2022. 9. 13.
[자바] Long 타입 비교를 equals로 해야만 하는 이유 멘토님께서 Long 타입은 == 비교를 하면 안되고 equals 비교를 해야 한다고 말씀하셨던 적이 있다. 왜 그런지 궁금해서 찾아보았다. @Test public void 숫자비교() { Long num1 = 127L; Long num2 = 127L; Long num3 = 128L; Long num4 = 128L; assertThat(num1 == num2).isTrue(); assertThat(num3 == num4).isFalse(); } Long 타입의 동일성 비교가 왜 128부터는 안되는지 궁금해 Long의 구현부를 들어가봤다. 내부적으로 -128 부터 127의 상수 값을 캐시해 동일성 비교를 하고, 상수 풀이 넘거나 적은 값이 들어왔을땐 새 객체를 만들어낸다. public static Long .. 2022. 9. 13.
[자바] 병렬 처리 컬렉션 동기화된 컬렉션(thread-safe collection) 병렬 처리 컬렉션 synchronizedList(List list) → 동기화된 list 리턴 synchronizedMap(Map m) 동기화된 map 리턴 Thread-safe 하지만 성능 문제 synchronizedSet(Set s) 동기화된 set 리턴 동기화된 컬렉션은 멀티 스레드 환경에서 하나의 스레드가 요소를 안전하게 처리하게 하기 위해 컬렉션에 락을 건다. 따라서 다른 요소를 빠르게 처리하지 못한다. → 속도 측면에서 불리 따라서 자바8부터는 java.util.concurrent 패키지에서 두 가지 컬렉션을 제공 ConcurrentHashMap HashMap의 non thread-safe 문제 해결 synchronizedMap의 속도.. 2022. 4. 5.
[자바] Double Brace Initialization 더블 브레이스로 인스턴스 생성 즉시 값을 넣어줄 수 있는 방법이다. 장점 생성과 초기화를 동시에 할 수 있다. 코드 가독성이 좋다. 적은 수의 코드라인 HashMap hashMap2 = new HashMap() {{ put("A", "1"); put("B", "2"); }}; 그러나 아래 결과와 같이 class가 다르다. import java.util.*; public class Main { public static void main(String[] args) throws Exception { HashMap map = new HashMap(); map.put("frank", "1"); map.put("potter", "2"); HashMap braceMap = new HashMap() {{ put("fr.. 2022. 4. 5.
자바 Optional이란 Optional 이란 NullPointerException을 피하기 위해 만들어진 클래스입니다. UserVO userVO = getUser(); if (userVO != null) { Address address = user.getAddress(); if (address != null) { String postCode = address.getPostCode(); if (postCode != null) { return postCode; } } } return "우편번호 없음"; 이렇게 Optional 사용하지 않으면 null 체크를 반드시 해야해서 번거로움이 많습니다. Optional userVO = Optional.ofNullable(getUser()); Optional address = userVO.m.. 2022. 2. 19.