예외 문서화 메서드가 던지는 예외는 그 메서드를 올바로 사용하는데 아주 중요한 정보다. 따라서 각 메서드가 던지는 예외 하나하나를 문서화해야한다. 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하자. Integer.java /** * Constructs a newly allocated {@code Integer} object that * represents the {@code int} value indicated by the * {@code String} parameter. The string is converted to an * {@code int} value in exactly the manner used by the * {@cod..
Read more예외 번역 수행하려는 일과 관련 없어 보이는 예외가 발생하면 당황스럽다. 메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴대 종종 일어나는 일이다. 이는 내부 구현 방식을 드러내어 윗 레벨 API를 오염시킨다. 다음 릴리스에서 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트 프로그램을 깨지게 할 수도 있다. 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다. 이를 예외 번역(exception translation)이라 한다. 예외 번역 예시 try { ... // 저수준 추상화를 이용한다. } catch (LowerLevelException e) { /* 추상화 수준에 맞게 번역한다. */ throw new HigherLevelException(.....
Read more위상 정렬 알고리즘 정렬 알고리즘의 일종이다. 위상 정렬이란, 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는 것이다. 예시의 상황을 보자. 예시 자바 공부의 커리큘럼에는 순서가 있다. 1) JAVA 2) JSP 3) Spring 이때 우리는 각 과목을 노드로 표현하고, 'JAVA' -> 'JSP'로 이어질 수 있도록 방향성을 갖는 간선을 그릴 수 있다. 다시 말해 그래프 상에서 선후 관계가 있다면, 위상 정렬을 수행하여 모든 선후 관계를 지키는 전체 순서를 계산할 수 있다. 책에서의 예시 1) 자료구조 2) 알고리즘 3) 고급 알고리즘 위 3가지로 구성되어있는 과목 커리큘럼이 있다. '알고리즘'의 선수 과목으로 '자료구조'가 있고, '고급 알고리즘'의 선수 과목으로 '자료구조', ..
Read more신장트리 신장 트리는 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. 이때 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는다는 조건은 트리의 성립 조건이기도 하다. 최소 신장트리 최소한의 비용으로 구성되는 신장 트리다. 1) 23 + 13 = 36 2) 23 + 25 = 48 3) 25 + 13 = 38 이 경우, 1)번의 경우가 가장 최소한의 비용으로 연결되므로 최소 신장 트리라고 할 수 있다. 크루스칼 알고리즘 (Kruskal) 최소 신장 트리를 찾는 알고리즘 중 대표적인 알고리즘이 '크루스칼 알고리즘'이다. 크루스칼 알고리즘을 사용하면 가장 적은 비용으로 모든 노드를 연결할 수 있는데 크루스칼 알고리즘은 그리디 알고리즘으로 분류된다. 먼저..
Read more예외 재사용의 이점 예외는 재사용하는 것이 좋다. 자바 라이브러리는 대부분 API에서 쓰기에 충분한 수의 예외를 제공한다. 표준 예외를 재사용하면 얻는게 많다. 1) 개발한 API가 다른 사람이 익히고 사용하기가 쉬워진다. 2) API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽게 된다. 3) 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. 가장 많이 재사용되는 예외는 IllegalArgumentException이다. 호출자가 인수로 부적절한 값을 던질때 던지는 예외다. Exception, RunTimeException, Throwable, Error는 직접 재사용하지 말자. 널리 재사용되는 예외 예외 주요 쓰임 IllegalArgumentExcep..
Read more서로소 집합 (Disjoint Sets) 공통 원소가 없는 두 집합을 의미한다. 서로소 집합 자료구조는 두 종류의 연산을 지원한다. 1) 합집합 (Union) 두개의 원소가 포함된 집합을 하나의 집합으로 합친다. 2) 찾기 (Find) 특정한 원소가 속한 집합이 어떤 집합인지 알려준다. 동작 과정 서로소 집합의 동작 과정을 JAVA 구현 코드와 함께 보자. 우선 변수 선언 코드는 아래와 같다. public class Disjoint { public static int v; // 노드의 개수(V) public static int e; // 간선(Union 연산)의 개수(E) // 노드의 개수는 최대 100,000개라고 가정 public static int[] parent = new int[100001]; ..
Read more문제 https://leetcode.com/problems/search-insert-position/ Search Insert Position - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이 코드 package SITE03_leetcode.easy; import java.util.Objects; /** * https://leetcode.com/problems/search-insert-position/ */ public class E004_leetCode5..
Read more기준 동기/비동기 작업 완료를 누가 신경 쓰는가? 1) 동기 : '호출한 함수'가 스스로 신경쓴다. 2) 비동기 : '호출된 함수 (callback 함수)' 가 신경쓰고, '호출한 함수'는 신경쓰지 않는다. 블로킹/논블로킹 호출되는 함수가 바로 return 되는가? 호출한 함수가 제어권을 넘겨주는가? 1) 블로킹 : '호출된 함수'가 자신의 작업을 모두 마칠 때까지 '호출한 함수'에게 제어권을 넘겨주지 않고 대기한다. 2) 논블로킹 : '호출된 함수'에게 제어권이 넘어가지않고, '호출한 함수'가 제어권을 가지고 계속해서 다른 일을 한다. 위 내용은 동기/비동기, 블로킹/논블로킹을 요약한 내용이다. 계속해서 동기, 비동기, 블로킹, 논블로킹을 자세히 살펴보자. 동기/비동기, 블로킹/논블로킹의 판단 기준은 ..
Read more검사 예외 사용 지양 검사 예외는 발생한 문제를 프로그래머가 처리하여 안전성을 높이게끔 해준다. 물론, 검사 예외를 과하게 사용하면 오히려 쓰기 불편한 API가 된다. 어떤 메서드가 검사 예외를 던질 수 있다고 선언됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 처리하거나 더 바깥으로 던져 문제를 전파해야한다. (throws Exception) 어느 쪽이든 API 사용자에게 부담을 준다. 더구나 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없어서 자바 8부터는 부담이 더 커졌다. 1) API를 제대로 사용해도 발생할 수 있는 예외 2) 프로그래머가 의미있는 조치를 취할 수 있는 경우 이 두가지 경우를 제외하고는 검사 예외보다는 비검사 예외를 사용하는게 좋다. 검사 예외가 프로그래머..
Read more문제상황 권고 타입 자바는 문제 상황을 알리는 타입(throwable)으로 아래 3가지를 제공한다. 1) 검사 예외 2) 런타임 예외 3) 에러 위 3가지를 어떤 상황에서 선택해서 사용해야할지 헷갈린다. 이에 도움이 될 수 있는 지침을 살펴보자. 검사 예외 1) 호출하는 쪽에서 복구하리라 여겨지는 상황일 경우 이는 검사와 비검사 예외를 구분하는 기본 규칙이다. 검사 예외를 던지면 호출자가 그 예외를 catch로 잡아 처리하거나 더 바깥으로 전파하도록 강제하게된다. 따라서 메서드 선언에 포함된 검사 예외 각각은 그 메서드를 호출했을 때 발생할 수 있는 유력한 결과임을 API 사용자에게 알려주는 것이다. API 설계자는 API 사용자에게 검사 예외를 던져주어 그 상황에서 회복해내라고 요구한 것이다. 호출한 ..
Read more예외의 잘못된 사용 결론적으로 잘못된 코드. 느리다. package com.java.effective.item68; public class Main { public static void main(String[] args) { try { int i = 0; while(true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } } } 위 코드는 직관적이지 않다. 해당 코드는 배열을 무한루프로 순회하다가 배열의 끝에 도달하여 ArrayIndexOutOfBoundsException이 발생하면 끝을 낸다. 표준적은 관용구 코드로 수정 package com.java.effective.item68; public class Main { pu..
Read more자바의 명명규칙 자바 플랫폼은 명명 규칙이 잘 정립되어 있으며, 그중 많은 것이 자바 언어 명세에 기술되어있다. 자바의 명명 규칙은 크게 철자와 문법, 두 범주로 나뉜다. 철자 규칙 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름을 다룬다. 이 규칙들은 특별한 이유가 없는 한 무조건 따라야한다. 1) 패키지와 모듈 이름은 각 요소를 점(.)으로 구분하여 계층적으로 짓는다. 요소들은 모두 소문자 알파벳 혹은 드물게 숫자로 이뤄진다. 2) 표준 라이브러리와 선택적 패키지들은 각각 java, javax로 시작한다. 3) 패키지 이름의 나머지는 해당 패키지를 설명하는 하나 이상의 요소로 이뤄진다. 각 요소는 일반적으로 8자 이하의 짧은 단어로 한다. utilities -> util 4) 패키지명..
Read more브라우저 URL 파싱 주소창에 devfunny.tistory.com URL을 입력했다. 어떤 일이 발생할까? 1) 브라우저가 해당 URL 구조를 해석한다. ** https://devfunny.tistory.com 1) protocol : https:// 2) url : devfunny.tistory.com 3) port : 443 (port는 생략이 가능하다. HTTP 요청일 경우 80, HTTPS의 요청일 경우 443으로 요청한다.) 2) HSTS (HTTP Strict Transport Secucrity) 목록을 조회한다. HTTPS 프로토콜로만 접속이 가능하도록 강제화하는 기능이다. 만약 HTTP 요청일 경우, HTTP 응답 헤더에 "String Transport Security" 라는 필드를 포함..
Read moreMemory Model High Address 메모리 구조에서 높은 주소 영역으로, Heap, Stack 이 포함된다. Low Address 메모리 구조에서 낮은 주소 영역으로, Data 영역, Code 영역이 포함된다. BSS/GVAR Data 영역이 BSS와 GVAR(Data) 영역으로 나눠진다. BSS 영역에는 초기화되지 않은 데이터가 저장되고, GVAR 영역에는 초기화된 데이터가 저장된다. * 영역이 BSS로 분리되는 이유는? 초기화된 데이터는 초기화되지 않은 변수와 다르게, 해당 값을 프로그램에 저장하고 있어야 한다. BSS 영역은 초기화되지 않은 데이터가 저장되기 때문에, 프로그램이 실행될때 영역만 차지하고 그 값을 프로그램에 저장하고 있을 필요가 없다. BSS 영역 변수들이 많아져도 프로그램..
Read more자바 최적화 최적화는 신중히하자. 섣불리 진행하게되면 빠르지도 않고 제대로 동작하지도 않으면서 수정하기는 어려운 소프트웨어가 된다. 성능 때문에 견고한 구조를 포기하지말자. 빠른 프로그램보다는 좋은 프로그램을 작성하자. 프로그램을 완성할 때까지 성능 문제를 무시하라는 뜻이 아닌, 설계 단계에서 성능을 반드시 염두에 둬야한다는 말이다. 1) 성능을 제한하는 설계를 피하자. 완성 후 변경하기가 가장 어려운 설계 요소는 바로 컴포넌트끼리, 혹은 외부 시스템과의 소통 방식이다. API, 네트워크 프로토콜, 영구 저장용 데이터 포맷 등이 대표적이며, 이런 설계 요소들은 완성 후에는 변경하기가 어렵거나 불가능 할수도 있다. 2) API 설계할때 성능에 주는 영향을 고려하자. public 타입을 가변으로 만들면, 즉..
Read more