상속은 객체지향의 중요한 특징 중 하나이다. 하지만 언어에 따라 상속을 지원하는 방식이 다르며, 잘못 설계하면 심각한 문제가 발생할 수 있다. 심각한 문제 중 대표적인 것이 바로 다이아몬드 문제(Diamond Problem)이다. 다이아몬드 문제란?"다이아몬드 문제"는 다중 상속(Multiple Inheritance)을 지원하는 언어에서 발생하는 모호성 문제이다.예시 Animal / \ Dog Cat \ / HybridHybrid 클래스가 Dog, Cat을 동시에 상속한다.Dog와 Cat은 모두 Animal을 상속한다.이제 Hybrid 객체에서 Animal의 메서드를 호출하면?Dog를 통해 상속된 것인지Cat을 통해 상속된 것인지모호해진다. → 컴파일러/런..
앞 글(다형성 기초)에서 다형성의 기초를 다뤘다. 이번 글에서는 왜 다형성을 활용해야 하는지, 그리고 추상 클래스, 인터페이스를 통해 어떻게 실무적인 제약과 확장을 설계할 수 있는지 정리한다. 다형성 활용 전: 중복 코드의 문제동물 울음소리를 출력하는 프로그램을 작성한다고 해보자.public class Dog { public void sound() { System.out.println("멍멍"); } } public class Cat { public void sound() { System.out.println("냐옹"); } } public class Caw { public void sound() { System.out.println("음매"); } } public class A..
객체지향 프로그래밍의 3대 특징은 캡슐화, 상속, 다형성이다. 그중 다형성은 흔히 "객체지향의 꽃"이라 불린다. 이유는, 다형성을 이해하고 활용할 줄 알면 코드의 유연성, 확장성, 재사용성이 극대화되기 때문이다. 이번 글에서는 다형성의 핵심인 다형적 참조와 메서드 오버라이딩을 중심으로 정리해보겠다. 다형성의 시작다형성(Polymorphism) = "여러 형태"하나의 객체가 여러 타입으로 참조될 수 있는 능력이다.즉, 같은 객체라도 부모 타입, 자식 타입 등 다양한 변수 타입으로 참조 가능하다. 다형적 참조 (Polymorphic Reference)class Parent { public void parentMethod() { System.out.println("Parent.pa..
자바 객체지향의 큰 축은 상속, 캡슐화, 다형성이다. 그중 상속은 코드의 재사용성과 확장성을 극대화하는 도구이다. 이번 글에서는 상속이 왜 필요한지, 메모리 구조와 오버라이딩, super 키워드, 생성자 호출 규칙까지 한 번에 정리한다. 상속이 필요한 이유전기차(ElectricCar), 가솔린차(GasCar)를 만들어보면 공통 기능(move())이 존재한다.public class ElectricCar { public void move() { System.out.println("차를 이동합니다."); } public void charge() { System.out.println("충전합니다."); } } public class GasCar {..
자바에서 final은 "더 이상 변경 불가"를 의미한다. final은 변수, 메서드, 클래스에 붙일 수 있는데, 이번 글에서는 변수와 상수, 참조 타입에서의 동작을 중심으로 정리한다. final 변수 (지역 변수와 매개변수)final int data1; data1 = 10; // 최초 1회 할당 가능 // data1 = 20; // 컴파일 오류final 지역 변수는 최초 한 번만 할당할 수 있다.매개변수에 final이 붙으면 메서드 내부에서 값을 변경할 수 없다.static void method(final int parameter) { // parameter = 20; // 오류 }final이 붙은 매개변수는 값이 변경되지 않기 때문에 호출 시점에 전달된 값이 끝까지 유지다. final 필..
자바 프로그램을 이해하려면 메모리 구조를 꼭 알아야 한다. 스택(Stack), 힙(Heap), 메서드(Method) 영역은 변수, 객체, 메서드가 어디에 저장되고 어떻게 동작하는지를 결정한다. 또한 static 키워드는 클래스 단위로 공유되는 자원을 관리하는 데 핵심적인 역할을 한다. 자바 메모리 구조자바 메모리는 크게 3개 영역으로 나뉜다.메서드 영역 (Method Area)클래스 정보, static 변수, 상수 풀을 보관한다.프로그램 전역에서 공유된다.붕어빵 틀(클래스 정의)에 해당한다.스택 영역 (Stack Area)메서드 실행 시마다 스택 프레임이 쌓인다.지역 변수, 매개변수를 저장한다.메서드 종료 시 해당 프레임을 제거한다.힙 영역 (Heap Area)new로 생성된 객체와 배열을 저장한다...
자바는 public, private 같은 접근 제어자(Access Modifier)를 제공해, 클래스 외부에서 특정 필드나 메서드에 접근할 수 있는 범위를 조절할 수 있다. 이 개념은 단순한 문법을 넘어서 안전한 객체지향 프로그래밍의 핵심 도구이며, 캡슐화(Encapsulation)를 실현하는 핵심 장치이다. 접근 제어자가 필요한 이유예를 들어, 스피커 볼륨은 100을 넘으면 고장난다는 제약이 있다.public class Speaker { int volume; Speaker(int volume) { this.volume = volume; } void volumeUp() { if (volume >= 100) { ..
프로그램이 작을 때는 클래스 몇 개만 있어도 충분하지만, 프로젝트가 커지면 수십~수백 개의 클래스가 등장한다. 이때 관련된 클래스들을 논리적으로 묶어 관리할 수 있는 도구가 바로 패키지(Package)이다. 패키지란?클래스들을 논리적 그룹으로 묶어주는 이름 공간(namespace)이다.파일 시스템의 폴더/디렉토리와 유사하다.프로젝트 규모가 커질수록 유지보수성과 가독성을 높여준다.예시: 쇼핑몰 시스템com.helloshop ├ user │ ├ User │ └ UserService ├ product │ ├ Product │ └ ProductService └ order ├ Order ├ OrderService └ OrderHistory관련 클래스는 같은 패키지에,성격이 다른 클래스는 다른 패키지..