오버로딩과 오버라이딩, 이름은 비슷한데 뭐가 다를까?Java를 공부하다 보면 오버로딩(Overloading) 과 오버라이딩(Overriding) 이 거의 항상 함께 등장합니다. 이름도 비슷하고 둘 다 메서드와 관련된 개념이라서 초보 단계에서는 쉽게 헷갈립니다.하지만 두 개념은 목적부터 다릅니다.오버로딩: 같은 이름의 메서드를 여러 방식으로 제공하는 것오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 다시 정의하는 것이번 글에서는 두 개념의 차이를 정의 → 예제 → 비교 → 실무 포인트 흐름으로 깔끔하게 정리해보겠습니다.1. 오버로딩(Overloading)이란?오버로딩은 메서드 이름은 같지만 파라미터가 다른 메서드를 여러 개 정의하는 것입니다.즉, 같은 기능을 비슷한 이름으로 묶어두고 입력값 형태에 따라..
"모든 예외를 catch로 잡으면 안전하다"는 착각코드가 어디선가 터질까 불안해서, 넓은 범위의 catch(Exception e)로 모든 것을 감싸버리는 것입니다. 이렇게 하면 컴파일 에러는 사라지고 프로그램이 중단되지 않으니 "안전하다"고 느낍니다. 하지만 이것은 화재경보기를 꺼놓고 "조용하니 안전하다"고 말하는 것과 같습니다.자바는 예외 처리를 우연에 맡기지 않습니다. Throwable 계층 구조를 통해 "이 문제는 복구할 수 있는가, 없는가"를 설계 레벨에서 분류해 놓았습니다. 이 분류를 이해하면, 어떤 예외를 잡아야 하고 어떤 예외는 잡지 말아야 하는지가 명확해집니다.1. Throwable 계층 구조: 자바 예외 시스템의 전체 지도자바에서 프로그램 실행 중 발생하는 모든 문제는 Throwable ..
"복사했는데 원본이 바뀌었습니다"분명 객체를 복사해서 복사본만 수정했는데, 원본 객체의 값까지 함께 바뀌는 현상입니다. 디버깅이 어렵고, 원인을 모르면 반복적으로 발생합니다. 문제의 근본 원인은 자바가 객체를 다루는 방식 — 참조(Reference)에 대한 이해 부족입니다.이 글에서는 자바 메모리 모델에서 참조가 어떻게 동작하는지부터 시작하여, 얕은 복사와 깊은 복사의 차이를 명확하게 설명하겠습니다.1. 자바의 참조(Reference) 이해하기복사 이야기를 시작하기 전에, 자바에서 변수가 객체를 어떻게 가리키는지 반드시 알아야 합니다. 이 개념을 건너뛰면 얕은 복사와 깊은 복사의 차이를 직관적으로 이해하기 어렵습니다.1-1. 기본 타입 vs 참조 타입자바의 변수는 두 종류로 나뉩니다.기본 타입은 값 자체..
클래스의 본질은 "현실의 개념을 상태와 행위로 모델링하고, 그 내부를 보호하는 캡슐"입니다.이 글에서는 자바 클래스의 문법 요소 하나하나를 단순 암기가 아닌 설계 관점에서 설명하겠습니다."이 문법이 왜 존재하는가"를 이해하면, 코드를 작성할 때 더 나은 판단을 내릴 수 있습니다.1. 클래스와 객체: 설계도와 실체의 관계객체 지향 프로그래밍의 출발점은 클래스와 객체의 관계를 정확히 이해하는 것입니다. 이 관계를 명확히 잡아야 이후의 모든 문법이 자연스럽게 연결됩니다.1-1. 클래스: 설계도클래스는 "이런 종류의 것은 이런 상태를 갖고, 이런 행위를 할 수 있다"고 정의하는 틀입니다.클래스 자체는 메모리에 실체를 만들지 않습니다. 건축의 도면이 집 그 자체가 아닌 것과 같습니다. 📄 클래스 정의 — 기본 ..
"둘 다 구현 못 하는 거 아닌가요?""추상 클래스와 인터페이스의 차이가 뭔가요?"라고 물으면, 대부분 이렇게 답합니다."추상 클래스는 일부 구현이 가능하고, 인터페이스는 구현이 없는 것 아닌가요?" 틀린 말은 아니지만, 이 대답은문법 수준의 차이만 설명할 뿐 설계 의도의 차이를 전혀 담고 있지 않습니다.이 글에서는 문법 차이를 넘어, 두 개념이 객체지향 설계에서 어떤 역할을 하고, 어떤 사고방식으로 선택해야 하는지를 하나씩 짚어 보겠습니다. 1. 추상 클래스 "is-a" vs 인터페이스 "can-do"1-1. 추상 클래스: "너는 ~이다" (is-a)추상 클래스의 본질은 분류(classification) 입니다. "이 객체가 본질적으로 무엇인가?"를 정의합니다.예를 들어, Dog, Cat, Bird는 ..

