숑숑이의 개발일기
article thumbnail
[JAVA] HashMap이란? 해시충돌(Hash Collision) 발생시 자바는 어떻게 대처할까?
Backend/JAVA 2024. 2. 7. 02:22

HashMap HashMap은 Map의 대표적인 구현 클래스로, Key값의 중복을 허용하지 않는다. Map의 구조인 key-value쌍으로 구성되어 있는것이 특징이다. 즉, 두 Key 객체의 hashCode()값이 같고, equals() 메서드가 true를 반환한다면 같은 객체로 인식한다. HashMap은 입출력 순서가 동일하지 않을 수 있고 초기 저장 용량의 기본값은 16이다. 원소의 개수가 16개가 넘어갈 경우 자동으로 늘어난다. 일정 사이즈가 넘어가면 자동으로 TreeMap으로 변환된다. static final int TREEIFY_THRESHOLD = 8; static final int UNTREEIFY_THRESHOLD = 6; list 형태를 사용하지 않고 HashMap을 사용하는 이유는 성능..

article thumbnail
[JAVA] ArrayList와 LinkedList의 차이점은?
Backend/JAVA 2024. 2. 5. 02:35

ArrayList ArrayList는 대표적인 List 구현 클래스로, List가 지니고 있는 대표적인 특징인 데이터를 인덱스로 관리하는 기능과 저장 공간을 동적으로 관리하는 기능 등을 그대로 지니고 있다. 조회 각 데이터의 index를 가지고 있고 무작위 접근이 가능하기 때문에, 해당 index의 데이터를 한 번에 가져올 수 있다. 삽입 List의 크기를 삽입될 자료만큼 늘리는 연산을 수행한다. 삽입될 자료의 위치를 기준으로 기존의 데이터들을 이동하는 연산을 수행한다. 해당 위치에 자료를 입력한 후 삽입연산을 마친다. 삭제 삭제될 자료가 위치한 인덱스의 자료를 삭제한다. 삭제한 자료의 인덱스를 기준으로 이후의 자료들을 이동하는 연산을 수행한다. List의 맨 마지막 인덱스는 비어있는 상태로 연산을 마친..

[JAVA] Java Generic의 공변, 반공변, 무공변
Backend/JAVA 2024. 2. 2. 04:24

자바에서 우리가 가장 쉽게 접하고 있는 제너릭의 예시는 List가 있다. 아래는 List 내부 구현 코드이다. public interface List extends Collection { boolean add(E e); E get(int index); /***/ } List는 제네릭을 활용하므로, 우리는 다양한 타입의 List를 선언할 수 있다. 또한, List에 잘못된 타입의 값을 추가하는 경우 컴파일 타임에 예방을 해준다. // 다양한 타입의 List 선언가능 List messages = new ArrayList(); List users = new ArrayList(); // 잘못된 타입의 값을 컴파일 에러를 통해 예방 List codes = new ArrayList(); codes.add("1");..

[JAVA] 불변 객체(Immutable Object)란?
Backend/JAVA 2024. 2. 1. 14:47

불변 객체(Immutable Object)란? 객체 지향 프로그래밍에 있어서 불변객체는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다. 그렇기에 생성이후 신뢰할 수 있는 객체가 된다. 대표적인 불변객체로는 Boolean, Integer, String, BigDecimal.. 이 존재한다. 불변이라는 키워드를 놓고 보면 final이라는 예악어가 생각날 수 있는데, 단순히 final을 사용한다고 해서 불변객체를 만드는 것이 아니다. final 예약어를 사용시 각 효과는 아래와 같다. 변수 : 값을 수정할 수 없는 상수로 만들어줌 메소드 : Overriding을 할 수 없음 클래스 : 상속이 불가능 함 즉, 객체 선언시 final을 사용한다고 하더라도 객체 내부상태는 변경할 수 있다. 불변 객체 장점 Thr..

[JAVA] 스레드에서의 경쟁상태(Race condition)
Backend/JAVA 2024. 1. 30. 04:23

Race condition이란? 임계영역(critical section: 공유 메모리에 접근하는 프로그램의 일부)이 두 개 이상의 스레드에 의해 동시에 실행되는 조건으로 정의할 수 있다. 다르게 말해 특정 공유 리소스를 얻기 위해 두개 이상의 스레드가 함께 경쟁하는 조건으로 정의.(동시성 버그, deadlock과 밀접한 연관이 있음) 이는 프로그램의 잘못된 동작으로 이어진다. 예시코드 3개의 쓰레드가 공유하는 변수 c의 값을 조정한다. public class Counter implements Runnable { private int c = 0; public void increment() { try { Thread.sleep(10); } catch (InterruptedException e) { //Aut..

article thumbnail
[JAVA] 쓰레드(Thread)란? Java의 동기화 기능은 무엇일까?
Backend/JAVA 2024. 1. 25. 01:19

프로그램과 프로세스 쓰레드의 개념을 명확히 알기 위해서는 우선 컴퓨터의 구조를 이해할 필요가 있다. 컴퓨터를 이루는 주요 구성 요소에는 중앙 처리 장치(CPU), 메모리(memory), 하드디스크(hard disk)가 있다. CPU는 연산을 수행해 실제 프로그램을 실행하는 장치이고, 가장 빠른 속도로 동작한다. 프로그램은 하드디스크에 저장된 파일들의 모임, 프로세스는 메모리상에 로딩된 프로그램을 의미한다. 메모리는 그때그때 필요한 부분만을 동적으로 로딩한다. 쓰레드(Thread)란? 오직 프로세스만 CPU를 사용할 수 있다. 프로세스를 구성하는 작업의 한 단위로 다르게 말해 쓰레드는 CPU를 사용하는 최소 단위라고도 말할 수 있다. 싱글스레드 프로세스: 프로세스 내에서 단 하나의 스레드만 작업 멀티스레드..

article thumbnail
[JAVA] iterator와 iterable의 차이는 무엇일까?
Backend/JAVA 2024. 1. 24. 01:51

Iterator란? Iterator 인터페이스는 Collection과는 별개로 존재하는 인터페이스이다. java 1.2에서 발표된 인터페이스로 Java.util 패키지에 속해있으며 Java Collections Framework의 멤버다. Collection에 저장된 요소를 읽어오는 것을 표준화 한 인터페이스이다. Iterator 인터페이스 내부 메서드 hasNext() 다음 요소를 가지고 있으면 true 반환 next() 다음 요소를 반환 remove() 해당 iterator로 반환된 요소를 제거 forEachRemaining() 예외가 throw 될 때까지 각 나머지 요소에 대해 작업 수행 Iterable이란? Collection의 상위 인터페이스로(=모든 컬렉션은 Iterable 인터페이스를 구현한..

article thumbnail
[JAVA] Stream API란? Java Stream API의 특징은?
Backend/JAVA 2024. 1. 19. 01:10

스트림(Stream) API란? 스트림 API는 람다식(Lambda Expression)을 이용한 기술 중 하나로 데이터 소스(컬렉션, 배열, 난수, 파일 등..)를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 인터페이스를 의미한다. 스트림을 사용하기 위해서는 Java 1.8 이상의 버전을 사용해야 한다. 해당 인터페이스는 java.util.stream에 포함되어 있다. 람다식이란? 함수를 하나의 식으로 표현한 함수형 인터페이스. 함수를 람다식으로 표현하면 메소드의 이름이 없기 때문에 익명 함수(Anonymous Function)의 한 종류라고도 한다. 스트림(Stream) API의 특징 1. Stream은 원본의 데이터를 변경하지 않는다. Stream API는 원본 데이터를 조회하여 별도의 Str..

article thumbnail
[JAVA] JVM의 메모리 구조
Backend/JAVA 2024. 1. 17. 06:57

JVM이란? JVM은 JAVA Virtual Machine(자바 가상 머신)의 약자로, 자바 바이트 코드를 실행할 수 있는 주체이다. 자바 바이트 코드는 운영체제(OS)에 독립적이며 모든 JVM은 규격에 정의된 대로 자바 바이트 코드를 실행한다. 또한, JVM은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행한다. JVM의 동작 방식 자바 프로그램 실행시 동작 방식은 아래의 사진을 참고한다. 1) JVM이 OS로 부터 메모리를 할당받는다. 2) 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트 코드(.class)로 컴파일 한다 3) Class Loader는 동적 로딩을 통해 클래스들을 로딩 및 링크 하여 Runtime Data Area(실질적인 메모리를 할당..

[Java] #19.3 자바 입출력 - char 단위 입출력
Backend/JAVA 2023. 8. 15. 18:44

본글은 'Do it 자바 완전 정복' 책을 통한 공부내용을 정리한 글입니다. 앞에서 알아본 byte 단위의 입출력만으로도 파일, 콘솔, 네트워크 전송까지 전혀 문제 없이 입출력을 수행할 수 있지만, 실제 입출력에서 가장 많이 사용되는 데이터는 단연 문자열이다. 대표적으로 채팅 프로그램이 있다. char 단위의 입출력은 문자열 입출력을 위해 특화된 기법으로, char 단위로 입출력을 수행하는 기본 클래스는 Reader와 Writer 추상 클래스다. Reader와 Writer 상속 구조 Reader 클래스의 자식 클래스에는 FileReader, BufferedReader, InputStreamReader가 있다. Writer의 자식 클래스에는 FileWriter, BufferedWriter, OutputSt..