알고리즘에서 '그래프(Graph)' 는 굉장히 중요한 자료구조이다. 실제 코딩 테스트에서도 그래프 관련 문제가 자주 나오기 때문에 알고리즘 공부를 한다면 꼭 알아야 한다. 그래프란 노트(Node) 와 에지(Edge) 로 구성된 집합이다. 노드는 데이터의 표현 단위이며 에지는 이를 연결한다. 가장 잘 알려진 그래프 알고리즘인 DFS, BFS, Dijkstra 등 모두 그래프를 알아야 이해할 수 있다. 오늘은 그래프를 표현하는 여러 방법 중 몇 가지를 알아보고자 한다. 코딩 테스트를 준비한다면 꼭 꼭 개념을 공부하고 넘어가도록 하자. 1️⃣ 에지 리스트(Edge List) 에지 리스트는 말 그대로 에지를 중심으로 그래프를 표현하는 방법이다. 보통 2차원 배열을 사용하며 배열에 출발, 도착 노드와 가중치를 저..
1️⃣ HTTP Message 'HTTP Message' 는 서버와 클라이언트 간 데이터가 교환되는 방식이다. 메시지 타입엔 두 가지가 있다. 요청 (Request) : 클라이언트가 서버로 데이터를 전달하여 필요한 동작을 요청한다. 응답 (Response) : 클라이언트의 요청에 대한 서버의 답변이다. HTTP 메시지 는 ASCII 로 인코딩된 텍스트 정보이며, 각각의 정보가 그 역할에 맞게 구분되어 구성된다. 예전 HTTP/1.1 에서는 클라이언트와 서버와의 연결을 통해 공개적으로 전달되었으나, HTTP/2 에서는 최적화와 성능 향상을 위해 HTTP 프레임으로 나누어진다. 위 그림처럼 HTTP 메시지는 다양한 방식으로 제공되는데 API, 설정 파일, HTML 폼 등의 방식이 있다. HTTP/ 의 이진 ..
Git 이란? Git(깃) 은 컴퓨터 파일들의 변경 사항을 추적하고 여러 명의 사용자들 간 해당 파일들의 작업을 조율하기 위한 스냅샷 스트림 기반의 분산 버전 관리 시스템(Distributed Version Control System)과 그 명령어를 말한다. 쉽게 말해 협업 도구로써 소스의 버전 관리를 도와주는 툴이다. 깃은 현재 가장 많이 사용되는 버전 관리 시스템으로 대부분의 웹, 앱 어플리케이션 개발에서 소스 코드 관리에 주로 사용된다. 또한 어떤 파일들의 변경 사항을 지속적으로 추적할 수 있다. 쉽게 말해 한 소프트웨어 개발에 여러 명의 개발자가 투입될 때, 이들이 작성한 소스 코드들을 효율적으로 관리하는데에 사용된다. 만약 A라는 프로젝트를 5명의 개발자가 진행한다고 하자. 개발자 1은 회원가입..
1️⃣ Singleton Pattern Singleton Pattern (싱글톤 패턴) 은 하나의 클래스가 오직 하나의 인스턴스만 가지는 패턴이다. 싱글톤 인스턴스는 최초 생성시 하나만 만들어지며, 해당 인스턴스를 다른 모듈이 공유하며 사용한다. Java에서 가장 기본적인 싱글톤의 형태는 다음과 같다. public class Singleton{ //객체는 하나의 인스턴스만 가진다. private static Singleton instance = new Singleton(); //생성자를 'private'로 제한하여 외부에서 싱글톤 객체를 만들지 못하게 한다. private Singleton() { } //get 메서드만을 통해서 싱글톤 객체를 얻을 수 있다. public static Singleton g..
1️⃣ Time Complexity : 시간 복잡도 우선 시간 복잡도를 알기 위해선 알고리즘(Algorithm) 의 개념을 이해해야 한다. 사전에 의하면 알고리즘은 수학과 컴퓨터 과학, 언어학 또는 관련된 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차이며, 계산을 실행하기 위한 단계적 절차를 의미한다. 즉, 문제 풀이에 필요한 계산 절차 또는 처리 과정의 순서를 말한다. 그렇다면 좋은 알고리즘, 효율적인 알고리즘은 무엇일까? 어떻게 보면 연산의 횟수와 데이터의 크기에 따른 알고리즘의 수행 시간이 적을수록 효율적인 알고리즘이라고 할 수 있다. 이를 계산하기 위한 방법이 시간 복잡도이며, 주로 'Big-O (빅-오)' 표기법을 사용한다. 이는 알고리즘의 수행 시간을 평가하는 척도라고 할 수 있다...
어떠한 값이나 객체가 동등한지 비교할 때 우리는 == 연산자 또는 equals() 함수를 사용한다. 먼저 이 둘의 차이점을 알아보자. 1️⃣ == 연산자 동등 비교 연산자로, boolean 타입인 true / false 를 반환한다. 만약 두 피연산자의 값이 같다면 true, 다르면 false 를 반환한다. 두 객체의 메모리 공간이 같은지 확인하는 참조 비교 방식이다. 모든 타입에 적용할 수 있다. public class Main{ public static void main(String[] args){ { System.out.println(1 == 1);//true System.out.println(2.3 == 2.2);//false System.out.println('a' == 'b');//false ..
개요 자바의 정석 연습문제를 처음부터 풀어보며 모르거나 헷갈리는 기본 개념을 확실히 익히고자 한다. 연습문제를 풀이하는 것이 아닌 내가 공부하면서 중요하다고 생각하거나 잘 몰랐던 개념을 기록할것이다. 문제 [2-3] : 리터럴, 변수, 상수, 키워드의 개념 1. 리터럴 (literal) : 소스 코드 내에서 직접 입력된 값, 종류에 따라 정수, 실수, 문자, 논리 리터럴로 나뉜다. 이는 상수 (constant) 와 같은 의미지만, 상수는 한 번 저장하면 변경할 수 없는 변수로 정의하다는 점에서 구분된다. 2. 변수 (variable) : 변수는 값을 저장할 수 있는 메모리의 공간을 의미한다. 이는 프로그램 내에서 수시로 값이 변경될 수 있다. 또한 변수에는 복수 개의 값이 아닌 하나의 값만 저장할 수 있..
클래스 (Class) 클래스는 객체 지향 프로그래밍에서 설계도와 같은 역할을 한다. 현실 세계에서 어떤 물건을 만들기 위한 설계도가 필요하듯이, 클래스는 객체를 정의하고 만드는데 필요한 설계도이다. 클래스에는 객체를 구성하는 멤버가 명시된다. 구성 멤버로는 필드 (field), 생성자 (constructor), 메소드 (method) 가 있다. 필드 (field) : 객체의 고유 데이터, 상태 정보 등의 속성을 가진다. 선언 형태는 변수와 비슷하다. 생성자 (constructor) : 객체 생성시 초기화를 담당하며, 오버로딩이 가능하다. 메소드 (method) : 객체의 동작을 나타내며, 특정 기능을 수행할 수 있다. 기본 구조는 다음과 같으며, 파일 이름과 동일한 이름의 클래스에만 'public' 을 ..