본문 바로가기

Java

(8)
자바 예외 이해 (Checked, Unchekced) 자바 예외 이해 예외 계층 Object : 자바의 모든 객체는 Obejct를상속받는다. 예외도 마찬가지이다. Throwable : 최 상위 예외이다. Error : 메모리 부족이나 심각한 시스템 오류 등 복구불가능한 예외이다. Exception Checked : RuntimeException을 제외한 모든 예외를 체크예외라 한다. Unchekced : RuntimeException 하위의 모든 예외를 언체크예외라 한다. 예외 기본 규칙 예외는 폭탄돌리기와 같다. 예외를 처리하지 못하면 호출한 곳으로 예외를 던지고 예외를 처리할 수 있으면 처리하고 정상흐름으로 돌릴 수 있다. 예외를 처리하지 못하고 계속 던지면 어떻게 될까? 자바의 main() 쓰레드의 경우 에러 로그를 출력하면서 시스템이 종료된다. 웹 .. 더보기
Reflection, JDK 동적 프록시, CGLIB 리플렉션 자바 리플렉션은 우리가 컴파일 타임에 알 수 없는 정보들( 클래스, 인터페이스, 메서드, 필드 등)에 대해 런타임에 동적으로 접근하고 수정할 수 있게 해준다. 예제 리플렉션이 어떤 상황에서 필요한지를 살펴보자. 아래와 같이 Hello 라는 클래스가 있다. @Slf4j static class Hello{ public String callA(){ log.info("callA"); return "A"; } public String callB(){ log.info("callB"); return "B"; } } Hello 클래스의 메서드를 호출하기 전과 후에 log를 출력하고자 한다. 가장 쉽게 구현하는 방법은 호출하기 전과 후에 아래와 같이 로그를 남기는 것이다. @Test void Reflection.. 더보기
Garbage Collector (정의와 종류) Garbage Collector ( 정의, 종류 ) GC란? 자바 언어로 프로그래밍을 할 때 우리는 인스턴스를 생성하고 사용한 이후에 이에 대한 메모리를 해제하지 않는다. 메모리를 직접적으로 관리해줘야 하는 언어와 달리 JVM 기반 언어는 Garbage Collector가 사용되지 않는 메모리 영역(Garbage)을 청소해주기 때문이다. 이렇게 Garbage Collector의 대상이 되는 영역은 JVM 메모리의 Heap 영역이다. Weak Generational Hypothesis (JVM의 GC는 두 가지 가설을 전제로 역할을 수행한다.) 대부분의 객체는 금방 접근할 수 없는(Unreachable) 상태가 된다. 오래된 객체에서 새로운 객체로의 참조는 매우 드물게 발생한다. 위의 그림을 보면 실제로 .. 더보기
Java String이란? (StringBuilder, StringBuffer, String Iterning, String pool) Java String 평소에 가장 많이 쓰는 타입 중 하나인 String에 대해 자세히 알고 있지 못했다. String의 특징에 대해 살펴보고 이를 보완하기 위해 나온 JVM에서 제공하는 메모리 관리와 여러 다른 객체들을 살펴보자. String 객체의 특징 String의 가장 큰 특징으로는 불변성(Immutability)을 꼽을 수 있다. String text = "abcd"; textAppend = text + "efg"; 위와 같은 코드를 작성했을 때 JVM 메모리의 변화를 예상해보자. String은 Heap 메모리에 저장되므로 Heap에 "abcd" 가 저장된 후에 "abcd" 뒤에 "efg" 가 붙어서 저장 될 것이라고 예상할 수 있을 것이다. 그러나 String은 불변성이라는 특징을 갖고 있기 .. 더보기
JVM (Java Virtual Machine)과 메모리 영역 JVM(Java Virtual Machine) JDK, JRE, JVM 등이 무어인지 명확히 정의하지 못할 때가 많다. JDK란 java development kit의 약자로 JRE + Development Kit(개발을 위한 도구) 이라고 쉽게 생각하면 된다. JRE란 Java Runtime Environment의 약자이다. 그리고 이 JRE는 JVM + libraries 이라고 생각하면 된다. JVM은 Java Virtual Machine 선 마이크로 시스템즈에서 개발했다. 원래의 목적은 가전 제품들에 사용하는 코드를 어떠한 운영체제를 사용하더라도 돌아가게 만드는게 목적이었다. 그 목적을 이루기위해서는 운영체제 위에 virtual machine을 두어서 이 가상 머신이 동일한 코드를 넣으면 각 운영체.. 더보기
Effective Java - Item 42. 익명 클래스보다는 람다를 사용하라 이전의 자바 예전에는 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스(드물게는 추상 클래스)를 사용했다. 이런 인터페이스의 인스턴스를 함수객체(function object)라고 하여, 특정 함수나 동작을 나타내는 데 썼다. Collections.sort(words, new Comparator(){ public int compare(String s1, String s2){ return Integer.compare(s1.length(), s2.length()); } } });이 코드에서 Comparator 인터페이스가 정렬을 담당하는 추상 전략을 뜻하며, 문자열을 정렬하는 구체적인 전략을 익명 클래스로 구현하였다. 하지만 익명 클래스 방식은 코드가 너무 길기 때문에 자바는 함수형 프로그.. 더보기
Java 8, 9, 10, 11 무슨 일이 일어나고 있는가? 이 포스팅은 Modern Java In Action 의 CH1을 정리한 내용입니다. Java는 거듭 변화해오고 있다. 이러한 변화중에서 가장 획기적이고 생산성이 바뀌는 변화는 언제였을까? 바로 Java 8이 등장했을 때다. Java 8에서 제공하는 새로운 기술을 간단하게 살펴보자. 스트림 API 메서드에 코드를 전달하는 기법 인터페이스의 디폴트 메서드 스트림 API 자바 8은 데이터베이스 질의 언어에서 표현식을 처리하는 것처럼 병렬 연산을 지원하는 스트림이라는 새로운 API를 제공한다. 데이터베이스 질의 언어에서 고수준 언어로 원하는 동작을 표현하면, 구현(자바에서는 스트림 라이브러리가 이 역할을 수행)에서 최적의 저수준 실행 방법을 선택하는 방식으로 동작한다. 즉, 스트림을 이용하면 에러를 자주 일으키.. 더보기
Exception Exception 에러와 예외 먼저 예외란 입력값에 대한 처리가 불가능하거나, 값이 잘못되어 정상적인 프로그램 흐름에 어긋나는 거을 의미한다. 자바에서 예외는 개발자가 직접 처리할 수 있기 때문에 미리 예측하여 핸들링할 수 있다. 에러는 시스템에 비정상적인 상황에서 발생하기 때문에 개발자가 애플리케이션 코드에서 처리할 수 없는 경우가 많다. Java에서 모든 예외는 Exception 클래스를 상속받는다. 크게 두 가지로 나눌 수 있는데 Checked Exception과 Unchecked Exception이다. Checked Exception이란 컴파일 타임에 컴파일러가 예외를 미리 알려줄 수 있는 예외를 의미한다. 그렇기에 체크드 예외를 처리하지 않으면 컴파일 오류가 발생한다. UnChecked Exce.. 더보기