TIL 26

인터페이스 (Interface)

Java 8 이후의 Interface의 특징 1. 인스턴스를 생성할 수 없고 상수만 가질 수 있다. 2. 메서드 body가 없는 추상 메서드를 가진다. 3. default 메서드, static 메서드를 가질 수 있다. default 메서드가 추가된 이유 이미 작성된 인터페이스에서 기능을 추가하려고 할 때, 디폴트 메서드가 없다면 구현체 클래스들이 전부 새로운 메서드를 override해야하지만, 디폴트 메서드가 있으면 추가 작업없이 하위호환 가능 Interface를 써야 하는 이유 public interface Singer { void sing(); } public interface SongWriter { void compose(); } public class SingerSongWriter implemen..

TIL 2023.08.25

OAuth 2.0

OAuth 등장 배경 요즘 개발되는 서비스는 독립적으로 혼자만의 기능을 쌓아올리진 않습니다. 타 서비스의 기능을 본인의 서비스에 접목시켜서 사용자가 사용하기 편하며, 시너지를 발생시켜 더 놀라운 기능을 제공해주죠. 하지만, 이 때 타사의 서비스에서 소유자만 접근 가능 한 리소스를 접근하는 것이 문제가 됩니다. 별도의 인증과 인가 과정이 필요하기 때문이죠. OAuth를 적용하기 전 어떠한 방식으로 이를 구현하는 지 한번 보겠습니다. OAuth 적용 이전 나만의 캘린더는 유저만 접근 가능한 리소스인 구글 캘린더 정보에 접근해야 합니다. 이 때 캘린더에 접근하기 위해서, 다음과 같은 흐름을 거칩니다. 유저에게 구글 ID와 PW를 제공 받고, 이를 통해서 나만의 캘린더는 구글에 로그인을 합니다. 구글에선 이 로..

TIL 2023.08.14

[JAVA] GC

1. 메모리 구조 모든 프로그램은 메모리에 올라와야 실행할 수 있습니다. 따라서 프로그램에 사용되는 변수들을 저장할 메모리가 필요한데 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공합니다. 대표적으로 위와 같은 4가지 영역이 있습니다. Code 영역 실행한 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 합니다. CPU는 코드 영역에서 저장된 명령어를 하나씩 가져가서 처리합니다. Data 영역 전역 변수, 정적 변수가 저장되는 영역입니다. 프로그램의 시작과 함께 할당되어 프로그램이 종료되면 소멸합니다. Heap 영역 런타임 때, 새롭게 생성되는 객체가 저장되는 영역입니다. 더이상 참조되지 않는 객체는 JVM의 가비지 컬렉터에 의해 메모리 해제됩니다. Stack 영역 함수의 호출과 관계..

TIL 2023.08.04

Servlet & Spring Web MVC

초창기 웹 어플리케이션 초기의 웹 어플리케이션은 클라이언트에서 요청하면 단순히 html 파일과 같은 정적인 데이터만 제공할 수 있었다 즉, 사용자마다 다른 화면이 아닌 동일한 화면만 제공을 받을 수 있었다 정적 컨텐츠만 제공하는 웹 서버는 사용자들에게 다양한 화면 전달하기 힘들었고 이 때문에 동적 컨텐츠 제공의 필요성을 느끼게 된다 이러한 문제 해결을 위해 CGI라는 것이 나오게 된다 CGI CGI는 Common Gate Interface의 약자로 동적인 데이터를 제공하기 위한 규약 클라이언트로 부터 요청이오면 서버는 CGI를 구현한 구현체에게 동적인 데이터를 제공해달라고 요청한다 그리고 CGI 구현체는 이를 수행해 결과를 전달함으로써 클라이언트는 동적인 데이터를 제공받을 수 있게 되었다 이렇게 동적인 ..

TIL 2023.07.20

MySQL 아키텍처

1. MySQL 아키텍처 MySQL 접속 클라이언트 대부분의 프로그래밍 언어에 대한 접속 API 제공 쉘 스크립트를 통해 접속 가능 MySQL 엔진 MySQL의 두뇌를 담당 클라이언트 접속과 SQL 요청 처리 담당 쿼리 파서, 전처리기, 옵티마이저(요청된 SQL문을 최적화해서 실행하기 위한 실행계획을 짜는 역할), 실행 엔진 등으로 구성 MySQL 스토리지 엔진 데이터를 실제로 디스크에 저장하거나 읽어오는 역할 MySQL 엔진이 스토리지 엔진을 호출할 때 사용하는 API를 핸들러 API라고 함 운영체제 파일시스템, 하드웨어 실제 테이블 데이터와 로그 데이터를 파일로 저장하는 부분 2. 쿼리 실행 과정 사용자가 SQL 요청을 MySQL로 보냅니다. 가장 먼저 쿼리 캐시를 만나는데 쿼리 캐시는 쿼리 요청 결..

TIL 2023.07.19

Hash table & BST

BST에 대해 설명해 주세요 각 노드의 key는 왼쪽 부분 트리의 key보다 크고 오른쪽 부분 트리의 key보다 작다는 규칙을 가진 트리 그래프와 트리의 차이가 무엇인가요? 더보기 트리는 그래프의 한 종류로 그래프 중에서 방향성이 없고 사이클이 없는 그래프를 뜻한다. 이진탐색트리에서 중위 탐색을 하게 되면, 그 결과는 어떤 의미를 가지나요? 더보기 중위 탐색은 1. 왼쪽 자식 노드 2. 부모 노드 3. 오른쪽 자식 노드 순으로 트리를 순회한다. 위 예시를 1 - 3 - 4 - 6 - 7 - 8 - 10 - 13 - 14 순으로 방문하며 오름차순 정렬이 된다. 이진탐색트리의 주요 연산에 대한 시간복잡도를 설명하고, 왜 그런 시간복잡도가 도출되는지 설명해 주세요. 더보기 이진탐색트리의 탐색 연산 시간복잡도는..

TIL 2023.06.28

Queue vs Stack

Queue는 어떤 자료구조인가요? 먼저 삽입된 요소가 먼저 삭제되는 자료구조 [꼬꼬무1] Array-Base와 List-Base의 경우 어떤 차이가 있나요? 배열로 이루어진 큐에서는 삽입 삭제를 반복하면서 front, rear에 해당하는 위치가 배열의 크기를 넘어갈 수 없어, front 이전 공간이 남아있어도 더 이상 삽입을 할 수 없습니다. 그러나 연결리스트 기반의 큐 같은 경우 계속 동적으로 연결할 수 있기 때문에 크기 제한이 없습니다. Stack은 어떤 자료구조인가요? 먼저 삽입된 요소가 나중에 삭제되는 자료구조 Stack 두 개를 이용하여 Queue를 구현해 보세요 1. 삽입 연산이 일어나면 stack1에 계속 삽입 2-1. 삭제 연산이 일어날때 stack2가 비어있다면 stack1요소를 전부 s..

TIL 2023.06.27

Array vs LinkedList

Array는 어떤 자료구조인가요? 같은 타입의 요소들이 연속하여 저장된 자료구조로 타입 T와 배열의 크기 N이 주어졌을 때, 배열의 각 요소가 0부터 N-1까지 인덱스에 의해 참조됩니다. [꼬꼬무 1] 미리 예상한 것보다 더 많은 수의 data를 저장하느라 Array의 size를 넘어서게 됐습니다. 이때, 어떻게 해결할 수 있을까요? Array 특성상 한 번 정한 크기는 변경할 수 없으므로 더 큰 크기의 배열을 생성한 후, 기존 array의 데이터를 옮겨야 합니다. Dynamic Array는 어떤 자료구조인가요? 일반 배열과 달리 동적 배열은 초기에 정해진 크기를 넘어서는 데이터를 저장할 수 있고 필요에 따라 크기를 조절할 수 있는 배열입니다. Python에 list, Java의 ArrayList가 대표..

TIL 2023.06.26

[JAVA] JVM이 정확히 무엇이고, 어떤 기능을 하는지 설명해 주세요.

JVM JVM은 자바 가상 머신으로 컴파일 된 바이트 코드를 os, 하드웨어에 상관 없이 자바 프로그램이 동일하게 실행 되도록 돕는다. 컴파일, 실행 과정 C/C++ 프로그램의 경우, 여러 소스파일로 나누어 개발하고 링크를 통해 실행에 필요한 모든 코드를 하나의 실행파일(.exe)에 저장하고 이 실행 파일은 모두 메모리에 올려져야 실행된다. 메인 메모리의 크기가 작은 경우 불리함이 따른다. 컴파일은 코드를 읽고 해석하여 전체 소스코드를 기계어로 바꾸어 파일로 생성하기 때문에 빌드 과정은 오래걸리지만 막상 실행하면 기계어를 읽기만 하면 되기 때문에 빠르게 실행된다. 반면 Java에서 컴파일은 기존의 컴파일 과정과 조금 다르게 진행된다. Java의 컴파일러인 javac.exe는 JVM이 이해할 수 있게 중간..

TIL 2023.06.22

[JAVA] Enum을 사용하는 이유

예시 코드를 통해 Enum을 사용하는 이유를 알아 보겠습니다 1. switch(a) { case 1 : print("apple"); break; case 2 : print("grape"); break; case 3 : print("banana"); break; } 주석을 보지 않는 이상 1과 apple사이의 연관 관계를 알기 어렵습니다 2. final static int APPLE = 1; final static int GRAPE = 2; final static int BANANA = 3; switch(a) { case APPLE : print("apple"); break; case GRAPE : print("grape"); break; case BANANA : print("banana"); break;..

TIL 2023.03.28