개발일지

자바 기초 정리 - 컬렉션과 객체지향 프로그래밍 (ArrayList / LinkedList, 오버라이딩)

동훈 2026-06-30 09:11
조회수 4
들어가며 오늘은 어제에 이어 자바 컬렉션과 객체지향 프로그래밍 개념을 복습했다. 특히 메모리 구조와 연결되는 컬렉션 구조와, 객체지향에서 중요한 개념들을 중심으로 정리했다. ArrayList vs LinkedList ArrayList와 LinkedList는 모두 List 인터페이스를 구현한 자료구조이지만, 내부 구조와 동작 방식에서 차이가 있다. ArrayList ArrayList는 배열 기반 구조로, 데이터가 메모리에 연속적으로 저장된다. 특징 인덱스를 통한 접근이 빠르다 데이터 추가는 끝에 할 때 효율적이다 중간 삽입/삭제 시 데이터 이동이 발생해 느려질 수 있다 LinkedList LinkedList는 노드(Node) 단위로 데이터를 저장하며, 각 노드가 다음 노드의 주소를 가지고 있는 구조이다. 특징 데이터가 메모리에 연속적으로 저장되지 않는다 중간 삽입/삭제가 빠르다 (주소만 변경) 특정 위치 접근은 느리다 (순차 탐색 필요) 메모리 관점에서 차이 ArrayList → 데이터가 힙에 연속적으로 저장됨 LinkedList → 노드들이 힙에 흩어져 있고, 주소로 연결됨 즉, 구조 차이에 따라 성능 특성이 달라진다. 접근 제어자 (Access Modifier) 자바에서는 변수와 메서드의 접근 범위를 제한하기 위해 접근 제어자를 사용한다. 제어자 접근 범위 private 해당 클래스 내부 default 같은 패키지 protected 같은 패키지 + 자식 클래스 public 전체 왜 필요한가 처음에는 변수를 직접 수정하는 것이 더 편해 보일 수 있다. 하지만 협업 환경에서는 데이터가 무분별하게 변경되면 문제가 발생할 수 있다. warrior.hp = -500; 이처럼 비정상적인 값이 들어갈 수 있기 때문에 → 직접 접근을 제한하고, 메서드를 통해 제어하는 것이 중요하다. 오버라이딩 vs 오버로딩 이름이 비슷하지만 개념은 다르다. 구분 오버라이딩 (Overriding) 오버로딩 (Overloading) 의미 기존 메서드 재정의 메서드 추가 정의 관계 상속 관계 같은 클래스 메서드 이름 동일 동일 매개변수 동일 달라야 함 오버라이딩 핵심 부모 클래스의 메서드를 자식 클래스에서 재정의하여, 상황에 맞는 동작을 수행하도록 만드는 것 @Override public void attack() { System.out.println("자식 클래스에서 재정의된 공격"); } 업캐스팅된 상태에서도 오버라이딩된 메서드는 실제 객체(자식 클래스)를 기준으로 실행된다. 그래서 부모 타입으로 참조해도, 실행 결과는 자식 클래스 기준으로 동작한다. 업캐스팅 / 다운캐스팅 (다형성) 업캐스팅 자식 객체를 부모 타입으로 다루는 것 GameCharacter character = new Warrior(); 자동 형변환 여러 객체를 하나의 타입으로 관리 가능 자식 고유 기능은 사용할 수 없음 다운캐스팅 부모 타입을 다시 자식 타입으로 변환하는 것 Warrior warrior = (Warrior) character; 강제 형변환 필요 자식 고유 기능 사용 가능 instanceof 다운캐스팅 전에 타입을 확인하기 위한 연산자 if (character instanceof Warrior) { Warrior warrior = (Warrior) character; } Pattern Matching 최신 자바에서는 다음과 같이 더 간단하게 작성 가능 if (character instanceof Warrior warrior) { warrior.smash(); } 정리하며 ArrayList와 LinkedList는 메모리 구조 차이로 인해 성능 특성이 달라진다 접근 제어자는 데이터 보호와 코드 안정성을 위한 중요한 개념이다 오버라이딩은 객체지향에서 동작을 확장하는 핵심 방법이다 업캐스팅과 다운캐스팅을 통해 다양한 객체를 유연하게 다룰 수 있다 느낀 점 업캐스팅을 하면 자식 기능을 못 쓰는 줄만 알았는데, 다운캐스팅을 통해 다시 사용할 수 있다는 점이 인상적이었다. 또한 오버라이딩된 메서드는 실제 객체 기준으로 실행된다는 점도 이해하게 되었다. 컬렉션 부분에서는 단순히 List를 사용하는 것보다, 내부 구조에 따라 성능이 달라진다는 점을 고려해야 한다고 느꼈다. 앞으로 객체지향 개념이 계속 이어지기 때문에 상속과 다형성 개념을 더 명확하게 정리할 필요가 있다. 실제 코드에서 컬렉션과 객체지향 개념을 함께 사용하는 연습을 해볼 예정이다.
목록으로