개발 일지 168

[자료구조] 트리(Tree)

트리(tree)란 단방향 그래프의 한 구조로, 하나의 뿌리로부터 가지가 사방으로 뻗은 형태가 나무와 닮아 있어서 트리 구조라고 부른다. 트리 구조는 데이터가 바로 아래에 있는 하나 이상의 데이터에 무방향으로 연결된 계층적 자료구조이다. 따라서 데이터를 순차적으로 나열시킨 선형 구조가 아니라, 하나의 데이터 아래에 여러 개의 데이터가 존재할 수 있는 비선형 구조이다. 트리 구조는 계층적으로 표현이 되고 아래로만 뻗어나가기 때문에 사이클이 없다. 즉, 한 노드에서 시작해서 다른 정점들을 순회하고 자기 자신에게 돌아오는 순환이 없는 연결 그래프이다. 컴퓨터의 디렉토리 구조나 월드컵 대진표 등을 트리 구조의 예시로 들 수 있다. 구조와 특징 트리 구조는 위 그림처럼 루트(root)라는 꼭짓점 데이터부터 시작하고..

개발 일지/CS 2023.01.17

[자료구조] 큐(Queue)

큐(queue)는 스택(stack)과 반대로 선입선출의 개념을 갖고 있다. 즉 먼저 넣은 데이터가 먼저 나오는 FIFO(First In First Out)의 자료구조로 대기열이라고도 한다. 예를 들면 고속도로의 톨게이트가 있다. 톨게이트에 먼저 진입한 자동차는 먼저 표를 뽑고 지나가게 되고 뒤에는 온 순서대로 자동차들이 대기하고 있을 것이다. 그리고 순차적으로 표를 뽑고 지나간다. 여기서 Queue에 데이터를 넣는 것을 'enqueue', 데이터를 꺼내는 것을 'dequeue'라고 한다. Queue는 보통 데이터가 입력된 순서대로 처리할 때 사용한다. Queue는 원형 큐(Circle Queue), 우선순위 큐(Priority Queue)와 같이 다른 형식도 있다. 특징 데이터는 하나씩 넣고 뺄 수 있다..

개발 일지/CS 2023.01.16

[자료구조] 스택(Stack)

스택(stack)이란 후입선출의 특성을 갖는 자료구조이며, 한쪽 끝에서부터 데이터(data)를 순서대로 쌓고 쌓은 부분부터 데이터를 뺄 수 있는 선형 구조로 되어 있다. 프링글스를 예로 들면, 과자를 포장할 때 과자는 포장할 때 맨 밑부터 차곡차곡 쌓이게 된다. 그리고 먹을 때는 제일 마지막에 들어온 과자부터 하나씩 꺼내서 먹게 된다. 프링글스는 가장 먼저 들어간 과자는 제일 나중에 나오고, 가장 마지막에 들어간 과자가 제일 먼저 나오게 되므로 스택의 특성에 알맞을 예시라고 볼 수 있다. 이렇게 스택은 입력과 출력이 한 방향으로 이루어진다는 제한적 접근의 특징이 있다. 이런 스택의 자료구조 정책을 LIFO(Last In First Out) 혹은 FILO(First In Last Out)이라고 부르기도 한..

개발 일지/CS 2023.01.16

[Data Type] JSON(JavaScript Object Notation)

JSON은 데이터 교환을 위해 만들어진 개방형 표준 포맷이다. 자료의 종류에 큰 제한은 없고 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다. JSON은 데이터 포맷일 뿐이다. 즉, 통신 방법이나 프로그래밍 문법이 아닌 단순히 데이터를 표시하는 표현 방법이다. 기본적으로 key : value 형태의 구조를 갖고 있다. JSON 특징 일반적으로 서버와 클라이언트 간의 교류에서 많이 사용된다. 자바스크립트 객체 표기법과 매우 유사하다. JSON 표현식은 텍스트로 이루어져 있으므로, 사람과 기계 모두 이해하기 쉬우며 용량이 작다. 특정 언어에 종속되지 않고, 대부분의 프로그래밍 언어에서 JSON 포맷의 데이터를 핸들링 할 수 있는 라이브러리를 제공한다. JSON의 자료형은 null, boolean, strin..

개발 일지/CS 2023.01.13

[알고리즘] 재귀(Recursive)

재귀(recursive)란, 사전적 의미로 '원래의 자리로 되돌아가거나 되돌아'을 의미한다. 컴퓨터 과학에서는 자신을 정의할 때 자기 자신을 재참조하는 방법을 말한다. 즉, 함수에서 자기 자신을 다시 호출해서 작업을 수행하는 것인데 주로 반복문을 구현할 때 사용한다. 예를 들어, n 이라는 정수를 입력 받아서 0 ~ n 까지의 모든 정수의 합을 구한다면 다음과 같이 코드를 만들 수 있다. public class Example { public int sumTo(int n){ if (n < 1) { return 0; } return n + sumTo(n - 1);// 재귀 함수 시작 } } 위 코드에서 n이 5라면 if문을 패스하고 5 + sumTo(n - 1)이 실행될 것이다. 여기서 sumTo(n-1)은..

개발 일지/CS 2023.01.12

[Java] 자바 가상머신(JVM)

자바 가상머신(Java Virtual Machine, JVM)이란, 자바 프로그램 실행환경을 만들어 주는 소프트웨어이다. 자바가 탄생하기 이전에는 C++이 프로그래밍 언어로 많이 사용되고 있었는데 이 C++은 운영체제로부터 독립적이지 못하다는 단점이 있었다. 만약 Windows를 위해 만든 프로그램은 Windows에서만 작동이 가능했고 Mac OS에서 그 프로그램을 실행시키려면 Mac OS에 맞게 새로 프로그램을 만들고 컴파일해야 한다는 것이다. 이러한 문제를 해결하고자 탄생한 것이 자바이며, 자바는 C++처럼 객체지향 프로그래밍이 가능하면서도 운영체제로부터 독립되어있다. 이와 같은 운영체제로부터의 독립성은 JVM이라는 별도의 프로그램을 통해서 구현된다. 즉, 자바는 JVM을 매개해서 운영체제와 소통하며..

개발 일지/Java 2023.01.10

[Java] 스레드(thread)

어떤 애플리케이션이 실행되면 운영체제가 해당 애플리케이션에게 메모리를 할당해주며 애플리케이션이 실행되는데, 이렇게 실행 중인 애플레케이션을 '프로세스'라고 한다. 그리고 프로세스 내에서 실행되는 소스 코드의 실행 흐름을 '스레드'라고 한다. 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행한다. 즉, 스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다. 모든 프로세스에는 한 개 이상의 스레드가 존재한다. 메인 스레드(Maint thread) 자바 애플리케이션을 실행하면 가장 먼저 실행되는 메서드는 main 메서드이며, 메인 스레드가 main 메서드를 실행시켜준다. 메인 스레드는 main 메서드의 코드를 처음부터 끝까지 순차적으로 실행시키며..

개발 일지/Java 2023.01.10

[Java] 스트림(Stream)

자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고 스트림(Stream)이라는 흐름을 통해 다룬다. 여기서 스트림은 배열, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다. 스트림은 데이터 소스를 다루는 풍부한 메서드를 제공하며, 이를 통해 다량의 데이터에 복잡한 연산을 수행하면서도 가독성과 재사용성이 높은 코드를 작성할 수 있다. 스트림은 다음과 같은 핵심적인 특징이 있다. 스트림 처리 과정은 생성, 중간 연산, 최종 연산 세 단계의 파이프라인으로 구성된다. : 스트림 생성 -> 중간 연산 -> 최종 연산 -> 결과 리턴 원본 데이터 소스를 변경하지 않는다. : 오직 데이터를 읽어올 수 있으며 데이터에 대한 변경과 처리는 생성된 스트림 안에서만 수행된다. 일회용이다..

개발 일지/Java 2023.01.06

[Java] 람다식(Lambda Expression)

람다식(Lambda Expression)은 함수형 프로그래밍 기법을 지원하는 자바의 문법 요소이다. 간단히 말해서 메서드를 하나의 식으로 표현한 것이며, 코드를 매우 간결하면서 명확하게 표현할 수 있다는 장점이 있다. 다음은 람다식을 이용해서 표현한 식이다. //기존 메서드 표현 방식 int sum(int num1, int num2) { return num1 + num2; } //위의 코드를 람다식으로 표현한 식 (int num1, int num2) -> { return num1 + num2; } 이렇게 람다식은 반환타입과 메서드명을 생략해서 표현할 수 있다. 따라서 익명 함수(anonymous function)라고 부르기도 한다. 이 외에도 특정 조건이 충족된다면 람다식을 더 축약해서 표현할 수 있다...

개발 일지/Java 2023.01.06

[Java] 애너테이션(Annotation)

애너테이션(annotation)은 주석이랑 비슷한 기능을 하며, 마찬가지로 정보 전달을 위해 만들어진 문법 요소이다. 주석이랑 차이점이 있다면 정보를 전달하는 대상이 다르다는 것이다. 주석은 개발자에게 정보를 전달하는 반면, 애너테이션은 다른 프로그램에게 정보를 전달한다. 즉, 소스 코드가 컴파일되거나 실행될 때 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해 준다. 애너테이션은 @로 시작하고 클래스, 인터페이스, 필드, 메서드 등에 붙여서 사용할 수 있다. public class ExampleClass implements ExampleInterface { @Override public void example() { } } 위 코드에서 @Override는 example()이 추상 메서드를 구현하거나 ..

개발 일지/Java 2023.01.06