전체 글
트리 (Tree) 트리는 이름 그대로 하나의 뿌리로부터 가지가 사방으로 뻗어있는 나무를 거꾸로 뒤집어 놓은 형태의 자료구조이다. 그림에서 볼 수 있듯이 하나의 데이터 아래에 여러 데이터가 존재할 수 있는 비선형적인 계층 구조이고 사이클이 존재하지 않는다. 대표적인 사용 예시는 디렉토리 구조, 토너먼트 대진표, 가계도 등이 있다. 트리의 구조와 용어 트리는 루트(Root)에서 시작해서 데이터가 담긴 노드들을 간선(edge)으로 연결한다. 부모 노드와 자식 노드가 있는데 자식 노드는 하나의 부모만 가질 수 있고 같은 부모를 가진 자식 노드들을 형제 노드 관계라고 부르고 자식이 없는 노드는 리프(leaf) 노드라고 부른다. 깊이 (depth) 루트로부터 하위 계층의 특정 노드까지의 깊이. 루트 노드의 dept..
큐 (Queue) 큐는 사전적 의미로 줄을 서서 기다리다, 대기열이라고 정의되어 있다. 단어로 짐작할 수 있듯이 가장 마지막에 추가된 데이터가 가장 먼저 삭제되는 스택과는 반대로 먼저 추가된 데이터가 먼저 삭제되는 선입선출 형태의 자료구조이다. 큐 사용 예제 은행이나 상담원 연결 대기번호 프린터 인쇄 대기열 BFS 큐의 특징 1. FIFO (First In First Out) 먼저 들어간 데이터가 가장 처음에 나오는 선입선출의 자료구조 2. 데이터는 하나씩 추가 / 삭제 데이터가 아무리 많아도 하나씩만 추가하거나 삭제할 수 있다. 3. 두 개의 입출력 방향 추가와 삭제의 방향이 같은 스택이랑 다르게 추가 삭제 방향이 다르다 큐 주요 메서드 및 구현 add() - 큐에 데이터 추가 poll() - 가장 처..
연결 리스트(LinkedList) LinkedList는 선형으로 그룹화된 데이터의 집합으로 데이터와 다음 데이터의 주소를 포함하고 있는 노드들을 선형으로 연결한 자료구조이다. 배열을 기반으로 사용하는 ArrayList는 연속된 공간 안에 메모리를 차지해서 데이터를 읽고 쓸 수 있다. 배열의 크기만큼 메모리를 할당해서 사용하기 때문에 데이터가 배열의 크기보다 많아지면 데이터를 새로 할당하고 추가/삭제 연산은 각 데이터를 앞으로 당기거나 뒤로 밀어야 한다. 반면 노드를 기반으로 한 LinkedList는 연속된 공간이 아니라 메모리 상에 흩어져 있는 노드들을 연결한 자료구조이기 때문에 데이터의 추가 삭제는 ArrayList보다 빠르게 연산할 수 있지만 특정 데이터를 찾는 연산은 노드를 하나하나 참조하여 찾아야..
스택 (Stack) stack은 사전적 의미로 쌓다 포개지다라고 정의되어 있다. 즉, 정의 그대로 데이터를 쌓으면서 관리하는 자료구조라고 할 수 있다. 그림에서 볼 수 있듯이 입력과 출력이 한 방향으로 자료를 쌓으면서 관리하기 때문에 가장 늦게 들어온 데이터가 가장 먼저 나가는 LIFO(Last In First Out) 형태의 자료구조이다. 스택의 특징 1. 하나의 입출력 방향 데이터의 입출력이 방향이 같다. 2. LIFO (Last In First Out) 스택은 입출력이 한쪽 방향으로만 발생하기 때문에 마지막에 들어온 데이터가 제일 먼저 나가는 자료구조이다. 스택 주요 메서드 및 구현 push() - 스택에 데이터 추가 pop() - 스택에 가장 마지막으로 추가된 데이터를 스택에서 삭제하고 데이터를 ..
코드 스테이츠 백엔드 부트캠프 6개월 과정을 시작하고 눈 떠보니 Section 1이 끝나 있었다. Section 1 html / css git java 1. html 가장 먼저 기본적인 html과 css를 학습했다. 학습한 html, css로 페어 분과 간단한 페이지를 함께 만들어봤는데 처참한 미적 감각에 씁쓸했고 다른 동기 분들이 만든 결과물을 보면서 백엔드를 선택하길 잘했다고 생각했다. 'ㅁ'a 2. git 다음으로 git을 학습했는데 부트캠프에 참가하기 전 까지는 혼자 로컬에서 레포에 pull push밖에 안 해본 상태였다. 페어 분과 같이 협업 과정에서 발생할 수 있는 merge conflict도 일으키기도 하고 수정도 해보면서 git에 대해 이해할 수 있는 유익한 시간이었던 것 같다. 3. ja..
재귀 함수(Recursive Function) Computer Science에서 재귀는 자신을 정의할 때 자기 자신을 재참조 하는 방법이라고 정의되어 있고 프로그래밍에서 재귀 호출로 많이 사용된다. public class RecursionTest { static void recursion() { System.out.println("Hello"); recursion(); } public static void main(String[] args) { recursion(); } } 위와 같이 자기 자신을 계속 호출하는 메서드를 재귀 함수(Recursive Function)라고 한다. 하지만 위 코드는 main에서 recursion 메서드를 호출하면 recursion 메서드가 자기 자신을 계속 호출하고 종료 조건..
스트림 자바 8 전까지 많은 데이터를 다룰 때 컬렉션이나 배열에 데이터를 담고 for문, Iterator를 사용했다. 이러한 방법들은 코드의 가독성이 떨어지고 데이터 소스들을 각각 다른 방법으로 다뤄야 한다. 다양한 데이터 소스들을 스트림으로 만들기만 하면 표준화된 방법으로 작업을 할 수 있게 해주는 것이 스트림이다. 스트림의 특징 1. 스트림은 읽기 전용이다. (원본 데이터를 변경하지 않는다.) public class StreamTest { public static void main(String[] args) { List list = Arrays.asList(4, 1, 5, 3, 2); List sorted = list.stream().sorted().collect(Collectors.toList())..
람다식 람다식은 함수를 간단한 식(expression)으로 표현하고 람다식을 익명 함수(anonymous function)이라고도 한다. int max(int a, int b){ return a > b ? a : b; } 일반적으로 정의해서 사용하는 함수는 위와 같다. 함수를 람다식으로 간단하게 표현할 수 있고 그 덕분에 가독성이 높아지고 생산성이 높아진다. (a, b) -> a > b ? a : b 람다식으로 표현하기 앞에서 본 max 함수를 람다식으로 표현하는 방법을 알아보자 1. 메서드 이름과 반환 타입을 제거하고 '->'를 {} 앞에 추가한다. (int a, int b) -> { return a > b ? a : b; } 2. return 값이 있는 경우 return을 생략하여 식으로 표현할 수 ..
제네릭(Generic) 제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시 타입을 체크해주는 기능이다. 객체의 타입을 컴파일 시에 체크해주기 때문에 형변환의 번거로운 작업이 줄고 안정성이 증가한다. public class GenericTest { public static void main(String[] args) { ArrayList arr = new ArrayList(); for(int i =1 ; i 제한 없음