커스텀 예외 클래스는 언제 사용해야 할까?
2021. 12. 3. 20:02
Java
이 의문이 생긴 이유는 클린 코드 과정을 진행하며 아래와 같은 피드백을 받아 생겨서 글을 작성하게 되었다. 만약 추출 한다면? 대략 아래와 같이 할 생각이었다. public class IllegalArgumentBlankException extend IllegalArgumnetException { throw new IllegalArgumentException("빈 문자는 입력할 수 없습니다."); } 하지만 왜 해야 하는지? 의문이 들었다. 이런 의문이 든 의식의 흐름대로 가보겠다. 🔍 어떻게 추출하지? 책을 찾아 보자. 이 때는 별 생각없이 추출하려고 했다. 어떤 좋은 방법이 있을까... 이펙티브 자바, 클린 코드 책을 찾아 봄. 커스텀 예외 클래스에 대한 내용은 없음. 사실 내가 못찾은 것일 수도 있..
java로 보는 멀티 쓰레드에서 싱글톤의 위험을 간단히 알기
2021. 10. 22. 23:10
Java
Java 멀티 쓰레드 도대체 어떻게 동시에 여러명이 접속하는 거지? 멀티 쓰레드인가? 그럼 톰캣은 멀티 쓰레드를 지원하는건가? 그럼 자바에서 멀티 쓰레드가 지원 된다는건데 알고 있는데 사용해본 적이 없기에 와닿지 않는다. 라는 의문에서 간단한게 자바 코드로 싱글톤을 활용해 멀티 쓰레드의 위험도를 직접 살펴 보았습니다. 자바에서는 Runnable 인터페이스의 run()을 구현하여 Thread 클래스로 생성하고 실행할 수 있습니다. 이 부분은 더 공부하지 않고, 멀티 쓰레드와 싱글톤의 무서움을 간단하게나마 경험하기 위함입니다. 싱글톤 클래스를 만들고 두 개의 쓰레드(유저)가 결제를 하는 코드입니다. 코드에서 보면 사용자1은 20000원을 결제 했습니다. 사용자2는 10000원을 결제 했습니다. 그럼 Sing..
Java로 자료구조 이해하기 5편(Map)
2021. 10. 16. 19:37
Java
Map 키와 쌍을 가짐. 키를 중복 x, 값은 중복 o Map은 내부적으로 Entry배열을 가지고 있는데 Entry는 key, value 쌍을 의미한다. 대략 코드는 아래와 같이 생겼다. Collection interace는 아니지만, 동일하게 사용되기 위해 Entry를 Set으로 반환한다. HashMap 특징 HashMap(동기화 x)은 Hashtable(동기화 O)의 신버전 순서를 유지하려면, LinkedHashMap 클래스를 사용하면 된다. Hashing 기법으로 데이터를 저장한다. 데이터가 많아도 검색이 빠르다. hashing 해싱이란 해시함수를 이용하여 해시 테이블에 데이터를 저장하고, 읽어오는 것을 의미한다. java에서는 hashCode() 해시 함수란 key를 인자로 주면 해시 코드를 만들..
Java로 자료구조 이해하기 4편(Set)
2021. 10. 16. 18:50
Java
Set Collection interface의 구현체이다. HashSet 특징 순서가 없다. 중복이 안된다. 즉, 같은 객체가 없으면 저장하고 로또 생성기 같은거 만들 때 유용 Hash를 기반으로 하기 때문에 equals()와 hashCode()를 같이 오버라이딩 해주어야 한다. 참고(hasCode와 toString) HashSet Set 인터페이스를 구현한 컬렉션 클래스 순서를 유지하려면 LinkedHashSet 사용 TreeSet 이진 탐색 트리(binary ssearch tree)로 구현. 범위 탐색과 정렬에 유리 HashSet보다 데이터 추가 및 삭제는 느리다. 이진 트리는 모든 노드가 최대 2개의 하위 노드를 갖는다. binary라는 뜻이 2개라는 의미이므로 그렇다. 이진 탐색 트리 그림 부모 ..
인터페이스로 객체지향스럽게 다형성을 이용하여 중복 제거 하기
2021. 10. 14. 01:18
Java
인터페이스를 활용하여 중복된 소스 제거하기 우리는 평소 중복 코드를 많이 작성하고 있다. 이는 기본적으로 인터페이스의 활용할 줄 모르는 이유도 있습니다. 중복 코드를 제거하는 방법 중 한 가지가 인터페이스의 활용인데 그 방법을 설명하겠습니다. 인터페이스를 사용한다는 것은 변화되는 부분을 인터페이스로 추출한다는 의미입니다. 인터페이스로 추출해서 인터페이스로 파라미터를 받게 되면 구현체만 변경되면 중복을 제거할 수 있습니다. 즉, 클라이언트 코드는 구현체만 갈아 끼워주면 되는 것입니다. 핵심 로직은 클라이언트 코드가 알 필요가 없습니다. 즉, 인터페이스는 역할만 제공한다. 역할에 대한 책임은 구현체가 담당하는 것입니다. 인터페이스를 활용하여 다형성을 활용하게 됩니다. 인터페이스 활용 전 아래와 같이 모두 더..
JVM 동작 원리
2021. 10. 11. 14:49
Java
JVM이란 무엇인가? JVM(Java Virture Machine) 자바 가상 머신으로 자바 바이트 코드(.class 파일)를 실행할 수 있는 공간이다. 가상 머신이므로 어떤 OS에서도 독립적으로 실행이 가능하다. 핵심은 JVM은 OS 위에서 동작하게 되며, 자바 코드를 컴파일한 바이트 코드를 운영 체제가 이해할 수 있는 기계어로 변환하여 코드를 실행 시킨다. JVM 구성요소 1. ClassLoader 바이트 코드를 JVM이 운영 체제로 부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할 메모리를 할당 받았기 때문에 당연히 애플리케이션을 실행하면 수행된다. .java 파일을 javac.exe가 컴파일한 .class(바이트 코드)가 적재된다. 적재되는 시점은 Runtime시 적재된..
Arrays의 asList가 뭐고 왜 써야 할까?
2021. 10. 8. 01:15
Java
Arrays의 asList java8 API 문서에 보면 아래와 같이 나와 있습니다. 고정된 배열을 반환한다. 읽기 전용 배열을 반환한다 그래서 어떻게 사용하는 걸까? 아래와 같이 두 가지 방법으로 사용이 가능 합니다. 어떤 특징이 있을까? add, remove가 불가능하다(읽기 전용). AstractList 라는 추상 클래스의 add, remove를 상속받아 사용합니다. 아래 소스를 보면 불가능한 이유를 알 수 있습니다. UnsupportedOperationException 를 예외로 던지기 때문 입니다. 변경은 가능하다. AbstractList 에서 set 메서드는 add, remove와 동일한 예외를 발생 시키지만, AbstractList 를 상속받아 set 메서드를 오버라이드 하기 때문에 변경이 ..
hashCode와 toString
2021. 10. 5. 22:19
Java
hashCode() 객체의 해시코드를 반환하는 메서드 Object 클래스의 hashCode()는 객체의 주소를 이용해 int로 변환해서 반환 두 객체가 같은 객체인지 확인하기 위해 사용. Object 클래스에서 어떻게 구현 되어 있을까? native 메서드는 OS의 메서드이고, C언어로 작성되어 있음. body가 없는데 이는 이미 OS에서 작성된 기능이기 때문에 직접 만질 일이 없기 때문 입니다. 그래서 변경하기 위해 @Override를 해야 합니다. hashCode() 메서드 overriding 규칙 equals()를 overried하면, hashCode()도 overriding 해야 합니다. 왜냐하면, equals()의 결과가 true인 두 객체의 hashCode는 같아야 하기 때문 입니다..* 원래..