
자바 컬렉션을 처음 배우면서 가장 오래 헷갈렸던 게 List, ArrayList, LinkedList의 관계였다.코드를 보면 다들 이렇게 쓰고 있다.그런데 막상 생각해보면 의문이 생긴다.이미 new ArrayList()를 썼는데, 왜 굳이 List로 선언하는 걸까?그리

Deque의 메서드들은 기능은 비슷한데, 실패를 처리하는 방식이 다르다.peek→ “없으면 그냥 알려줘 (null)”get→ “없으면 논리 오류니까 터져야 함”\-> 조회만 하는데도 실패 정책이 다르다⚠️ ArrayDeque에서는 실제로 offer가 false를 반환하

자바를 처음 배울 때 char와 String은 생각보다 빨리 등장한다.문자를 다룬다는 점에서 비슷해 보이지만, 실제로는 완전히 다른 개념이다.문제는 이 둘을 느낌으로만 구분하고 넘어가면, 입력 처리나 문자열 문제에서 계속해서 실수를 반복하게 된다는 점이다.이 글은 과거

자바에서 객체지향을 처음 공부할 때 가장 헷갈렸던 부분이 extends, implements, this, super였다.문법은 외우기 쉬운데, 왜 이런 문법이 필요한지, 언제 써야 하는지가 명확하지 않으면 코드가 계속 꼬인다.이 글은 문법 나열이 아니라, “내가 왜 여

자바에서 객체지향을 공부하다 보면 abstract class와 interface를 거의 동시에 배우게 된다.둘 다 new로 객체를 만들 수 없고, 둘 다 구현되지 않은 메서드를 가질 수 있다 보니 “이 둘은 대체 뭐가 다른 거지?”라는 생각이 자연스럽게 든다.이 글은

자바를 공부할 때 스택과 힙을 많이 들어보았다.하지만 이 두 개념을 정확히 구분해서 설명하지 못하는 경우가 많다.나 역시 한동안 “객체는 힙에 있다”, “변수는 스택에 있다” 같은 표현을 아무 생각 없이 받아들였다가 메서드 호출, 객체 전달, 값 변경이 엇갈리는 순간

자바를 배우다 보면 String은 아주 초반에 등장하지만, 정작 “왜 이렇게 설계됐는지”까지 이해하기는 쉽지 않다. 나도 StringBuilder, String Pool, ==와 equals()이 정확히 어떤 동작을 하는지 이해하지 않고 그냥 썼다. 이 글은 St

String을 배우다 보면 “불변이다”, “hashCode를 캐싱한다”, “HashMap의 key로 안전하다” 같은 말들을 연속으로 듣게 된다.문제는 이 말들이 각각 따로 설명되면 전혀 와닿지 않는다는 것이다.나 역시hashCode는 Map에서만 쓰는 개념 같았고 왜

HashMap을 설명할 때 가장 자주 등장하는 단어가 버킷(bucket)이다.하지만 막상 “버킷이 정확히 뭐냐”고 물으면 명확하게 설명을 못한다.이 글은 HashMap 내부 구조를 bucket → Node 순서로 정리해서, “HashMap이 데이터를 어디에, 어떤 단위

“충돌이 많아지면 Tree로 바뀐다”하지만 이 문장은 너무 많은 걸 생략한다.충돌이 정확히 뭔지“많다”는 기준이 뭔지왜 LinkedList로는 부족한지왜 아무 때나 Tree로 안 바꾸는지이 글에서는 HashMap 소스 코드에 실제로 등장하는 상수와 주석을 기반으로, 충

HashMap을 공부하다 보면 마주치는 숫자가 있다.한 버킷(bin)에 노드가 8개 이상이면 LinkedList 대신 TreeNode(레드-블랙 트리)로 전환한다는 뜻이다.그런데 여기서 가장 중요한 질문은 이것이다.왜 하필 8일까?6은 안 되고, 10은 안 되는 걸까?

제네릭은 타입을 클래스 설계 시점이 아니라 사용 시점에 결정하여, 컴파일 타임에 타입 안전성을 보장하는 문법이다.제네릭이 등장하기 전, 자바는 모든 객체를 Object로 다뤘다.잘못된 타입을 넣어도 컴파일러가 막지 못한다.값을 꺼낼 때마다 강제 형변환이 필요하다.형변환

Set은 자바 컬렉션 프레임워크에서 중복을 허용하지 않는 자료구조다.같은 값을 두 번 추가해도 하나만 저장된다.핵심은 값의 유일성(uniqueness) 이다.Set은 List와 다르게 인덱스를 제공하지 않는다.따라서 특정 위치의 요소에 접근하는 방식은 존재하지 않는다.

1. HashSet 기본 사용법 1-1. 선언과 생성 HashSet은 보통 인터페이스 타입인 Set으로 선언한다. Set은 인터페이스 HashSet은 구현체 2. 요소 추가: add() 2-1. 기본 사용 실행 결과: 중복 값(10)은 한 번만 저장된다.

Iterator는 컬렉션(Collection)의 요소를 하나씩 순차적으로 접근하기 위한 인터페이스다.조금 더 정확히 말하면,Iterator는 “컬렉션 내부를 순회(traverse)하기 위한 표준 방식”이다.여기서 중요한 점은 인덱스를 사용하지 않는다는 것이다.배열은 인

자바 실행은 다음과 같은 단계를 거친다.자바는 단순한 컴파일 언어가 아니다.소스는 바이트코드로 컴파일된다.실행은 JVM이 담당한다.반복되는 코드는 JIT가 기계어로 재컴파일한다.javac는 다음을 수행한다.문법 검사타입 검사심볼 참조 해결바이트코드 생성결과는 .clas

기본 문법 타입... 은 내부적으로 배열로 처리된다. 즉, int... nums는 int[] nums와 동일하게 동작한다. 예제 1 - 기본 사용 예제 2 - 일반 매개변수와 혼합 가변길이 매개변수는 반드시 마지막에 위치해야 한다. 예제 3 - 배열과의 관계

1. Package란? 클래스를 논리적으로 묶는 단위이자 파일 시스템의 디렉토리 구조와 1:1로 대응된다. 선언은 파일의 첫 번째 줄에 위치해야 한다. 2. Import란? 다른 패키지에 있는 클래스를 현재 파일에서 쓸 수 있도록 참조하는 선언이다. import

기존 클래스(부모)의 필드와 메서드를 자식 클래스가 물려받는 것이다.extends 키워드로 선언하며, 자바는 단일 상속만 지원한다.상속이 의미 있으려면 IS-A 관계가 성립해야 한다.Engineer IS-A Employee Manager IS-A Employee자바의

Object 클래스에 정의된 메서드로, GC(Garbage Collector)가 객체를 메모리에서 제거하기 직전에 호출되도록 설계된 메서드다.즉, 개발자가 이 메서드를 오버라이딩해두면 "객체가 사라지기 전에 이 코드를 실행해줘" 라는 의도로 만들어진 것이다.GC는 JV

예외는 클래스 상속 계층으로 설계되어 있다 Throwable 계층 구조 주요 Exception 목록 | Exception | 설명 | 종류 | |-----------|------|------| | ArrayIndexOutOfBoundsException | 배열의

접근 제한자란 > 멤버(필드, 메서드, 생성자) 또는 클래스에 대한 접근 범위를 컴파일 타임에 제한하는 키워드. 객체지향의 캡슐화(Encapsulation) 핵심은 "외부에서 직접 건드리면 안 되는 것을 막는 것"이다. 접근 제한자가 그 수단이다. 종류와 범위
다형성을 이해하기 전에 이 세가지를 먼저 알아야 한다. 업캐스팅 (Upcasting) > 자식 타입을 부모 타입으로 변환하는 것. 힙에 있는 객체는 Agumon 인스턴스 그대로다. 바뀌는 건 참조 변수의 타입뿐이다. 객체가 바뀌는 게 아니라 "어떤 창문으로

다형성이란 > 하나의 타입으로 여러 형태의 객체를 다루는 것. 다형성은 업캐스팅과 오버라이딩이 합쳐진 결과다. 업캐스팅 → 부모 타입 하나로 여러 자식 객체를 다룰 수 있게 해줌 오버라이딩 → 같은 메서드 호출인데 실제 객체마다 다른 동작을 하게 해줌 동적 바인딩

컬렉션 프레임워크 구조 Collection은 최상위 인터페이스다. List, Set, Queue가 이걸 상속받는다. 인터페이스끼리는 extends를 쓴다. implements는 클래스가 인터페이스를 구현할 때만 쓴다. List란 > 순서가 있고, 중복을 허용하는

스레드란? 프로그램이 실행되면 OS는 그 프로그램에 프로세스(Process) 를 하나 할당한다. 프로세스는 독립된 메모리 공간(Code, Data, Heap, Stack)을 가지는 실행 단위다. 기본적으로 프로세스 하나는 명령을 순서대로 하나씩 실행한다. 문제는 D

Race Condition (경쟁 조건) 여러 스레드가 같은 Heap 메모리(공유 자원)에 동시에 접근하면 문제가 생긴다. 기대값은 20000이지만 실행할 때마다 다른 값이 나온다. count++는 사실 3단계다. 이 3단계 사이에 컨텍스트 스위칭이 일어나면:

Java의 스레드는 6가지 상태를 가진다. Thread.State enum으로 정의되어 있다. NEW Thread 객체가 힙에 생성됐지만 아직 start()가 호출되지 않은 상태다. JVM은 알고 있지만 OS는 아직 이 스레드의 존재를 모른다. RUNNABLE

스레드 제어 메서드는 3가지다. sleep() 호출한 스레드만 잠든다 락을 유지한 채로 잠든다 시간이 지나면 자동으로 RUNNABLE join() t1.join()을 호출한 스레드가 WAITING이 된다 t1이 종료되면 자동으로 RUNNABLE interru

왜 스레드 풀이 필요한가? 매번 new Thread()로 스레드를 생성하면 두 가지 문제가 있다. 문제 1: 스레드 생성/소멸 비용 스레드 생성/소멸은 OS 레벨 작업이라 비용이 크다. 문제 2: 스레드 수 제어 불가 요청이 폭발하면 스레드가 무한정 생성돼서