공통점둘 다 객체를 비교하는 기능을 가지는 인터페이스라는 점에서 동일합니다.Comparable// Comparable 인터페이스 구현, int compareTo(T t1, T t2) 메서드 오버라이드 필요class Item implements Comparable { int value; @Override public int compareTo(Item i2) { return value - i2.value; }}Comparator// Comparator 인터페이스 구현, int compare(T t) 메서드 오버라이드 필요class Item implements Comparator { int value; @Override public int compare(Ite..
Backend/Java
Map map = new HashMap();Set> set = map.entrySet();Iteratory> iter = set.iterator();while (iter.hasNext()) { String key = iter.getKey(); int value = iter.getValue();}
Java 소스 코드의 실행 과정요약자바 파일(.java)은 javac(=java compiler)에 의해 바이트 코드(.class)로 컴파일된다.JVM의 클래스 로더(Class Loader)가 필요한 클래스들을 로드 및 링크하여 JVM 메모리(Runtime Data Area)에 올린다.Java는 런타임(컴파일 타임 X)에 클래스를 처음 참조할 때에는 해당 클래스를 로드하고 링크하는 동적 로드를 한다. 이 동적 로드를 수행하는 부분이 JVM의 클래스 로더이다.클래스 로더의 특징계층 구조 : 부트스트랩 클래스 로더 > Extension 클래스 로더 > System 클래스 로더 순위임 모델 : 클래스 로더끼리 로드를 위임하는 구조로 동작한다. (이전에 로드 된 클래스인지 확인하기 위해 클래스 로더 캐시를 확인..
Annotation 어노테이션은 사전적인 정의로 주석이라는 의미를 가집니다. 흔히 개발할 때 접할 수 있는 대표적인 어노테이션들로 @Override, @Deprecated 부터 시작해서 Spring에서는 @Service, @Controller등이 있습니다. JDK 1.5 버전 이상에서 사용 가능하며, 자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용할 수 있습니다. 클래스, 필드, 메서드 및 기타 프로그램 요소의 선언부에 사용할 수 있으며, Java 8에 들어와서는 타입 매개변수에도 사용할 수 있게 되었습니다. (관련글 링크) 그렇다면, 왜 어노테이션을 사용할까? 1) 코드가 간결해진다. 개발을 하다보면 저같은 초보 개발자는 보일러 플레이트 코드를 마주하기 쉽습니다. 비슷한 동작을 필요로 하는 곳들마..
Annotation Java 8 부터 어노테이션을 1)타입 선언부에도 사용 가능하게, 2)중복해서 사용할 수 있게 바뀌었다. 타입 선언부 제네릭 타입 변수 타입 매개변수 타입 예외 타입 타입에 사용하기 위한 준비 사항 @Target 을 통해 해당 클래스가 어노테이션으로써 사용될 수 있는 곳을 정의할 수 있다. Java 8에 TYPE_PARAMETER와 TYPE_USE 두 가지 타입이 추가되었다. 1) ElementType.TYPE_PARAMETER 해당 클래스를Type Parameter에만 사용 가능해진다. Cf. 하나 이상의 타입 매개변수(Type Parameter)를 선언하고 있는 클래스 혹은 인터페이스를 제네릭 클래스(제네릭 인터페이스)라고 하며,이를 모두 제네릭 타입이라고 한다. 예시로, 어노테이..
Cf. Concurrent Software란? 동시에 여러 작업을 할 수 있는 소프트웨어를 의미합니다. Ex) 웹 브라우저로 유튜브를 보면서 키보드로 문서에 타이핑을 할 수 있는 SW Ex) 녹화를 하면서 코딩을 하고 워드에 적어둔 문서를 보거나 수정할 수 있는 SW Java에서 제공하는 Concurrent Programming 멀티 프로세싱과 멀티 스레딩으로 나뉩니다. Multi-Processing(ProcessBuilder) Multi-Thread Java Multi-Thread Programming Thread 상속 또는 Runnable 구현(Runnable이 함수형 인터페이스로 변경되었기 때문에 Lambda로 작성 가능합니다.) public class App { public static void ..
Cf. 기존에 Java에서 시간과 관련해 제공하던 API Date, GregorianCalendar, SimpleDateFormat 등이 있습니다. Date는 mutable한 특성(인스턴스 내부의 값 변경 가능)때문에 thread-safe하지 못하다는 단점이 있습니다. - 동시성 문제를 명확히 해결하지 않으면 중간에 값이 변경될 가능성이 있습니다. 또한 Date가 time까지 다루는 등 클래스명과 실제 처리하는 데이터가 다른 경우가 있습니다. 이 뿐만 아니라 타입 안정성이 없어 버그가 발생할 여지가 많습니다. 예를 들어, GregorianCalender를 통해 Calendar 인스턴스를 만들 때 '월'은 0부터 시작하는 것을 감안하여 입력해야 합니다. 이러한 특성을 두고 타입안정성이 없다고 합니다. 위와..
Optional이란? Optional은 오직 하나의 값을 가지고 있을 수도 없을 수도 있는 컨테이너라고 할 수 있습니다. Java 8 이전에는 제대로 된 값을 리턴할 수 없을 때 할 수 있는 방법은 두 가지 밖에 없었습니다. 단순히 null을 반환하거나 Exception를 반환하는 것이 전부였습니다. 이 때 null을 반환하는 경우에는 이를 참조하는 코드에서 또 다시 그 값이 null일 수도 있음에 유의해야 한다는 점에서 좋은 코드가 아니며, 에러(Exception)을 발생시키는 방법은 Stack Track을 출력하는 데에 새로운 리소스가 쓰여야 하므로 이 또한 좋은 방법은 아닙니다. Java 8부터는 Optional을 사용해 참조하는 코드에게 명시적으로 빈 값일 수 있음을 알려주고, 빈 값의 경우에 대..
람다식 특징 메서드에 인자로 전달하거나 그 자체로 리턴할 수 있다. 이를 다른 말로는 "함수를 first class object로 사용할 수 있다."고 한다. 람다식 조건 순수 함수(Pure function)여야 한다. - 함수 밖의 값을 변경하지 못한다. 고차 함수(Higher-Order function)여야 한다. - 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다. 인터페이스 Function의 메서드들과 관련(`compose()`, `andThen()` 등) Cf.함수 안에서 함수 밖의 Final이 아닌 변수를 참조하여 값을 변경하는 경우에는 순수 함수라고 볼 수 없다. Java가 기본적으로 제공하는 함수형 인터페이스 🌂 Function 하나의 매개변수를 가진다. R apply(T ..
Integer 클래스의 parseInt로 정수의 기수 변환을 할 수 있다. 이 메서드는 하나의 매개변수의 인자만 전달하여 단순하게 String 형태의 정수를 int 타입으로 변환할 때 많이 사용하게 되는데, 매개변수가 하나일 때는 변환된 10진수 정수가 나오고, 두 번째 매개변수로 기수를 전달할 경우 해당 String형태의 값이 해당 기수로 표현된 값임을 전달해주게 된다. 반환되는 값은 항상 10진수 값이다.두 번째 매개변수인 radix(기수)의 인자로는 10, 2, 8, 16가 들어갈 수 있다. Integer.parseInt(String str, int redix); Integer.parseInt(str, 2); Integer.parseInt(str, 8); Integer.parseInt(str, 16);