분류 전체보기
-
[Java] Queue가 ArrayList 대신 LinkedList를 사용하는 이유Language/Java 2021. 1. 25. 17:22
Queue의 구현체가 ArrayList가 아니라 LinkedList인 이유는? 먼저 ArrayList와 LinkedList의 차이를 잘 모른다면 여기 에서 데이터를 먼저 읽고 오는 것을 추천드립니다. 간단하게 요약하자면 순차적으로 데이터를 추가/삭제 하는 경우에는 ArrayList를 사용하고, 처음, 중간 데이터를 추가/삭제하는 경우에는 LinkedList를 사용하라는 것입니다. 그러면 Queue에서는 왜 ArrayList 대신 LinkedList를 사용했는지에 대해서 알아보겠습니다. Queue 구조 큐의 구조는 한쪽에서는 삽입만 일어나고 한쪽에서는 삭제만 하는 자료구조 입니다. 즉, 먼저 들어간 것이 먼저 나오는 FIFO 구조입니다. (예시로는 줄서기, 프린터 출력 같은 것이 있습니다.) 즉, 큐는 항..
-
[Java] ArrayDeque 클래스란 무엇일까?Language/Java 2021. 1. 25. 17:19
들어가기 전에 이번 글에서는 ArrayDeque 클래스에 대해 알아보겠습니다. ArrayDeque 클래스는 이름에서도 알 수 있듯이 Deque와 관련된 클래스인 것을 알 수 있습니다. 그리고 Stack 클래스의 문제점, LIFO 구조를 만들 때 ArrayDeque로 해야 하는 상황에 대해서 정리해보겠습니다. public class ArrayDeque extends AbstractCollection implements Deque, Cloneable, Serializable {} 그래서 상속관계를 보니 Deque 인터페이스를 구현하고 있는 클래스인 것을 알 수 있습니다. 그런데 Stack 클래스 대신에 ArrayDeque 클래스를 사용해서 LIFO 구조를 만들어라 라는 말이 있습니다. 왜냐하면 Stack 클..
-
[Java] Stack 클래스는 무엇이고 문제점은 무엇일까?Language/Java 2021. 1. 25. 17:17
Stack 클래스란 무엇인가? Stack 이라는 자료구조는 메모리에서도 쓰이고 실생활에서도 볼 수 있는 자료구조 입니다. (수식계산, 수식괄호검사, 웹브라우저의 뒤로/앞으로) 위와 같이 LIFO(후입 선출)의 특징을 가지고 있는 것은 다 알고 있을 것입니다. 즉, 한 방향에서만 삽입, 삭제가 일어나는 구조라고 할 수 있습니다. (중간의 데이터를 삭제하고 넣는 것은 불가능합니다.) Stack 시간복잡도 삽입(Push): 맨 위에 데이터를 넣으면 되기 때문에 O(1) 입니다. 삭제(Pop): 맨 위에 데이터를 삭제하면 되기 때문에 O(1) 입니다. 읽기(Peek): 맨 위의 데이터를 읽으면 되기 때문에 O(1) 입니다. 탐색(Search): 맨 위의 데이터부터 하나씩 찾아야 하기 때문에 O(n)이 걸리게 됩..
-
[Java] 해시코드(hashCode)란 무엇인가?Language/Java 2021. 1. 25. 17:13
해시코드(hashCode)란 무엇인가? 해시코드를 보기 전에 아래의 코드를 먼저 보고 가겠습니다. public class Test { public static void main(String[] args) { List words = Arrays.asList("Gyunny", " Java", " Study"); if (words.contains("Gyunny")) { System.out.println("Gyunny Java Love"); } } } List의 contains() 메소드의 시간복잡도는 어떻게 될까요? 답은 O(n) 입니다. List의 원소들 중에서 하나씩 찾아서 존재 여부를 탐색해야 하기 때문입니다. 만약 List의 개수가 엄청나게 많다면 탐색할 때 상당히 오래걸릴 것입니다. 이 때 HashT..
-
[Java] HashSet이란 무엇인가?Language/Java 2021. 1. 25. 17:07
HashSet이란? public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable {} HashSet은 Set 인터페이스를 구현하고 있는 가장 대표적인 클래스입니다. 이번 글에서는 HashSet 클래스가 내부적으로 어떻게 동작하고 어떤 API들이 있는지에 대해서 알아보겠습니다. 먼저 Set의 특징을 정리해보겠습니다. 중복되지 않은 원소들을 저장하고 null을 허용합니다. 내부적으로 Map을 사용합니다. 순서를 유지하지 않습니다. Thread-Safe 하지 않습니다. public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Seria..
-
[Java] HashMap이란 무엇인가?Language/Java 2021. 1. 25. 17:01
HashMap이란? HashMap은 Map 인터페이스를 구현하고 있는 대표적인 클래스입니다. 그리고 Map의 구조인 key-value쌍으로 구성되어 있습니다. 그리고 Map의 대표적인 특징은 하나의 key는 정확히 하나의 value만 가질 수 있다는 것입니다. public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { } HashMap 클래스의 내부는 위와 같은 상속, 구현 관계를 가지고 있습니다. 이제 본격적으로 HashMap에 대해서 정리를 해보겠습니다. HashMap은 왜 필요한가? list 형태를 사용하지 않고 HashMap을 사용하는 이유는 성능 때문입니다. 만약에 HashMap을 사용하지 않고 list를 ..
-
개발자를 꿈꾸는 대학생의 2020년 회고Retrospect 2021. 1. 3. 03:35
회고를 처음 써보기에 어떻게 쓸까, 언제부터 회고를 해볼까란 생각이 듭니다. 주 내용은 2020년의 회고이지만, 2016년 부터 회고를 하면서 시작해볼까 합니다. 대학교에 입학하다.(16년 - 1학기) 고3 ~ 재수를 하는 기간에 나름 공부를 열심히(?) 했지만 입시에 실패했습니다. 공부를 안하고 결과가 좋지 않았다면 그러려니 했겠지만, 나름 공부를 열심히 했다고 생각했는데 결과가 공부를 안한 사람과 거의 같은 수준이었습니다. (그래서 엄청나게 자존감도 떨어지고 속상했던 기억이 납니다. 하는 척만 했나....) 다시 수능을 봐야하나 생각을 하다가 저의 지식의 한계와 현실을 받아들이고 그냥 성적에 맞는 대학교를 가야겠다고 생각을 했습니다. 당시에는 학교의 이름만을 생각했기에 과는 많이 신경쓰지 않았습니다...
-
[Git] 브랜치 병합(Merge) & 충돌(Conflict) & 해결(Resolve)에 대하여Github/Git 2020. 11. 19. 19:56
브랜치 병합(Merge)란? merge 명령어를 사용하면 여러 개의 브랜치를 하나로 모을 수 있다. 예를들어, 아래 그림과 같이 master 브랜치에서 뻗어 나오는 bugfix 브랜치를 봐보자. 현재 상황은 master 브랜치에서 뻗어나온 bugfix 브랜치에서 X, Y 커밋을 한 상태이다. 여기서 Merge를 하면 위의 그림과 같이 두 개의 브랜치가 합쳐지게 된다. bugfix 브랜치를 master 브랜치로 병합할 때, master 브랜치의 상태가 bugfix 브랜치를 만들었을 때의 상태와 같다면 매우 쉽게 merge 할 수 있다. bugfix 브랜치는 master 브랜치의 이력을 모두 포함하고 있기 때문에, master 브랜치는 단순히 이동하기만 해도 bugfix 브랜치와 합쳐질 수 있다. 이와 같은..