본문 바로가기
꾸준히

[TIL-181] JIT, 이차원 리스트 문제, 배열 기록 문제

by 무자비한 낭만주먹 2024. 1. 7.

[그림1]. 오늘도 감사한 공부 시작 ~

 

목차
0. 오늘의 학습 시간
1. 오늘 배운 것
2. 오늘의 알고리즘
3. 오늘의 CS
4. 영어 받아쓰기
5. 내일 할 일 (청사진)
6. 감사한 일

 

0. 오늘의 학습 시간
00:00 ~ 02:00(2시간): 리트 코드에서 재귀 관련 문제를 풀고 오늘 공부한 내용을 정리했다.
11:30~13:00(1시간 30분): 점심으로 뿌셔뿌셔랑 소시지를 먹고 와서 바로 공부를 시작했다.
1. 오늘 배운 것
JIT이 뭐하는건지, 클래스 파일은 단순히 텍스트 코드를 바이트 코드로 변환 한 거일 뿐이란 걸 확실히 이해했다. 결국 실행은 JVM이 하는거고 이 과정에서 JIT를 이용해 프로그램 실행의 2가지 방식인 "정적 컴파일"과 "인터프리터" 두 방식이 모두 사용됨을 배웠다.

 

2. 오늘의 알고리즘
배열 기록 문제랑 2차원 리스트 문제를 풀었다.

https://leetcode.com/problems/pascals-triangle/solutions/4400535/no-easy-pascal-s-triangle/

 

no easy pascal's triangle - undefined - LeetCode

View choichanhyeok's solution of undefined on LeetCode, the world's largest programming community.

leetcode.com

https://github.com/choichanhyeok/codetree-TILs/tree/main/231213

3. 이주의 CS
(2023-12-10)
[이제는 눈감고도 말할 수 있는 또 자바의 역사]
- 오픈 소스 공부했을 때 배웠듯이 70~80년대 개인용 컴퓨터(PC)가 보급되면서 Oracle 같은 소프트웨어 기업들이 등장했다.
- 그런 기반 위에 1991년, 내가 태어나기 5년전 즈음 Green이라는 프로젝트가 생기면서 자바의 탄생이 시작됐다.
- 이 프로젝트의 목적은 제임슨 고슬링 형 포함 3명으 ㅣ친구들이 TV와 시청자가 서로 상호 작용 할 수 있는 무언가를 만들기 위해 시작했었다. 지금의 IPTV 같은 느낌이다.
- 그 때 지은 자바의 모태였던 언어의 이름은 Oak였다 (참나무: 고슬링 형 사무실 앞에 있는 나무).
- 나 태어나기 1년 전에 Oak라는 이름의 언어는 커피의 종류였던 Java라는 이름으로 드디어 세상에 등장했다.
- 당시 자바의 모토는 WORK (WorkOnceRunAnywhere): 한 번 개발하면 어디서든 동작하는 것이었다.
- 내가 태어난 해인 96년에 JDK 1.0이 등장했고 그 다음해인 JDK1.1 은 1년만에에 22만 다운로드를 기록하면서 엄청난 성장을 보이게된다.
- 중간에 J2SE(Java 2 Standard Edtion)으로 변경됐는데 이유는 그 당시에 J2EE, J2ME와 같은 기업용, 모바일(블랙베리) 같은 Edition들과 혼동을 막기 위해서였다. (같은 시리즈로 분류하고 싶어서인가? 어쨌든 ..)
- 그렇게 J2SE는 1.4 버전까지 출시되다가 1.5버전 부터는 앞에 1.을 뺀 J2SE 5라는 형식으로 불리게 됐다.
- J2SE 1.5 까지는 그대로 J2SE라는 prefix를 사용했지만 1.6 버전부터는 Java SE 1.6 같은 형식으로 불리기 시작했다.
- Java SE 1.6 까지는 기존에 고슬링 형이 있었던 Sun MicroSystem이 주요 스펙을 만들고 java를 만들어 왔지만 SE 7 부터는 Oracle이 선 마이크로 시스템즈를 인수해 지금에 이르렀다.
- 사실 자바 표준의 이름이 JDK, J2SE, Java SE로 변경됐지만 이 책에서는 자바 표준 버전을 일반적으로 불리는 JDK라고 사용한다고 한다.
-  사실 Java 버전에서 제공되어야 하는 표준 문서가 만들어지면 그 기준에 해당하는 각 벤더에 맞는 JDK가 별도로 만들어진다. 예컨대 IBM과 HP 서버는 별도의 OS를 가지고 있는데, 여기에 최적화되어 있는 JDK를 개발해서 사용하고 있다.
- 단, JDK 버전만 맞으면 어떤 OS에서 개발하든지 적용한 OS에서 컴파일만 하면 애플리케이션 실행에 문제가 없다.
- 그리고 맨날 보는 "OpenJDK"라는 건 "소스에 라이선스 문제가 되는 부분을 제거한 완전 오픈소스 버전의 JDK"를 말한다.
- 알고 있겠지만 JRE는 실행만을 위한 환경이다. JDK에서 개발에 필요한 컴파일 등의 각종 프로그램이 제외된 상태로 설치된다.

(2023-12-11)
[전송계층의 역할: 신뢰할 수 있는 데이터 전송하기]
- 다른 네트워크로 데이터를 전송하려면 네트워크 계층에 있는 라우터의 라우팅 기능을 이용해야한다.
- 근데 데이터 전송을 하더라도 목적지에 도착을 못하는 경우는 어떻게 할까? 더 이상 내 데이터는 신뢰할 수 없는 데이터가 된다.
- 이런 상황에 대비해 "목적지에 신뢰할 수 있는 데이터를 전달"하기 위해 전송 계층이 필요하다.
- 전송계층은 어떻게 전달하는 데이터를 "신뢰할 수 있는 상태"로 만들까?
- 먼저 '오류를 점검"한다. 오류가 발생하면 데이터 재전송을 요구하는데 그 때 하헌우 코치님이 말씀해주셨던 TCP의 재전송이 여기에서 일어나는 거 같다.
- 아하! 그럼 전송 계층은 '오류를 점검하고 대응하는 계층이구나!' 라고 정리가 가능한 거 같다. 근데 사실 역할이 하나 더 있다. 바로 '전송된 데이터의 목적지가 어떤 어플리케이션인지 식별하는 역할'이다.
- 어떤 어플리케이션인지 어떻게 식별하냐고? 바로 'port'를 이용해 식별한다. 예컨대 ssh에 요청을 보낼거면 22번 포트를 써야하는 맥락과 같은 것이다.
- 전송 계층은 2가지로 구분할 수 있다, "신뢰성을 중요하게 생각하냐", 아니면 "효율성을 중요하게 생각하냐"
- 각 관점에 따라 '연결형 통신', '비연결형 통신'으로 구분할 수 있다. 
- 연결형 통신은 상대편과 유기적으로 협력해가면서 통싱하는 방식이고 비연결형 통신은 '닥치고 내 편지 받아라' 전략이다.
- 이쯤 되면 느낌이 오는게 당연하지만 정리하면, 연결형은 TCP이고 비연결형은 UDP이다.

[TCP의 구조]
- TCP로 메시지를 전송할 때 우리는 TCP 헤더라는 걸 붙이는데, 이렇게 TCP 헤더가 붙은 메시지를 우리는 "세그먼트"라는 PDU로 표현한다. (UDP 헤더가 붙으면 데이터그램~)
- IP 헤더와 마찬가지로 일일이 다 외울 필요 없고 중요한 것만 기억하면 된다.
- TCP는 데이터 전송을 위해 먼저 "가상의 동점 통신로"를 확보해야 한다.
- 3 웨이 핸드셰이크는 텍스트로 표현하기 어려워 필요시 164p  직접 확인하기

(2023-12-12)
[응용 계층의 역할]
- 웹 페이지를 볼 때는 인터넷 익스플로러 같은 웹 브라우저를 사용하는 거 기억 나는가? 이렇게 애플리케이션은 사용자가 하고 싶은 일들을 할 수 있도록 돕는 역할을 한다. 
- 이런 애플리케이션은 "서비스를 요청하는 측"에서 사용하는 애플리케이션으로 분류할 수 있는데 이는 서비스를 제공하는 측도 있다는 의미이다. 그냥 어렵게 설명했지만 간단히 얘기하면 서버-클라이언트 모델에서의 애플리케이션을 얘기했다.
- 여태껏 설명한 애플리케이션은 응용 계층에서 동작한다. 
- 이 애플리케이션 계층은 "세션 계층과 표현 계층을 포함"한다.
- ** 사실 우리가 HTTP 같은 프로토콜 얘기를 자주 하는데, 이 프로토콜은 결국 클라이언트 측 애플리케이션과 서버 측 애플리케이션이 통신하는데 필요한 운용계층의 프로토콜을 의미한다 ** -> 아~~~~~주 중요한 논점
- 우리가 흔히 알고 있는 DNS, FTP, SMTP, POP3, HTTP등의 프로토콜들이 여기 속한다.

** [웹 서버의 구조란?] **
- 인터넷에서 핵심적인 역할을 하고 있는 WWW에 대해서 잘 알고 있는가? W3나 웹 이라고 불리는게 이거다.
- ** WWW는 HTML, URL, HTTP라는 세 가지 기술로 이루어져있다. **
- http 1.1부터 keepalive라는 기능이 생겼는데, 데이터 교환이 모두 끝날 때 까지 연결을 끊지 않는 구조다. 근데 이러면 무상태가 아니지 않나?, 연결을 유지하는거랑 상태를 가지는거랑은 전혀 다른 개념인가?
- HTTP/1.1 에 비해 HTTP2 에서 개선된 점은 "요청을 보낸 순서대로 응답을 반환하지 않ㅇ도 된다."는 것이다. 그래서 콘텐츠를 빠르게 표시할 수 있다.

(2023-12-13)
[JIT 컴파일러는 도대체 뭘까?]
- 프로그램 실행을 빠르게 하기 위해 자바등의 언어에서 사용하는 "프로그램 실행시에 적용되는 기술"이다.
- 역사적으로 보면 컴퓨터 프로그램을 실행하는 방식은 두가지 이다. "인터프리트 방식"과 "정적 컴파일 방식"이다.
- JIT는 이 두 가지 방식을 "혼합"한 거라고 보면 된다.
- 변환 작업은 인터프리터에 의해서 지속적으로 수행되지만, 여기에 필요한 코드의 정보는 캐시에 담아두었다가 재사용한다.
- ** 아니 근데 javac명령어를 사용해 클래스 파일 만들면 끝나는 거 아닌가? JIT는 언제 사용하는거지? **
- 사실 javac로 컴파일 해서 바이트 코드를 만들어내는 건 그냥 텍스트로 만든 java 파일을 어떤 OS에서도 수행될 수 있도록 변환한 거 뿐이다. 컴퓨터가 이걸 보고 다시 알아먹게 하려면 다시 변환 작업을 거쳐야 하는데 이 작업을 JIT 컴파일러가 수행한다고 보면 된다 (진짜 중요*******)

[자바 소스 코드] -> [자바 컴파일러] -> [컴파일 된 ByteCode] -> [JVM] -> [기계 코드] -> [하드웨어 및 OS]

 

4. 오늘의 무자막 시청
오늘의 영상: 라따뚜이 (초중반)
- 결국 주방에 몰래 들어가 요리를 하기 시작했다. 쥐가 주방에서 와리가리 하는게 위생상 괜찮은건진 모르겠지만 어쩄든 재미는 있었는데, 오늘 분량동안 한마디도 안해서 그냥 멍 떄리고 봤다.

 

5. 내일 할 일 (청사진)
1. 자바의 신 마저 공부하기
2. 점심시간에 코드 트리, 프로그래머스(sql) 풀기
3. flutter 앱 개발 공부
4. 점심시간 끝나기 30분 전에 네트워크 공부하기

 

6. 감사한 일
오늘 업무에서 신규 개발건을 받게됐는데 이번에 아예 새롭게 나오는 기능이어서 나름대로 좋은 코드를 써보려고 노력했다. (코드 컨벤션은 지켜야 하기에 한계는 있었지만) 이렇게 조금씩이라도 좋은 코드를 써보려고 노력할 수 있다는 사실이 감사했고 빨리 개인 프로젝트 론칭해서 그 쪽에다 다양한 시도들을 해봐야겠다는 마음이 들었다.

 

 

오늘 하루도 공부할 수 있어 크게 감사합니다

2023-12-13 개발자 최찬혁