728x90
자료구조(Data Structure)
- 효율적인 로직을 짜기 위한 기본 토대
- 개발하려는 시스템에 가장 효율적인 자료구조를 선택하는게 중요하다.
선형 자료구조
배열(Array)
- 자료의 물리적 위치와 논리적 위치가 같다.
- 인덱스 연산에 의해 배열 내 요소를 바로 꺼낼 수 있다.
- 산술적 연산이 빠르다.
- 배열의 개수에 의존성을 갖는다.
연결 리스트(Linked List)
- 노드가 필요할 때마다 메모리를 할당 받고 자료는 링크를 통해 연결된다.
- 자료의 물리적 위치와 논리적 위치가 다를 수 있다.
- 자료뿐만 아니라 다음 요소를 가리킬 링크를 가진다.
- Ex. C, C++ 의 포인터
- 데이터 수정에 따라 링크 연결만 생성 또는 해제해주면 되기 때문에 배열에 비해 수행속도가 적게 든다.
스택(Stack)
- Last In First Out(후입선출)
- 자료의 추가 및 삭제가
top
에서만 이루어진다.
큐(Queue)
- First In First Out(선입선출)
- 자료의 추가는
rear
에서, 자료의 삭제는front
에서 이루어진다. - enqueue : 추가 연산
- dequeue : 삭제 연산
비선형 자료구조
트리(Tree)
힙(Heap)
- Heap Sort : 힙 트리를 이용한 정렬 알고리즘
- Max heap : 최대 힙 (부모 노드가 항상 자식 노드보다 크거나 같음)
- Min heap : 최소 힙 (부모 노드가 항상 자식 노드보다 작거나 같음)
이진 검색 트리(Binary Search Tree)
- 자료(key)의 중복을 허용하지 않는다.
- 부모 노드를 중심으로 좌측 노드는 부모 노드 보다 작은 값, 우측 노드는 부모 노드 보다 큰 값을 갖는다.
- 자료 검색 평균 시간은
lgN
이다. - Skewed Tree(편향 이진 트리) 일경우 AVL Tree 나 Red-Black Tree 와 같이 균형을 맞춘 뒤에 이진 탐색을 수행하기도 한다.
- 전위순회로 탐색을 하면 자료가 정렬되어 출력된다.
그래프(Graph)
- 정점(vertex) = 노드(node)
- 간선(edge) = 링크(link)
- 그래프 구현 방법
- 인접 행렬(adjacency matrix) : 연결되어 있을 경우 1, 0
- 인접 리스트(adjacency list)
- 그래프 탐색 방법
- DFS(Depth First Search), BFS(Breadth First Search)
해시(Hash)
- 검색을 위한 자료 구조 (dictionary)
- key는 유일하고 이에 대한 value를 쌍으로 저장한다.
- 데이터 삽입 순서와는 무관하다.
- 해시 함수를 적용하여 해시 함수를 적용한 인덱스 위치에 데이터를 저장한다.
- 해시 함수 적용에 따른 유일한 값을 갖도록 다양한 해시 함수를 적용한다.
- 해시 알고리즘 적용의 이유 -> 검색에 들어가는 속도가 빠르며 산술적으로 가능하다.
- 해시 함수 적용 이후 충돌이 발생할 수도 있다. (동일한 위치에 데이터 삽입 시)
제네릭 프로그래밍
제네릭(Generic)
- 클래스에서 사용하는 변수의 자료형이 여러개 일수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언한다.
- 컬렉션 프레임워크에서 많이 사용한다.
- 자료형 매개변수 T(type parameter)를 사용하여 표현한다.
| 📄 Object를 이용한 여러 타입 대체 하기
public class ThreeDPrinter{
private Object material;
public void setMaterial(Object material) {
this.material = material;
}
public Object getMaterial() {
return material;
}
}
| 📄 Generic을 이용한 여러 타입 대체 하기
public class GenericPrinter<T> {
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
public String toString(){
return material.toString();
}
}
- Generic 을 쓰면 따로 형변환을 하지않아도 된다.
- 런타임시 자동으로 데이터를 넣어서 컴파일한다.
제네릭에서의 자료형 추론 Java 10 부터 가능
ArrayList list = new ArrayList()
-> var list = new ArrayList();
- 변수를 선언할 때
var
지역 변수를 사용하여 자료형을 생략할 수 있으며 컴파일시에, 컴파일러가 자료형을 추론한다.
T extends
- T 자료형의 범위를 제한한다.
- 상위 클래스에서 선언하거나 정의하는 메서드를 활용할 수 있다.
public class GenericPrinter<T extends Material> {
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
public String toString(){
return material.toString();
}
}
- Material 클래스를 상속받은 클래스만 T의 자료형으로 사용할 수 있다.
제네릭 메서드
public <자료형 매개 변수> 반환형 메서드 이름(자료형 매개변수...) { }
컬렉션 프레임워크
- 자료구조를 구현해놓은 JDK 라이브러리
java.util
패키지 내에 구현되어있음
ArrayList
public ArrayList(int initialCapacity)
public ArrayList()
- initialCapacity를 지정하지 않을 경우 기본적으로 사이즈 10의 ArrayList가 만들어진다.
public ArrayList(Collection<? extends E> c)
- get(int)
- add(int, E)
- remove(int, Object)
Iterator
- 컬렉션 프레임워크의 모든 자료구조에서 저장된 요소들을 하나씩 차례로 참조할 때 사용가능하다.
- Set 인터페이스의 경우
get(i)
메서드가 제공되지 않아, Iterator를 활용하여 객체를 순회한다.
- boolean hasNext()
- E next
- remove()
HashSet
- 멤버의 중복 여부를 체크하기 위해 인스턴스의 유일성 확인이 필요하다.
equals()
,hashCode()
재정의equals()
를 재정의하면 동일한 메모리 위치에 데이터가 저장되어야하므로hashCode()
도 무조건 재정의 해줘야한다.
- hashCode를 equals와 함께 재정의하지 않으면 동일 데이터는 중복 저장된다.
- ⭐️ hash 값을 사용하는 Collection(HashSet, HashMap, HashTable)을 사용할 때 문제 발생!
- Collection(HashSet, HashMap, HashTable) 의 내부 로직
Reference : equals와 hashCode는 왜 같이 재정의해야 할까?
TreeSet
- 객체의 정렬을 위해 사용한다.
- Set 인터페이스를 구현해서 중복을 허용하지 않고 오름차순이나 내림차순으로 정렬
HashMap
- key는 중복될 수 없으며 인스턴스의 유일성 비교를 위해
equals()
,hashCode()
재정의 필요- key 는 Set의 개념(중복 불가), Value는 컬렉션의 개념
728x90
'🧑💻 Language > Java' 카테고리의 다른 글
[Java] 웹 개발 개론 (0) | 2022.05.17 |
---|---|
[Java] 객체 지향과 디자인 패턴 (0) | 2022.05.09 |
[Java] 객체 지향 프로그래밍(3) (0) | 2022.04.26 |
[Java] 객체 지향 프로그래밍(2) (0) | 2022.04.19 |
[Java] 객체 지향 프로그래밍 (1) (0) | 2022.04.07 |