Dev Study/Java 10

[JAVA & Antigravity] Exception 예외 정리: Try-catch, throws, Exception 커스텀

자바 프로그래밍에서 예외(Exception)는 피해야 할 대상이 아니라, 프로그램이 맞닥뜨린 '정상적이지 않은 상황'에 대한 가장 명확한 소통 방식입니다.흔히 에러가 발생하면 무조건 피하거나 덮어두려는 경향이 있지만, 이는 오히려 시스템의 안정성을 해치는 가장 큰 폭탄을 안고 가는 것과 같습니다.이 글에서는 예외의 통제권이 어떻게 이동하는지와, 개발자가 예외를 대하는 올바른 설계적 고찰에 대해 정리합니다.1. Bad Code: 예외를 삼키는 침묵의 암살자가장 치명적인 설계 결함은 에러가 발생했음에도 불구하고, 이를 아무렇지 않게 넘겨버리는 코드입니다.이러한 패턴을 '예외 먹어버리기(Swallowing Exception)'라고 부르며, 추후 버그의 원인을 찾을 수 없게 만듭니다.// Bad Code: 예외..

Dev Study/Java 2026.03.07

Java ArrayList와 HashMap 완벽 정리: VS Code 디버깅으로 보는 내부 동작

Java로 실무 비즈니스 로직을 다루다 보면, 데이터의 개수가 가변적인 상황을 필연적으로 마주하게 된다. 배열(Array)처럼 고정된 크기의 그릇으로는 사용자 수나 주문량이 폭증하는 동적인 환경에 유연하게 대처하기 어렵다.오늘은 Java Collections Framework가 어떻게 이 '크기의 제약'을 우아하게 해결하는지, 그리고 실무에서 가장 빈번하게 쓰이는 ArrayList와 HashMap의 내부 동작 원리를 파헤쳐 본다. Environment: Windows 11, JDK 21, VS Code, Antigravity1. 고정된 크기가 불러오는 재앙 (Bad Code)신입 개발자가 흔히 저지르는 실수 중 하나는 "학생 수는 대략 30명이니까 30개짜리 배열을 만들면 되겠지?"라고 단정 짓는 것이다..

Dev Study/Java 2026.02.09

[JAVA & Antigravity] 인터페이스: 강한 결합을 끊고 유연함을 얻다

개발을 하다 보면 "나중에 이 모듈이 바뀔 수도 있다"는 불안감을 마주한다. 특정 기술이나 라이브러리에 의존하는 코드를 작성했다가, 요구사항 변경으로 인해 코드 전체를 뒤엎어야 했던 경험은 누구에게나 있다. 이 문제를 해결하기 위해 자바는 인터페이스라는 강력한 규격 시스템을 제공한다. 인터페이스가 해결하려는 문제와 그 진화 과정, 그리고 다형성을 통한 설계의 유연성에 대해 정리한다.1. 문제 상황: 구체적인 것에 의존하다온라인 쇼핑몰의 결제 시스템을 개발한다고 가정한다. 초기 요구사항은 '신용카드' 결제만 지원하는 것이었다. 개발자는 별다른 고민 없이 CreditCard 클래스를 만들고, 주문 로직에서 이를 직접 가져다 썼다.// 구체 클래스public class CreditCard { public..

Dev Study/Java 2026.02.05

[Java] 제네릭의 역설: 유연할수록 아무것도 담을 수 없다

Java 제네릭: "이 바구니에는 사과를 담을 수 없습니다"1. 들어가며자바 제네릭을 공부하다 보면 가장 당혹스러운 순간이 찾아옵니다. "분명히 과일 바구니라고 선언했는데, 왜 사과를 못 담게 하지?"이 글은 ? extends T라는 외계어 같은 문법 뒤에 숨겨진, 자바 컴파일러의 "안전 과민증"에 대한 이야기입니다.2. 환경IDE: VS CodeJDK: Java 17Phase 1. 상식의 배신 (왜 사과 바구니는 과일 바구니가 아닐까?)현실 세계에서 "사과는 과일이다"는 참입니다. 그래서 친구가 "과일 좀 담아올 바구니 줘"라고 했을 때, 집에 있던 "사과 바구니"를 줘도 아무 문제가 없습니다. 어쨌든 과일을 담을 수 있으니까요.하지만 자바는 아주 고지식합니다. 자바에게 사과 바구니(List)와 과일 ..

Dev Study/Java 2026.01.28

[Java] 다형성과 추상 클래스: if문의 늪에서 탈출하기

반복되는 instanceof 검사를 없애고, 확장 가능한 코드를 만드는 법Date: 2026-01-21Environment: Windows 11, VS Code, JDK 17Topic: Polymorphism, Abstract Class, Dynamic BindingPhase 1: 리모컨이 너무 많아 (Bad Code)최신 스마트 홈 시스템을 개발한다고 가정해보자. TV, 에어컨, 공기청정기 등 수많은 가전제품(Device)을 한 번에 제어해야 한다. 하지만 다형성을 모르는 개발자는 제품마다 제각각인 메서드 이름을 사용한다.// 규격이 없는 혼란스러운 상태class TV { void turnOnTV() { System.out.println("TV 켜짐"); }}class AirCon { voi..

Dev Study/Java 2026.01.21

[Java] 책임은 누구에게 있는가: 상속과 super의 본질

Date: 2026-01-21Environment: Windows 11, VS Code, JDK 17Topic: Java Inheritance, super, Object InitializationPhase 1: 파편화된 책임 (Bad Code)쇼핑몰 시스템을 만든다고 가정해보자. 도서(Book), 앨범(Album), 영화(Movie) 등 다양한 상품이 존재한다. 상속 개념 없이 각각의 클래스를 만들면 다음과 같은 비효율의 지옥이 시작된다.// 유지보수의 악몽: 가격 정책 하나 바꾸려면 3개 파일을 다 열어야 한다.class Book { String name; int price; String author; // Book만의 특징}class Album { String name; // 중..

Dev Study/Java 2026.01.21

[Java] 객체지향 설계와 메모리 구조: 싱글턴, 빌더 패턴, 그리고 불변성

접근 제어자부터 메모리 구조까지, 견고한 서버를 지탱하는 설계 원칙Environment: Windows 11, VS Code, Antigravity, JDK 171. 파편화된 데이터 관리의 위험성게임 서버를 개발한다고 가정해보자. 유저의 HP나 레벨 같은 민감한 데이터가 보호받지 못하고 있다면 어떤 일이 벌어질까? 누구나 public 변수에 접근해 값을 조작할 수 있다면, 이는 버그가 아니라 보안 사고다.Open Field (Bad Case)아래 코드는 모든 필드가 public으로 열려 있어 무결성이 깨지기 쉬운 상태다.public class GameCharacter { public String name; public int hp; public int level;}// 사용부: 누구나 데..

Dev Study/Java 2026.01.15

[Java] 절차지향의 한계와 객체지향의 필요성

목표자바의 문법적 요소(Class, Constructor, Static)가 왜 만들어졌는지 코드를 통해 역추적한다. 불편한 코드를 먼저 작성해보고, 이를 개선하는 과정에서 자연스럽게 객체지향의 필요성을 납득하는 것이 목표다.1. 데이터가 따로 노는 문제 (Class의 필요성)쇼핑몰에서 상품 정보를 관리하는 기능을 구현한다고 가정해보자. 클래스를 배우기 전에는 보통 데이터를 배열에 담아서 관리했다.Before: 배열을 이용한 관리public class ShopMain { public static void main(String[] args) { // 상품 이름과 가격을 각각 다른 배열에 저장 String[] productNames = {"Laptop", "Mouse", "Key..

Dev Study/Java 2026.01.12

[Java] 자바 배열 정리: 메모리 구조, 깊은 복사, 2차원 배열

자바 배열 학습 내용 중 핵심인 메모리 구조, 복사(Shallow vs Deep), 2차원 배열에 대해 정리함.1. 목표 (Goal)자바 배열의 Memory 구조(Stack vs Heap)를 이해한다.얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)의 차이를 명확히 구분한다.2차원 배열의 선언 방식과 메모리 적재 형태를 파악한다.2. 환경 (Environment)OS: Windows 11JDK: OpenJDK 17IDE: VS Code3. 개념 및 코드 분석1) 배열의 메모리 구조자바에서 배열은 참조 타입(Reference Type)임. 변수 자체는 Stack 영역에 생성되지만, 실제 데이터가 담긴 배열 객체는 Heap 영역에 생성됨.int[] arr = new int[] { 10, 2..

Dev Study/Java 2026.01.09

[Java] 변수, 연산자, 그리고 제어문

목표: Java의 변수 작명 규칙, 데이터 타입 변환(Casting), 연산자, 그리고 제어문(조건문/반복문)의 동작 원리를 이해하고 코드로 검증한다. 환경 (Environment)OS: Windows 11JDK: Oracle JDK 17IDE: VS Code (Extension Pack for Java) 1. 변수 (Variable)1-1. 작명 규칙 (Naming Convention)Java는 변수명 작성 시 엄격한 규칙과 관례를 따른다. 특히 camelCase(합성어의 두 번째 단어 첫 글자 대문자) 사용이 일반적이다.가능: age, Age (대소문자 구분), age123, $age, age_123불가능: 123age (숫자 시작 불가), int (예약어 불가)비권장: 나이 (한글 사용 가능하나 지..

Dev Study/Java 2026.01.06