본문 바로가기

JAVA 공책/수업 메모

자료구조

자료구조(Data Structure)

(자료구조는 모두 Generics로 되어 있다.)

- 데이터를 어떤 방법으로 저장할 것인지

Collection

- 데이터의 묶음으로 대표적인 것이 배열이다.

Enumerator & Iterator

- 둘 다 반복자나 열거자라는 단어로 번역하는데 Java에서는 Enumerator가 예전에 나온 반복자이고 Iterator가 최근에 나온 반복자 입니다.

- 예전 API 클래스들은 Enumerator라고 하고 최근에 나온 API 클래스들은 Iterator라고 합니다.

- 맨 처음 데이터의 시작 이전 지점(BOF)을 가리키고 있다가 next()를 호출하면 다음 데이터를 가리키는 구조를 가진 포인터

List 인터페이스

- 데이터를 순서대로 나열하는 자료구조의 상위 인터페이스

- 데이터를 순서대로 나열하는 자료구조들의 공통된 작업을 위한 메소드 이름만을 가지고 있습니다.

- Array(배열)도 데이터를 순서대로 나열하는 자료구조인데, 이건 크기 변경이 안됩니다. 배열의 저장된 데이터 값을 변경은 할 수 있지만 배열의 데이터를 삭제하거나 배열에 데이터를 추가하려면 배열을 복사해서 작업을 수행해야 합니다. 배열은 데이터를 반드시 순서대로 연속해서 저장해야 하기 때문입니다.

- List는 배열의 이러한 단점을 보완하기 위해서 여분의 공간을 확보하고 있다가 데이터가 추가되면 그 여분의 공간을 활용하는 자료구조입니다.

1. 공통된 메소드

1) int size();    데이터의 개수 리턴

2) void add(데이터)    데이터를 마지막에 추가

3) 데이터 get(인덱스)    인덱스 번째의 데이터를 리턴

4) void remove(데이터)    삭제

- 대부분이 빠른 열거를 사용할 수 있습니다.

2. Vector & ArrayList

- 데이터를 순서대로 연속해서 저장하는 List

- 동작하는 메소드나 저장하는 방식은 동일한데 Vector는 MultiThread에 safe하고 ArrayList는 MultiThread에 unsafe합니다.

- Vector는 Legacy Collection이라고 해서 사용을 권장하지 않습니다.

- 다른 언어에서는 Vector라고 하는 경우가 많아서 사용을 권장하지 않지만 알아두는 것이 좋습니다.

3. Linked List

- 다음 데이터를 가리키는 리스트

- 한방향으로 가리키는 것을 single linked list라고 하고 양방향으로 가리키는 것을 double linked list라고 합니다

- java에서는 클래스이름만 LinkedList이고 사용법은 ArrayList와 동일합니다.

4. 배열과 ArrayList(Vector) 그리고 LinkedList

- 배열은 다른 List보다 공간 낭비가 적습니다. 배열은 크기 확장이 되지 않기 때문에 여분의 공간을 가지고 있지 않기 때문입니다. 데이터를 중간에 삽입하거나 삭제하는 작업은 복사 작업과 같이 해야 하기 때문에 속도가 느립니다.

- ArrayList는 연속된 공간에 데이터를 저장하고 여분의 공간을 가지고 데이터를 중간에 삽이이나 삭제를 할 수 있습니다. 대신에 중간에 삽입이나 삭제를 하려면 다른 데이터를 이동시켜야 하기 때문에 시간이 많이 걸립니다.

- LinkedList는 다음 데이터의 주소를 저장해서 다음 데이터를 찾아가는 자료구조라서 연속된 빈 공간이 없어도 데이터를 저장할 수 있고 중간에 데이터를 삽입하거나 삭제할 때 포인터만 변경되기 때문에 빠르게 작업을 수행할 수 있다는 장점을 가지고 있지만 이전 데이터를 확인하지 않고 다음 데이터를 조회할 수 없기 때문에 접근 속도는 매우 느립니다.

- 데이터의 개수가 변경될 가능성이 없는 경우에는 배열을 사용하고, 삽입과 삭제가 빈번히 발생하는 클라이언트 프로그램의 경우 Linked List를 많이 사용하며 읽어내는 속도가 중요한 서버 프로그램의 경우 Array List를 많이 사용합니다.

5. List의 정렬

- sort 메소드를 호출하면 됩니다.

- 정렬을 하려면 크기 비교를 할 수 있는 메소드를 소유하고 있거나 크기 비교를 할 수 있는 인스턴스를 만들어 주어야 합니다.

- Comparator 인터페이스를 implements 한 클래스의 인스턴스를 대입하면 됩니다.



6. Stack

- LIFO(Last In First Out): 마지막에 삽입된 데이터가 가장 먼저 출력되는 자료구조

- 변수 선언 할 때 순서대로 저장하는 용도로 사용

- 메소드 호출했을 때 호출한 곳의 주소 등을 저장

- 스마트 폰 애플리케이션에서 네비게이션이 스텍을 이용합니다.

-S java.urtil.tack 이라는 클래스로 지원.

- 데이터를 삽입하는 메소드 : push(데이터)

- 데이터를 삭제하고 꺼내는 메소드 : pop()

- 데이터를 삭제하지 않고 꺼내는 메소드 : peek()

- 직접 만들어서 사용하는 경우보다는 시스템이 사용하는 경우가 많습니다.

7. Queue

- FIFO(First In First Out) : 먼저 삽입된 데이터가 먼저 출력되는 자료구조

- 스케줄링(작업 순서) 등에 이용

- java에서는 java.util.Queue라는 '인터페이스'를 통해서 제공

- ArrayList 등이 이 인터페이스를 implements했고 PriorityQueue(우선 순위 큐 - 데이터를 순서대로 정렬해서 저장) 클래스가 Queue 인터페이스를 implements했습니다.

8. Deque

- 양쪽에서 삽입과 삭제가 가능한 자료구조

- 스크롤 뷰에 사용(지도같은 것들)

- 면접 보러 갈 때는 반드시 숙지해서 가세요.

- C언어로 취업을 하고자 할 때는 LinkedList는 직접 구현할 수 있어야 합니다. (자기 참조 구조체를 이용해서 구현하면 됩니다.)

Set

- 데이터를 '중복 없이' 저장하는 자료구조

- 데이터를 저장할 때 순서와는 상관없이 해싱이라는 방법을 이용해서 저장

- 데이터를 저장하는 메소드는 있지만 데이터를 가져오는 메소드는 존재하지 않습니다.

- 데이터를 가져올 때는 빠른 열거를 이용해서 전체 데이터를 가져와야 합니다.

- 삭제하는 메소드와 개수를 리턴하는 메소드는 존재.

- Set은 인터페이스이고 Set을 구현한 클래스로는 HashSet(정말로 저장된 순서를 알 수 없음), LinkedHashSet(저장된 순서를 기억), TreeSet(크기를 기억)이 있습니다.

- 데이터를 추가하는 메소드는 add인데 데이터를 추가하는데 실패하면 false를 리턴합니다.

- 데이터를 추가하는데 실패한 경우는 데이터의 중복일 경우입니다.

- 직접 사용하는 빈도는 높지 않습니다.

Map ( 사용하는 빈도가 많습니다. )

- Key와 Value를 쌍으로 저장하는 자료구조

- Key는 Set으로 저장됩니다.(아래의 Set <키의 자료형> keySet() 부분을 말하는 것입니다.)

- Key는 중복될 수 없습니다.

- 데이터를 저장하는 클래스 처럼 데이터를 이름과 함께 저장해서 이름으로 빠르게 찾아서 사용할 목적으로 만든 클래스

- Map은 인터페이스이고 Map을 구현한 클래스로는 HashMap, LinkedHashMap, TreeMap이 있습니다.

- 맵은 클래스 처럼 여러 종류의 데이터를 하나로 묶고자 할 때 사용합니다.

- 클래스를 사용하는 것보다 좋은 점은 저장하는 데이터의 이름을 변경할 때 편리합니다.

- 이름을 사용하지 않고 모든 데이터 출력이 가능합니다.

- 클래스에 비해 안 좋은 점은 이름을 직접 문자열로 설정을 하기 때문에 코드 센스(set.~)를 사용할 수 없다는 것입니다.

- 종류로는 HashMap, LinkedHashMap(저장순서대로 키를 배치), TreeMap(키의 순서대로)이 있습니다.

- 한글이 영문 키보다 순위가 뒤로 가는 이유:

한글을 사용하는 시스템에서는 2byte로 한글을 표시하는데 영문과 숫자는 첫번째 byte를 0으로 한 후 두번째 byte에 ASCII 코드를 넣고 한글은 첫번째 byte에 0이 아닌 값을 저장해서 구분합니다.

ex)

00000000 00100001 A

11111111 00100001 가

1. HashMap (순서 : 알 수 없음)

1) 생성자

- HashMap<Key의 자료형, Value의 자료형>()

- Key의 자료형은 특별한 경우가 아니면 String

- Value의 자료형은 아무런 데이터나 저장할 수 있도록 Object로 하는 경우가 많습니다.

2) 주요 메소드

- void put(키, 데이터) : 키 이름으로 데이터가 저장이 되고, 동일한 키 이름이 있으면 수정이 됩니다.

- Object get(키) : 키에 해당하는 데이터를 Object 타입으로 리턴

- 키에 해당하는 데이터가 없으면 null을 리턴합니다.

- 리턴되는 데이터가 Object 타입이므로 get해서 사용할 때는 저장할 때의 자료형으로 강제 형 변환해서 사용해야 합니다. (출력할 때는 형변환을 하지 않아도 되고, 비교나 다른 작업을 해야 할 때 형변환을 해줍니다.)

- void remove(키) : 키에 해당하는 데이터를 삭제

- int size() : 데이터 개수 리턴

- Set <키의 자료형> keySet() : 모든 Key들을 Set으로 만들어서 리턴


- 테이블 형식의 데이터를 만들 때는 Map 이나 Class의 List나 배열을 생성합니다.

- 배열(List나 Set포함)의 배열을 만들어야 하는 경우 의미를 부여해야 한다면 일차원 배열을 포함한 Map을 만들고 이 Map을 가지고 List를 생성하는 것이 좋습니다.

Properties

- key와 value를 같이 저장하는 자료구조인데, key와 value 모두 String만 허용합니다.

- String getProperty(String key): key에 해당하는 값을 리턴하는 메소드

- void setProperty(String key, String value): key에 value를 저장하는 메소드로 동일한 key에 데이터가 저장되어 있으면 수정합니다.

Collections 클래스

- List, Set, Map 인스턴스를 변경을 불가능하게 만들거나 동시에 수정할 수 없도록 만들어주는 메소드를 소유한 클래스

- 모든 메소드가 static 이므로 직접 인스턴스 생성할 필요가 없습니다.

- synchronized[각주:1]가 붙는 메소드가 동시에 수정할 수 없는 데이터 모임을 만들어주는 메소드이고, unmodifiable 이 붙는 메소드가 변경이 불가능한 데이터 모음을 만들어 주는 메소드입니다.


자료구조는 클래스이름-특징-사용이 필요할 때 바로바로 사용할 수 있는 것이 중요하다.

그리고 회사 들어갈 때는 좋은 자료구조 책 하나 장만해서 들어가라. 자료구조는 평생 가기 때문이다.


Random

- 랜덤한 숫자를 만들기 위해서 사용하는 클래스

- 게임이나 많은 양의 데이터에서 랜덤한 샘플을 가져올 때 사용

StringTokenizer

- 문자열을 분할해주는 클래스

- String클래스의 split이라는 메소드가 하는 역할과 유사한 역할을 수행하는데 split은 배열로 리턴하고 StringTokenizer는 Enumeration(열거[각주:2])으로 리턴


  1. 서버는 프레임웍이 잘 도와주기 때문에 그래서 서버쪽에서는 스레드가 자동 작동되므로 이 문법은 안 쓰는 경우가 많다. [본문으로]
  2. 다음 위치의 데이터에서 기다리는 형태로, split의 형태보다 데이터를 좀 더 효율적으로(속도를 빠르게) 사용할 수 있습니다. [본문으로]

'JAVA 공책 > 수업 메모' 카테고리의 다른 글

GUI - Java.awt 패키지의 component & 이벤트 처리  (0) 2018.07.18
GUI 프로그램을 하는 방법  (0) 2018.07.16
Scanner  (0) 2018.07.12
날짜&시간  (0) 2018.07.12
기본 개념 & 상식  (0) 2018.07.11