사용 OS => MacOS - M1
NaverCloud Server 이용하여 terminal 에서 접속하기
ㄴNaverCloud Server 의 공인 IP 복사
ㄴ ssh root@'NaverCloud Server 공인 ip' 입력하여 접속
ㄴ compile 시 문법 검사와 명령어 최적화를 함
ㄴ compile 시 OS 에 맞춰서 machine code 로 변환하므로 OS 에 종속적임을 알 수 있음
gcc hello.c
=> 아래 과정을 한 번에 실행하고, 이름을 지정하지 않으면 a.out 이라는 출력파일이 생성되며 ./a.out 실행 시 파일이 실행됨
=> a.out 에는 instruction Set 이 들어있음
ㄴ gcc -E hello.c > hello.i
=> hello.c 파일을 분석하여 전처리된 소스 코드인 hello.i 파일을 생성 (전처리)
ㄴ (hello.i -> hello.ll => low level language 로 파일이 만들어짐)
=> compiler 는 hello.i 파일을 분석하여 중간 언어인 LLVM 어셈블리 코드인 hello.ll 파일을 생성 (문법 검사, 타입 검사, 최적화 등의 작업이 수행)
ㄴ gcc -S -emit-llvm hello.i
=> hello.ll 파일을 분석하여 기계어 코드가 아닌 Assembly Language인 hello.s 파일을 생성함
=> 중간 언어를 해당 플랫폼의 기계어로 번역하는 작업이 수행됨
ㄴ gcc -o hello.s
=> Assembler 가 hello.s 파일을 분석하여 목적 파일인 hello.o 파일을 생성 (목적 파일은 실행 가능한 파일이 아님)
ㄴ gcc hello.o -o hello.exe
=> linker 는 hello.o 파일과 필요한 라이브러리 파일들을 결합하여 실행 가능한 바이너리 파일인 hello.exe를 생성
=> linker 는 목적파일들 사이의 의존성을 해결하고, 메모리 주소 할당, 심볼 해결 등의 작업을 수행하여 최종적으로 실행 가능한 형태로 만듦
ㄴ 기계어를 변환하지 않고 소스를 읽어서 실행
ㄴ 실행할 때마다 소스파일이 있어야 하고, 문법 검사를 해야해서 실행 속도가 느림
ㄴ OS 에 독립적이어서 OS 에 영향을 받지 않음
=> js 파일은 Linux OS 에서 바로 읽을 수 없으므로 HTML 에 담아서 HTML Renderer 에서 처리하고, JavaScript 코드를 해석하고 실행하여 웹 페이지의 동작을 구현시킴
Web Browser
JavaScript Engine
ㄴ chrome 의 v8 engine, Safari 의 webkit, JDK 의 nashorn, FireFox 의 스파이더 몽키 등이 있음
interpreter
ㄴ engine, player, viewer, Virtual machine, runtime 등
ㄴ engine 과 runtime 은 JavaScript 실행과 관련있음
ㄴ JavaScript Engine : JavaScript 코드를 읽어들이고 실행하는 엔진 역할을 수행
ㄴ runtime : JavaScript 엔진의 실행을 지원하는 환경을 제공
ㄴ virtual machine 은 Java 를 읽어들여 실행
ㄴ Java 는 Hybrid 방식(컴파일 방식 + 인터프리터 방식)을 사용함
ㄴ Java 컴파일러에 의해 Java source code(.java 파일)가 byte code (.class 파일)로 변환되고, 이후 JVM(Java 가상 머신)에서 바이트 코드를 실행하는 방식
ㄴ 이 과정에서 Java 소스 코드는 미리 컴파일되어 바이트 코드로 변환되기 때문에 실행 속도가 인터프리터 방식보다 빠름
ㄴ 바이트 코드는 JVM에서 해석되고 실행되며, JVM은 플랫폼에 맞게 설치되어 Java 프로그램을 실행
ㄴ 컴파일 시간과 실행 시간 사이의 장점을 가지고 있음
ㄴ 소스 코드를 한 번 컴파일하면 컴파일된 바이트 코드는 운영체제 상관없이 실행 가능하므로 반복적인 컴파일 과정이 필요하지 않음
ㄴ "Write once, run anywhere"
=> Java는 하이브리드 방식으로 실행되며, 컴파일러를 통해 바이트 코드로 변환된 후 JVM에서 실행됨
ㄴ 이를 통해 Java는 높은 실행 속도와 OS 독립성을 제공
ㄴ Java가 Hybrid 방식으로 동작하는 이유는 Java 언어의 설계와 Java 가상 머신(JVM)의 역할 때문임
ㄴ Java 언어는 "Write once, run anywhere"를 목표로 설계됨
=> 이는 Java 소스 코드를 한 번 작성하면 어떤 플랫폼 에서도 실행할 수 있다는 의미임
=> 이를 가능하게 하는 핵심 개념은 바로 JVM과 바이트 코드
ㄴ Java 소스 코드는 자바 comiler 에 의해 byte code 로 변환됨
ㄴ byte code 는 JVM에서 해석되고 실행되기 때문에 JVM이 설치된 어떤 플랫폼 에서든 실행 가능
ㄴ JVM은 Java 프로그램의 실행을 담당
ㄴ JVM은 플랫폼 에 종속적인 binary code 를 생성하고, byte code 를 플랫폼에 맞는 기계어로 변환하고 실행함
ㄴ JVM은 byte code 를 해석하고 필요에 따라 Just-In-Time 컴파일을 수행하여 실행 속도를 향상시킴
ㄴ 이러한 JVM의 역할로 인해 Java는 컴파일러에 의해 미리 바이트 코드로 변환되고, JVM에서 해당 바이트 코드를 실행하는 방식인 Hybrid 방식으로 동작함
ㄴ Java 의 Hybrid 방식은 소스 코드를 한 번만 컴파일하면 되므로 반복적인 컴파일 과정이 필요하지 않음
ㄴ JIT(Just-In-Time) 컴파일러는 실행 시점에서 필요한 부분만을 컴파일하여 기계어 코드를 생성하고, 이후에는 해당 코드를 반복적으로 실행하여 성능을 향상
ㄴ AOT(Ahead-of-Time) 컴파일은 프로그램 코드를 미리 컴파일하여 실행 전에 기계어로 변환하는 컴파일 방식
ㄴ AOT 컴파일은 프로그램을 실행하기 전에 전체 코드를 한 번에 컴파일하여 기계어로 변환하므로 실행 시간에 컴파일 과정이 필요하지 않음
ㄴ 컴파일된 코드는 실행할 때 추가적인 변환 과정 없이 직접 실행되기 때문에 실행 속도가 빠르고 효율적임
=> 설치 시점에서 저네 코드를 기계어로 변환하므로 설치하는 데 배터리와 시간이 소요되지만 실행 시간은 빨라짐
ㄴ OS 가 다른 경우 CPU 가 같다고해서 기계어를 그대로 실행할 수 있지 않음
ㄴ 기계어 배치 포맷(형식)이 다르기 때문에 불가능
ㄴ Windows 용 compiler 와 Linux 용 compiler, macOS 용 compiler 가 CPU 가 모두 Intel 일 경우 기계어는 같지만 각각 OS 가 다르므로 기계어 배치형식이 다름
ㄴ Intel CPU 인 macOS 용 compiler 와 M2 CPU 인 macOS 용 compiler 는 OS 가 mac 으로 같지만 CPU 가 다르므로 기계어가 다름
=> 컴파일은 OS 형식에 맞춤
ㄴ Java SE => Standard Edition
ㄴ Java 플랫폼의 기본 에디션으로서, 일반적인 Java 애플리케이션 개발에 사용됨
ㄴ Java 개발 도구, 실행 환경 및 라이브러리를 포함하고 있으며, Java 애플리케이션을 만들고 실행하는 데 필요한 기능을 제공함
ㄴ JRE, Server JRE, JDK 가 있음
JRE
ㄴ JVM + 라이브러리로 여기서 라이브러리에는 java 에서 제공하는 명령파일이 있음
ㄴ 일반 사용자가 PC 에 설치함
Server JRE
ㄴ JRE 에서 PC 용 기능인 UI 출력 기능을 빼고, 여기에 서버 기능을 넣어 서버 실행을 최적화 시킴
ㄴ 서버 관리자가 서버에 설치함
(서버 관리자도 JDK 설치함)
JDK
ㄴ JRE 에 개발도구(컴파일러, 디버거, 배포 생성, 문서 생성)를 추가함
ㄴ 개발자가 PC 나 서버에 설치함
ㄴ JAVA EE = Enterprise Edition
ㄴ Java EE API
ㄴ Java EE 구현 서버
=> 기업용 App 을 제작할 때 필요한 명령이나 도구를 포함하고 있음
=> 동시, 멀티 유저용 App 제작 기술
ㄴ Java EE는 분산 환경에서의 애플리케이션 개발을 지원
=> 분산 컴퓨팅 모델을 통해 여러 대의 서버나 클라이언트 사이에서 작업을 분산하여 처리 (분산 컴포넌트 생성 및 관리 기술)
ㄴ 웹 App을 개발하기 위한 다양한 API 를 제공
ㄴ 웹 서버와 상호작용하며 동적인 웹 페이지 생성, 데이터베이스 액세스, 보안, 세션 관리 등을 처리 (웹 App 제작 및 관리 기술)
ㄴ 자원 공유 및 관리
ㄴ 배포 관리
=> 다양한 기업 환경에서 사용되는 대규모 애플리케이션의 개발과 운영에 필요한 기능과 도구를 제공하여 생산성을 향상시키고 개발자들이 안정적이고 효율적인 애플리케이션을 구축할 수 있도록 지원
https://www.oracle.com/java/technologies/downloads/#jdk17-mac
ㄴ jdk 파일 다운 받기
ㄴ sha256 확인 시 아래와 같음
ㄴ 다운 받은 jdk 파일의 sha256 와 비교하여 확인
JDK 설치
ㄴ 다운받은 jdk -17.jdk 확인
cd /Library/Java/JavaVirtualMachines
macOS 에서 JAVA_HOME 환경변수 추가하는 방법
ㄴ nano 를 이용해 .zshrc 내용 변경해주기
ㄴ JAVA_HOME => jdk-17.jdk 확인
ㄴ javac 와 java version 모두 => 17 버전임을 확인
Windows 환경변수 설정(참고)
ㄴ [확인] 선택하여 JAVA_HOME 설정
ㄴ Path 설정
ㄴ %JAVA_HOME%\bin 을 [위로 이동] 버튼을 이용하여 맨 위로 올려주기!
VSCode 설치
https://code.visualstudio.com/download#
ㄴ java 플러그인 설치
ㄴ Settings 에서 tab 사이즈 2 로 변경
ㄴ Settings 에서 ruler > Editor : Rulers > Edit in settings.json
ㄴ editor.rulers 안에 100 넣어줌 => 100 자인지 알 수 있는 줄이 생김
ㄴ Render Whitespace 를 all 로 변경해줌 => 공백이 몇 칸인지 보기 쉬움
** 참고
아래 사이트 참고하여 개발자 코드 작성 동향 확인해봄
http://sideeffect.kr/popularconvention/#java
VSCode 로 java 파일 실행해보기
ㄴ javac Hello.java 이용하여 컴파일
ㄴ java Hello 이용하여 Hello.java 실행
참고
ㄴ Shell 은 운영 체제와 사용자 사이의 인터페이스로 동작하는 프로그램임
ㄴ Shell 은 명령어를 입력하고 실행하여 운영 체제의 기능을 조작할 수 있도록 도와줌
ㄴ 일반적으로 Shell 은 텍스트 기반 인터페이스를 제공하며, 명령어를 입력하고 그에 대한 결과를 출력함
ㄴ 사용자가 입력하는 명령을 해석하고 해당 명령을 실행하는 역할을 수행
ㄴ Shell 은 명령어 라인 인터페이스(Command Line Interface)를 제공함
ㄴ 사용자는 터미널 또는 콘솔 창에 명령어를 직접 입력하여 실행
각 운영 체제별 Shell 종류
Unix 및 Unix 계통 운영 체제
ㄴ Bash (Bourne Again SHell)
ㄴ sh (Original Bourne SHell)
ㄴ csh (C SHell)
ㄴ ksh (Korn SHell) 등
Windows 운영 체제
ㄴ Command Prompt
ㄴ PowerShell 등
macOS 운영체제
ㄴ 기본적으로 zsh (Z Shell) 이용
'네이버클라우드 > JAVA 웹 프로그래밍' 카테고리의 다른 글
JAVA 4일차 (2023-05-25) 자바 기초 DAY2 (0) | 2023.05.26 |
---|---|
JAVA 3일차 (2023-05-24) 자바 기초 DAY1 (0) | 2023.05.25 |
JAVA 3일차 (2023-05-24) 프로그래밍 개론 DAY3 (0) | 2023.05.24 |
JAVA 2일차 (2023-05-23) 프로그래밍 개론 DAY2_git (2) | 2023.05.23 |
JAVA 1일차 (2023-05-22) 프로그래밍 개론 DAY1 (2) | 2023.05.22 |