ArrayList에 요소가 추가되는 과정 살펴보기 최근 배열에 대해 복습하면서 ArrayList에 대해 잘못 이해하고 있었다는 것을 깨달았다. 구체적으로 파헤쳐보기 전에 기본적인 배열 개념에 대해 간략히 정리해봤다. 배열 연속된 메모리 공간에 위치한 같은 타입 요소들의 모음 숫자 인덱스를 통한 랜덤 접근 가능 참조 O(1), 탐색 O(n) 정적 배열 크기가 고정된 배열 동적 배열 동적으로 요소 할당이 가능한 배열 Java에는 ArrayList. 요소를 추가할 때 기존 저장 용량을 초과하면 자동으로 용량이 늘어남 지금까지는 ArrayList도 LinkedList처럼 요소가 포인터로 연결된 형태라고 생각해왔다. 같은 List타입인데다가 중간 삽입/삭제 등의 api가 제공되는 것이 이유였다. (내부 동작은 그..
Java Collection Framework 의 개요 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합 특징 배열과 달리 가변적인 크기를 가짐 데이터 삽입, 탐색, 정렬 등 편리한 API 제공 List, Queue, Set, Map 등의 인터페이스를 제공, 이를 통해 일관된 API를 사용할 수 있음 계층 및 종류 리스트 (List) : 인덱스 순서로 요소를 저장. 중복된 데이터를 저장할 수 있음. 큐 (Queue) : 데이터가 저장된 순서대로 출력되는 선입선출 (FIFO: First In First Out) 의 구조를 갖는 선형 자료구조이다. 집합 (Set) : 순서가 없고, 데이터를 중복하여 저장할 수 없음. 집합 연산 (합집합, 교집합, 차집합 등) 을 지원. ..
Object의 equals 매개변수로 객체의 참조 변수를 받아서 비교하여 결과를 boolean값으로 반환하는 메서드 참조 변수의 값(주소 값)으로 두 객체가 같은지 다른지 판단 equals()의 오버라이딩 Object의 equals메서드는 두 객체의 주소 값만 비교하기 때문에, 두 객체의 내용이 같아도 주소 값이 다르면 다른 객체로 본다. 따라서 객체 내용을 비교하여 같고 다름을 판단하고 싶다면 해당 클래스에 equals 메서드를 오버라이딩해주어야 한다. 대표적인 예시로 String, Integer 클래스가 있다. String의 equals Object와 같이 두 객체의 주솟값이 같으면 true 반환한다. 차이점은 주솟값이 다르더라도 두 객체의 value를 비교하는 과정이 추가되어 있다는 점이다. Int..
로그를 남길 때는 System.out.prinln() 같은 메서드 대신에 로깅 라이브러리를 통해 로그를 출력한다. 이 글에서는 System.out를 쓰면 안 되는 이유와 로깅 라이브러리에 대해서 간략하게 정리했다. 혹시 잘못된 내용을 발견했다면 관련한 지적은 환영한당. System.out을 쓰면 안 되는 이유 성능 저하 PrintStream 클래스의 println 메소드는 synchronized 키워드를 사용한다. print 등 출력 기능을 하는 다른 메서드들도 내부를 살펴보면 synchronized 키워드를 사용하는 것을 확인할 수 있다. synchronized 키워드는 특정 객체에 lock을 걸어 해당 작업을 진행 중인 쓰레드 외에 다른 쓰레드는 해당 작업을 간섭하지 못하도록 막는다. 이를 동기화(s..
Comparator와 Comparable는 자바로 알고리즘 문제를 풀다 보면 반드시 접하게 된다. 나도 최근 알고리즘 공부를 진행하면서 이 인터페이스들을 구현할 필요가 있었고, 아직 완전히 숙지하지 못한 것 같아 정리해본다. 정렬 어떤 문제에서는 임의로 클래스를 생성해서 객체 간의 값을 비교할 수 있도록 정렬 기준을 정의할 필요가 있다. 이때 사용하는 것이 이 글의 주제인 Comparator 인터페이스와 Comparable 인터페이스이다. 보통 자바에서는 아래 코드로 배열 또는 리스트를 정렬한다. Arrays.sort(arr); Collections.sort(list); 자바에서 정렬은 특별한 정의가 되어 있지 않으면 오름차순을 기준으로 한다. Comparable Comparable 인터페이스는 comp..