개발 낙서장

[TIL] 내일배움캠프 6일차 - 자료구조 - 본문

Java/Sparta

[TIL] 내일배움캠프 6일차 - 자료구조 -

권승준 2024. 1. 2. 20:22

 

오늘의 학습 키워드📚

비트 연산

  • 컴퓨터는 0과 1로 이루어진 기계어만을 읽을 수 있다. 내가 쓴 코딩이 그대로 컴퓨터에 입력되고 출력되는 것이 아니라 컴파일러를 통해 기계어로 변환이 이루어진 다음 입력되고, 출력된 기계어 또한 컴파일 및 여러 작업들을 통해 우리 눈으로 볼 수 있는 출력값이 나오게 된다.
  • 여기서 가장 작은 단위인 Bit를 이용해 연산을 한다면 컴파일 과정이 단순해져서 다른 연산들보다 가장 빠른 속도를 보여준다.

비트 연산은 Bit의 자릿수를 옮기는 연산이다.
기계어는 0과 1로 이루어져있기 때문에 2진수를 사용하는데 Bit 연산은 이 2진수의 자리를 옮기는 연산을 말한다.

방법으로는 쉬프트 연산자인 <<>>가 있는데 <<는 왼쪽으로 자릿수를 옮기는 것이고 >>는 오른쪽으로 자릿수를 옮기는 것이다.
예를 들어,  3 << 2 와 같은 연산은 3(2진수 11)을 왼쪽으로 2번 옮기는 연산이므로 1100, 즉 12가 된다.
2진수 11을 자세히 살펴보면 0011인데 여기서 왼쪽으로 2번 옮기므로 1100이 되는 것이다.
그럼 반대로 3 >> 1 와 같은 연산은 3을 오른쪽으로 1번 옮기는 연산이므로 0001, 즉 1이 된다.

단순히 자릿수를 옮기는 것 외에도 |(OR 연산자), &(AND 연산자), ^(XOR 연산자), ~(비트 전환 연산자) 등이 있다.

비트 연산은 많이 사용되지는 않는 방법이지만 빅데이터와 같이 대량의 작업을 해야 하는 경우라던가 암호화, 복호화 등의 작업에 많이 사용된다고 한다.
아직은 개념과 사용법 정도만 알고 있어도 충분할 것 같다.

컬렉션(Collection)

가장 대표적인 자료구조로 배열이 있다. 배열은 int[] a = new int[3]; 과 같은 방법으로 선언하는데 선언할 때 용량을 정해줘야 하기 때문에 정적이고 데이터의 삽입, 삭제가 불가능하다. 또한 탐색이나 정렬 알고리즘을 잘 구현하지 않으면 성능에 문제가 생길 수도 있고 개발하는 입장에서도 불편한 부분들이 있다.

자바에서는 이러한 배열을 더욱 고도화시켜서 참조형 자료구조인 컬렉션을 제공한다.
컬렉션은 굉장히 유동적이고 사용하기에도 편리하며 수정, 삭제, 삽입, 정렬 등 많은 기능들을 효율적으로 활용할 수 있다.

  • List : 순서가 있는 데이터의 집합(데이터 중복 허용)
  • Queue : 선입선출(FIFO) 방식의 자료구조
  • Set : 순서가 없는 데이터의 집합(데이터 중복 허용 X)
  • Map : Key, Value 쌍으로 이루어진 순서가 없는 데이터의 집합

리스트(List)

리스트는 위에서 말했듯 순서가 있는 데이터의 집합이다.
종류로는 대표적으로 ArrayList, LinkedList, Stack이 있다.

ArrayList는 가변 배열이고 LinkedList는 연결 리스트라고도 불리며 데이터가 주소와 값 부분으로 이루어져 있는 노드가 포인터로 다음 주소값을 가리키는 형태로 돼있다.
ArrayList는 추가, 삭제, 수정 등이 용이하며 LinkedList는 값을 중간에 추가하거나 삭제하는 게 ArrayList보다 빠르지만 데이터 탐색은 느리다.
기능으로는 둘 다 추가, 삭제, 조회 등이 있는데 ArrayList는 중간에 추가하는 기능도 존재한다.

Stack은 후입선출(LIFO) 방식의 자료구조인데 우리가 컴퓨터를 할 때 흔히 사용하는 crtl + z 작업이 Stack이다.
기능으로는 추가, 조회, 꺼내기 등이 있다.

큐(Queue)

선입선출(FIFO) 방식의 자료구조로 자바에서는 LinkedList로 이루어져 있다.
따라서 선언할 때 Queue<참조형> 이름 = new LinkedList<>(); 이런 식으로 선언해야 에러가 발생하지 않는다.

우선순위 큐(PriorityQueue)라는 것도 존재하는데 데이터에 우선순위를 부여해 삽입할 때 우선순위대로 삽입되는 큐이다.

기능으로는 추가, 조회, 꺼내기 등이 있다.

셋(Set)

Set은 순서가 없는 데이터의 집합으로 HashSet, TreeSet, LinkedHashSet 등으로 활용할 수 있다.

  • HashSet : 가장 빠르지만 순서를 전혀 예측할 수 없다.
  • TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있다.
  • LinkedHashSet : 추가된 순서 혹은 가장 최근에 접근한 순서대로 접근이 가능하다.

주로 HashSet으로 많이 쓰이며 알고리즘에 정말 많이 사용되는 자료구조 중 하나다.

기능으로는 추가, 조회, 삭제, 포함 확인 등이 있다.

맵(Map)

값들이 Key, Value 쌍으로 이루어진 순서가 없는 자료구조로 Key를 통해 Value를 조회할 수 있다.
다른 자료구조와 다르게 Key, Value 쌍으로 이루어져 있어서 선언할 때는 Map<참조형, 참조형> 이런 방식으로 선언한다.
Map 또한 HashMap, TreeMap 등으로 활용할 수 있다.

  • HashMap : 중복을 허용하지 않고 순서를 보장하지 않는다. Key와 Value로 null을 허용한다.
  • TreeMap : Key를 기준으로 정렬이 가능한데 저장 시 정렬되기 때문에 저장할 때 다소 시간이 소요된다.

기능으로는 추가, 조회, Key 조회, Value 조회, 삭제 등이 있다.


오늘의 회고💬

2024년 갑진년의 해가 밝았다. 새 해의 첫 공부였지만 생각처럼 집중이 되진 않았다. 그래도 점점 나아지리라 믿는다.
아직 시작한 지 얼마 되지도 않았다. 절대 퍼져선 안된다!!🤗

 

내일의 계획📜

내일도 역시 자바 강의를 들을 것이다. 속도를 좀 더 올려야 할 것 같다.

Comments