일간 학습목표
- 참조의 개념 이해하기
- 운영체제와 자바, JVM을 이해하고 JDK API 활용하기
- 프로젝트, 모듈, 패키지, 클래스 구현을 이해하기
- JDK와 OpenJDK의 차이점을 이해하기
간단한 소회
어제와 마찬가지로 모르는 용어를 먼저 공부하고, 수업 중 배운 내용을 나의 언어로 표현해보자.
학부때 써먹었던 이스라엘식 메타인지 학습법이 요긴하게 쓰일 때가 왔다.
API (Application Programming Interface)
두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘이다.
간단한 예) 네이버 지도 API와 블로그 글쓰기 에디터의 연동, 기상청 날씨 수집 API와 스마트폰의 날씨 앱
API는 세 단어로 이루어진 줄임말이다. 이를 하나씩 풀어보면 다음과 같다.
1. Application이란 고유한 기능을 가진 모든 소프트웨어를 말한다.
2. Programming은 애플리케이션의 작동 방식으로 이해했다.
3. Interface는 각 애플리케이션이 요청과 응답을 통해 통신하는 방법을 말한다.
즉, 고유한 기능을 가진 소프트웨어가 작동하기 위해 어떻게 요청과 응답을 주고받을지 정의하는 과정이다.
수업중 배운 API의 정의 |
|
참고 및 출처: https://aws.amazon.com/ko/what-is/api/
API란 무엇인가요? - 애플리케이션 프로그래밍 인터페이스 설명 - AWS
GraphQL은 API용으로 특별히 개발된 쿼리 언어로서, 클라이언트에게 요청한 데이터만 제공하는 것을 우선으로 합니다. 또한 API를 빠르고 유연하며 개발자 친화적으로 만들도록 설계되었습니다. RES
aws.amazon.com
참조(Reference)
참조의 사전적 의미는 '서로 엇비슷한 비교 대상을 놓고 살피다'라는 뜻이다.
한편 코딩에 있어 참조란 다른 변수를 가리키는 변수로, 사실상 동음이의어라고 생각하는 것이 좋겠다.
문법과 구조를 따져보자. 먼저 어떤 데이터가 어떤 범주에 속한 것인지를 살펴본다.
일상에서는 큰 범주에서부터 작은 범주 순으로 띄어쓰기를 넣어 표기한다.
서울 동대문구 이문동 |
이를 코딩 언어 (또는 자바)로 표기하면 띄어쓰기 대신 . 을 사용한다.
서울.동대문구.이문동 |
위의 예시는 일상에서 흔히 쓰이는 작은 범주가 보다 큰 범주 안에 포함되는 정보를 표기하는 방법이다.
이를 코딩 환경에 맞춰 변환할 수 있다.
system.out.printLn() |
System의 out에서 printLn()이라는 명령어를 수행하라는 의미가 된다.
큰 범주에서 작은 범주로 이어지며 상호간 소속관계가 존재한다는 것까지는 잘 이해된다.
그런데 이 내용이 참조와 어떻게 연결되는 것인지 모르겠다. 참조는 다른 변수를 가리키는 변수다.
단순히 범위가 작아지는 것과 '연산'이 무슨 의미가 있는지 모르겠다.
( . 이 귀속연산자인 것은 맞나? )
* (해결?) . 은 좌에서 우로 실행되는 일차식 연산자다. 주소 대신 코딩 용어로 적힌 예시에 일차식 연산자를 대입해보면 이해하기 편하다.
system.out.printLn() |
-> 좌에서 우로 연산되니, system의 out에서 printLn()을 실행하라는 것이다. |
즉, . 연산자가 좌측의 큰 범주에서 우측의 작은 범주 방향을 가리킨다고 이해했다. (틀렸을 수도 있음)
* 참고 사항: 코드에 밑줄이 있다면 바로 불러올 수 있다.
참조관계
주소를 통해 연결된 상태에서 CRUD(Create, Read, Update, Delete) 할 수 있는 상태.
먼저 CRUD가 무엇인지 정의하자. CRUD는 데이터베이스나 소프트웨어에서 데이터를 처리하는 기본적인 기능을 의미한다.
특징 4가지를 살펴보자.
1. 대부분의 소프트웨어에 구현되어 있다.
2. 데이터 관리 체계의 핵심 기능으로, 애플리케이션에 반드시 구현되어야 한다.
3. 데이터의 일관성과 무결성을 유지할 수 있도록 돕는다.
4. 데이터베이스, 파일 시스템, 웹 애플리케이션 등 다양한 시스템에서 구현될 수 있다.
이런 개념을 익숙한 예시에 적용시켜보자.
Create | Read | Update | Delete |
계정 생성 | 로그인 | 비밀번호 변경 | 회원 탈퇴 |
JVM (Java Virtual Machine)
JVM이란 자바 프로그램을 실행하는 실행환경을 말한다. 정확히는, 가상 머신에서 자바를 실행한다는 이야기다.
먼저 가상 머신을 정의하자면 컴퓨터 안의 컴퓨터라고 할 수 있다.
하드웨어 하나에 소프트웨어를 할당하는 것이 아니라, 소프트웨어 안에 소프트웨어를 따로 두는 개념이다.
운영체제 | ||
33.3% | 33.3% | 33.3% |
프로그램1 | 프로그램2 | 가상머신 |
가상 머신에는 무려 OS도 설치할 수 있지만, 결국 OS에서 실행 중인 여러 프로그램(프로세스) 가운데 하나일 뿐이다.
회사의 영업이익을 부서와 직급, 연차에 따라 분배하듯 가상 머신 역시 OS로부터 메모리를 할당받는다.
즉, OS가 가진 프로세스 메모리 힙 = 가상머신 메모리 힙이라는 공식이 성립한다.
* 힙(Heap): 무언가가 잔뜩 쌓여있는 더미를 말한다. 종류 불문의 잡다한 데이터가 용량의 한계까지 쌓인 모습을 떠올렸다.
OS는 보통 힙을 활용해 JVM 힙 영역을 만든다. 따라서 OS의 스택을 활용해 JVM의 스택을 만든다.
스택이란 순서에 따라 저장된 데이터를 말한다. 가장 마지막에 저장된 데이터가 가장 먼저 삭제되는 구조(Last In Last Out)다.
먼저 삭제 | 데이터4 | |
데이터3 | ||
데이터2 | ||
나중에 삭제 | 데이터1 |
Memory Map (M/m) Os = 주소록 → 메모리 구조 cs = Code segment = 코드 영역 = 텍스트 관리 영역 ds = Data segment = 값 관리 static = 정적 관리 = static, class, (struct, union, function)→ 자바에는 없다. heap = 자유영역 = 동적할당 → 프로그램이 실행중이지 않은 영역 (매번 실행중이지 않은 영역을 동적으로 변경해 할당) → 자유영역공간에 동적할당하는 영역 관리 → 자바에서는 new연산자로 메모리 할당 → 실행이 끝나면 GC(Garbage Collection)가 메모리를 소거한다. stack = 고정 → 스택이 꽉 차면 프로그램이 실행되지 않는다. OS → JVM (Static, heap, stack) → GC |
JVM의 메모리 구조
아직 이해하기 어려운 부분이 많아 수업 중 메모한 내용을 그대로 옮겨왔다.
- 메소드 영역: 클래스 정보, Static 변수, 메소드 코드 등
- 힙: 객체 배열 참조형
- 스택: 메소드 호출시 사용되는 지역변수, 매개변수, 리턴 값 등
- PC Register: 현재 실행중인 명령어의 주소를 저장하는 곳
- Native Method Stack: 자바가 아닌 네이티브(C, C++) 코드 실행
종속: OS의 메모리(exe 공간)를 사용한다.
독립: OS의 메모리(exe 공간)를 사용하지 않음.
힙(Heap)
코드 → 파일명.java → 파일명.class
- 이클립스에서 불러올 때(아니면 파일을 새로 만들 때)는 역순으로 진행된다.
프로젝트>모듈>패키지>클래스
클래스: 패키지 내에서 실제로 작동하는 개체들 → 기능 + 속성
패키지: 각 모듈 내에서 클래스들을 세부 구분한다 → 문학부, 교무실, 운동기구 등 →
모듈: 큰 기능과 목적을 가진 범위
프로젝트: 여러개의 모듈, 패키지가 실행되는 단위 프로세스
예시) JVM의 메모리 구조를 회사에 비유한다면?
회사 프로젝트 | ||
영업 모듈 | 기획 모듈 | 경영지원 모듈 |
해외영업 패키지 | 전략기획 패키지 | 대표이사실 패키지 |
미주 클래스 | 마케팅 클래스 | 비서실 클래스 |