✏️ 개요 동시성 문제 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라고 한다. 스프링 빈처럼 싱글톤 객체의 필드를 변경하여 사용할 때, 이러한 동시성 문제를 조심해야 한다. 동시성 문제는 지역 변수에서는 발생하지 않는다. 지역 변수는 쓰레드마다 각기 다른 메모리 영역이 할당된다. 동시성 문제가 발생하는 곳은 같은 인스턴스의 필드, 또는 static 같은 공용필드에 접근할 때 발생한다. ThreadLocal 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다. 즉, 각 쓰레드마다 별도의 내부 저장소를 제공한다. 자바는 언어차원에서 쓰레드 로컬을 지원하기 위한 java.lang.ThreadLocal 클래스를 지원한다. 📌 사용법 값 저장: ThreadLocal.s..
✏️ Heap 개요 heap은 최솟값 또는 최댓값을 빠르게 찾아내기 위해 완전이진트리 형태로 만들어진 자료구조이다. 이진트리(binary tree)란 모든 노드의 최대 차수를 2로 제한한 것이다. 완전이진트리(complete binary tree)란 마지막 레벨을 제외한 모든 노드가 채워져있으면서 모든 노드가 왼쪽부터 채워져있어야 한다. 마지막 레벨을 제외한 모든 노드가 채워져있어야 한다. 모든 노드들은 왼쪽부터 채워져있어야 한다. 포화이진트리(perfect binary tree)란 마지막 레벨을 제외한 모든 노드는 두 개의 자식노드를 갖는다라는 조건을 가진다. 🔎 Heap 특징 Heap의 핵심 특징은 부모 노드가 항상 자식 노드보다 우선순위가 높다는 것이다. 즉, 모든 요소들을 고려하여 우선순위를 정할..
✏️ 개요 자바 프로그램이 실행되면, JVM은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리한다. JVM의 메모리 공간은 크게 정적 영역(Static or Method), 스택 영역, 힙 영역으로 구분되고, 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당되게 된다. 컴퓨터의 메모리는 사용할 수 있는 공간이 한정되어 있다. 따라서 메모리 설계가 잘되어있는 프로그램에 비해 그렇지 않은 프로그램은 속도 저하 현상이나 튕김 등의 현상이 일어날 확률이 크다. 그래서 자바 애플리케이션에서 메모리를 효율적으로 사용하기 위한 메모리 구조와 특징에 대한 이해가 필요한 것이다. 🔎 JVM 구동 방식 자바 컴파일러에 의해 자바 파일이 클래스 파일(바이트 코드)로 컴파일된다. 클래스 ..
✏️ 개요 Comparator는 두 매개변수 객체를 비교하는 것이고, Comparable은 자기 자신과 매개변수 객체를 비교하는 것이다. Comparable: 기본 정렬기준을 구현하는데 사용 Comparator: 기본 정렬 기준외에 다른 기준으로 정렬하고자 할 때 사용 📌 정리 결론은 둘다 정렬의 기준을 위해 사용되지만 Comparable은 자기 자신과 파라미터로 들어오는 객체를 비교하는 것 Comparator는 자기 자신의 상태가 어떻던 상관없이 파라미터로 들어오는 두 객체를 비교하는 것 즉, 비교한다는 것은 같지만 비교 대상이 다르다. 인용 https://dding9code.tistory.com/68 Comparator 와 Comparable - JAVA 처음 이 개념을 접했을 때는 뭐지.. 인터페이..
✏️ 함수형 인터페이스 함수형 인터페이스란 하나의 추상 메서드를 갖는 인터페이스를 말한다. 자바 8 이후부터는 함수형 인터페이스를 나타내는 @FuncionalInterface 내장 애노테이션을 사용할 수 있다. 이 애노테이션은 컴파일 타임에 해당 인터페이스가 함수형 인터페이스가 맞는지 검사할 때, 유용하게 사용할 수 있다. 함수형 인터페이스에는 하나의 추상 메서드 외에도 여러 개의 디폴트 메서드나 정적 메서드가 있을 수 있다. 예외적으로 java.lang.Object 클래스에 선언된 public 메서드를 오버라이딩하는 메서드는 인터페이스의 추상 메서드에 포함시키지 않는다. @FunctionalInterface interface MyFunctionalInterface { void foo(); default..
타입 매개변수명 작성 규칙 E - Element K - Key N - Number T - Type V - Value S, U, V 등 - 2번째, 3번째, 4번째 타입 Generic Method 제네릭 메서드는 제네릭 클래스가 아닌 일반 클래스에서도 정의할 수 있다. 타입 매개변수는 반환형 앞에 적어야 하며, 이를 반환형으로 사용할 수도 있다. Class Java { public static void printAll(T[] arr) { for (T t : arr) { System.out.println(t); } } public static void main(String[] args) { Integer[] numbers = {1,2,3}; String[] strings = {"일","이","삼"}; pri..
확장함수 기존 자바 코드위에 자연스럽게 코틀린 코드를 추가한다는 개념에서 출발 자바로 만들어진 라이브러리를 유지보수 및 확장할 때, 코틀린 코드를 덧붙인다. 따라서 어떤 클래스안에 있는 메서드처럼 호출할 수 있지만, 함수는 밖에 만들 수 있게 한다. 확장함수는 클래스에 있는 private 또는 protected 멤버를 가지고 올 수 없다. 멤버함수와 확장함수의 시그니처가 같으면, 멤버함수가 우선적으로 호출된다. 즉, 확장함수를 만들었지만, 다른 기능을 하는 똑같은 시그니처의 멤버함수가 생기면 오류가 발생할 수 있다. fun String.lastChar(): Char { return this[this.length - 1] } fun: 이건 함수라는 의미 String. : String 클래스를 확장한다는 의..
배열 array.indices는 0부터 마지막 index까지의 range이다. withIndex()를 사용하면, 인덱스와 값을 한번에 가져올 수 있다. array.plus()를 이용하면, 값을 쉽게 넣을 수도 있다. val arr = arrayOf(100, 200) arr.plus(300) // 배열에 새로운 element 추가 // 방법 1 for (i in arr.indices) { println("$i ${arr[i]}") } // 방법 2 for ((idx, value) in arr.withIndex()) { println("$idx $value") } Collection - List, Set, Map 컬렉션을 만들어줄 때, 불변인지 혹은 가변인지를 설정해야 한다. 가변(Mutable) 컬렉션: ..
Enum 열거형. 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성하고 그 중 하나의 상태를 선택해 나타내는 방식이다. 특징 enum class 안에는 상수를 나타내는 대문자로 나타낸다. enum 객체들은 고유한 속성을 가질 수 있다. 일반 클래스처럼 함수 선언도 가능하다. enum class Color (val red: Int, val green: Int, val blue: Int) { RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255);