자바 알고리즘 공부 1일차

홍석진·2021년 9월 3일
0
post-thumbnail

이번에 "자바로 배우는 핵심 자료구조와 알고리즘, 기술 면접에 필요한 실용주의 자료구조와 알고리즘" 이라는 책을 ebook으로 사서 공부를 시작하고자 한다.
계속 일을 할 수록 조금 더 효율적인, 간결한 코딩을 추구하게 되니 자연스럽게 자료구조와 알고리즘에 대해서 공부가 필요할 것 같아서 이 책을 구매하게 되었다. 일단 개발환경은 java8에 tool로 eclipse말고 intellij로 구성을 하였고 예전에 spring boot를 공부할 때 경험했던 Gradle로 빌드 배포를 한다. Gradle은 Maven보다 성능도 부족하지 않고 유연하며 100배 빌드가 빠르다는데 책을 공부하고 기회가 된다면 조금 더 깊게 다루어 보고 싶긴 하다. 오늘은 첫 날이기 때문에 힘 빡줘서 자세히 다루고 지나가도록 하겠다. 다음부터는 소스부분은 Git에 Push하고 공부하면서 사용한 이론만 벨로그에 다룰 예정이다.
오늘은 CHAPTER 1 : Interface를 다루어 볼 생각이다.

📋List

자바 interface란 메서드의 집합이다. interface에 메서드를 이러한 식으로 구성하겠다고 규격을 정해준다고 생각하면 된다. 이제 이 interface를 구현하는 클래스는 구성하겠다고 한 메서드를 제공해야 한다. interface에 대한 자세한 내용은 interface란:tstory를 읽어보며 정리를 했다. 사실 오늘 인터페이스 이야기를 꺼낸 이유는 자바의 List interface에 대해서 설명하기 위해서 였다. JCF(Java Collection Framework)는 List라는 interface를 정의하고 ArrayList와 LinkedList라는 두 구현 클래스를 제공한다. java 입문 초창기에는 클래스와 인터페이스 개념이 부족해서 List를 선언하고 new생성자로 List가 아닌 ArrayList 인스턴스를 생성해서 왜 앞뒤가 다르지 하고 열심히 구글링을 한 기억이 있다. 정답은 앞에 말한 것 처럼 List는 인터페이스고 객체는 ArrayList나 LinkedList(List의 구현클래스)를 생성해야 했던 것이지만, 솔직히 학원이나 혼자 공부할 때에는 시간복잡도 같은 것을 별로 신경 쓰지 않았기에 모든 List를 ArrayList로 생성했었다. 책에 앞 부분에는 이러한 나를 지켜보고 있었다는 듯 이러한 일침을 가하며 인터페이스 기반 프로그래밍이란 스타일을 설명한다.

package com.allendowney.thinkdast;

import java.util.LinkedList;
import java.util.List;

public class ListClientExample {
	@SuppressWarnings("rawtypes")
	private List list;

	@SuppressWarnings("rawtypes")
	public ListClientExample() {
		list = new LinkedList();
	}

	@SuppressWarnings("rawtypes")
	public List getList() {
		return list;
	}

	public static void main(String[] args) {
		ListClientExample lce = new ListClientExample();
		@SuppressWarnings("rawtypes")
		List list = lce.getList();
		System.out.println(list);
	}
}

위 코드에서는 LinkedList를 사용하지만 얼마든지 ArrayList의 생성자를 만들어서 인터페이스를 사용할 수 있다. (인터페이스가 변경되면 싹 다 바꿔야하지만.. 그래서 라이브러리 개발자는 인터페이스를 변경하지 않는다고 한다.)
앞 내용과는 큰 관련은 없지만 지금 계속 이야기하고 있는 ArrayListLinkedList 둘의 차이점을 모를 수 있다. 설명하자면, 먼저 ArrayList는 내부적으로 데이터를 배열에서 관리하며 데이터가 들어갈 때 임시 배열을 만들어 데이터를 복사하는 방법을 사용한다. 쉽게 이야기해서 데이터 하나가 들어가면 영향을 받는 다른 데이터들이 다 함께 복사해서 옆으로 탄창에 총알을 넣듯이 이동하는 것이다. 이러한 구조를 가진 ArrayList는 각각의 자료들이 index를 가지고 있어서 검색에 유리하지만 자료가 많아지면 옆으로 많은 숫자가 이동하므로 성능저하를 일으킬 수 있다.
다음으로 LinkedList는 노드 구성이 12-23-34-45 이런식으로 각 노드가 이전 노드와 다음노드의 상태만 알고 있다보니 데이터의 추가 삭제시 불필요한 데이터 복사가 이루어지지 않아서 유리한 부분이 있고 검색시에는 처음부터 노드를 다 돌아봐야해서 성능상 불리하다.

실습

나머지는 실습코드들인데 예제 코드에서 LinkedList -> ArrayList로 바꾸고 컴파일 실행하는 것입니다. 실습하다가 과다지정(overspecified)를 주의하라고 하니 주의하며 고쳐주면 된다.

다음 글 부터는 앞에 말한듯이 진행할 예정이고 알고리즘을 다루는 것 같으니 정리는 다음글에 남길 것 같다. 전자정부프레임워크 코드만 죽도록 보느라 java를 많이 안보고 있었는데 이렇게 정리하며 공부하니까 도움이 많이 되는 것 같다. 꾸준히하는게 목표라 일하는 틈이나 일끈나고 틈틈히 정리할 것이다.

profile
질문이나 의견이 있으시면 남겨주세요. 서로의 발전이라고 생각합니다.

0개의 댓글