객체지향 스터디를 진행하면서 우테코 프리코스의
baseball
을 학습하였습니다. 팀원들은 대부분List
로 구현했고 저는Array
로 구현을 했습니다.
Array
가 현재의 기능에는 적합하다고 대략 알고 있었지만 어떤 부분에서 다른지 명확하게 답변을 할 수 없었어서 정리를 하기 위해 포스팅을 진행했습니다.
public void computeScore(Baseball baseball) {
resetCounts();
int[] computerBall = baseball.getComputerBall();
int[] userBall = baseball.getUserBall();
for (int i = 0; i < BASEBALL_LENGTH; i++) {
compute(computerBall, userBall, i);
}
resultDisplay();
}
private void compute(int[] computerBall, int[] userBall, int index) {
int temp = -1;
for (int i = 0; i < BASEBALL_LENGTH; i++) {
if(computerBall[i] == userBall[index]) {
temp = i;
break;
}
}
correctCount(index, temp);
}
private void correctCount(int index, int temp) {
if (temp != index && temp != -1) { ballCount++; }
if (temp == index) { strikeCount++; }
}
computeScore(Baseball baseball)은
1. Baseball
의 현재 도메인 상태를 메세지로 전달받아
2. 사용자의 ball과 컴퓨터의 ball을 비교
3. Strike&Ball을 계산하는 책임
을 갖고 있는 객체입니다.
그렇다면computerBall
과 userBall
을 Array
와 List
를 적용했을 때 어떤 차이가 있는지 알아보겠습니다.
배열
여러 개의 데이터를 하나의 이름으로 그룹핑해서 관리 하기 위한 자료구조
배열은 연속적인 메모리 공간에 동일한 자료형의 원소들을 저장하는 구조입니다. 이렇게 저장된 각 요소는 인덱스를 통해 직접 접근이 가능하기 때문에 개별 요소에 대한 검색 및 접근이 빠릅니다.
단, 배열의 크기는 고정적으로 크기를 변경할 수 없고 삽입과 삭제는 용이하지 않습니다.
리스트
여러 개의 데이터를 하나의 이름으로 그룹핑해서 관리 하기 위한 자료구조이지만 배열과의 차이가 있음.
List는 동일한 자료형의 원소들을 비연속적인 메모리 공간에 저장합니다. 리스트의 크기는 가변적이며, 요소의 추가 및 제거가 쉽고 List 인터페이스의 다양한 메서드를 사용할 수 있어 작업이 편리합니다.
단, 순차적인 접근을 통해 배열에 비해 성능이 조금 더 느릴 수 있고, 메모리 오버헤드가 발생할 수 있습니다.
배열은 크기 할당이 필수고 리스트는 그럴 필요가 없습니다.
- 그렇다면 "리스트가 무조건 좋을까요?" 라는 질문에는 꼭 그렇지만은 않습니다.
리스트는 크기가 자동적으로 1.5배 증가하고, 이로 인해 사용하지 않는 메모리 할당이 많아지기 때문에 크기가 정해져 있는 데이터의 그룹핑을 하고 싶다면 배열이 더 효율적인 선택이 될 수 있습니다.
즉, 크기가 정해져 있다면 배열(Array)
이 유리하고, 그렇지 않다면 ArrayList
를 사용하는 것이 좋습니다. -> 네? ArrayList요 ?
저는 자바 개발자로
Java
에는List
인터페이스를 이용해 여러 개의 구현체(ArrayList
,LinkedList
,Vector
)가 있습니다.
먼저 List
인터페이스의 특징을 볼까요 ?
ArrayList
, LinkedList
, Vector
E
→ 제네릭 타입
객체 추가
boolean add(E e)
→ 특정 객체를 맨 끝에 추가void add(int index, E element)
→ 특정 인덱스에 객체 추가set(int index, E element)
→ 특정 인덱스의 객체 교체객체 검색
boolean contains(Object o)
→ 특정 객체 존재 여부 체크E get(int index)
→ 특정 인덱스에 저장된 객체 반환boolean isEmpty()
→ 비어있는지 확인int size()
→ 저장된 객체 수 리턴객체 삭제
void clear()
→ 저장된 모든 객체 삭제E remove(int index)
→ 특정 인덱스에 저장된 객체 삭제boolean remove(Object o)
→ 특정 객체 삭제ArrayList
보다 LinkedList
사용이 유리ArrayList
가 더 성능이 좋다.ArrayList
와 사용법은 같지만 내부 구조가 다름ArrayList
보다 유리하다.ArrayList
와 동일한 내부구조배열(Array)
고정된 크기의 연속적 메모리 할당
장점
단점
ArrayList
배열을 기반을 하는 가변 크기의 리스트 구현
장점
.get(index)메서드를 통해 데이터에 접근하는 경우 호출 자체가 작은 오버헤드를 발생한다.
메서드 호출 과정에서 발생하는 추가적인 오버헤드 발생`단점
LinkedList
요소 간 포인터를 이용해 연결된 리스트 구현
장점
complexity O(1)
) 내에 수행 가능단점
O(n) 시간 복잡도)
) -> 순차적으로 포인터를 따라가며 접근해야 하므로, 접근 속도가 느림