본 포스트는 카카오 테크 캠퍼스 1기에서 제공하는 패스트캠퍼스 강의에서 배운 내용을 토대로 정리하였습니다.
서류전형과 코테를 통과하여 카카오 테크 캠퍼스 1기에 최종합격하였다!
(๑˃̵ᴗ˂̵)ﻭ
대략 9개월 동안의 과정에서 1파트는 강의제공, 2파트는 협업 클론 코딩, 3파트는 신규서비스 개발 프로젝트(대박 대박!)로 진행한다. 오늘부터 매주, 매일 꾸준하게 velog에 배웠던 내용 중 몰랐던 내용, 필요한 내용을 기록할 예정이다.
앞으로도 java에 관한 내용은 java 태그를, spring관련 내용은 spring태그로 velog에 관리할 생각이다.
(시작이 반이라지만.... 반만 하지말고 완주해보자!)
자바는 c언어에서 시작된 언어이다.
c언어는 포인터로 직접 메모리에 접근해서 핸들링 하기떄문에 의도하지않은 시스템 다운이 종종 일어날 위험을 내포하고있다고 한다.
좀더 안정적인 언어가 없을까? => Java
모호하고 불안한요소들을 과감히 없애버림 => 안정적인 언어다.
안정적이다 => 웬만해선 죽지않는다.
자바는 운영체제나 하드웨어 종속성을 최소화하고, "Write once, run anywhere"라는 모토를 가지고 개발되었다.
자바는 C 언어와는 달리, Java 가상 머신(JVM)을 통해 Java 코드를 실행할 수 있기 때문에 운영체제나 하드웨어에 종속되지 않는다.
이를 통해 Java 언어로 작성된 프로그램은 여러 플랫폼에서 동작할 수 있다.
c언어는 운영체제가
리눅스 => 리눅스 컴파일러로 리눅스실행파일 생성
윈도우 => 윈도우 컴파일러로 윈도우실행파일 생성
각각은 상호호환되지 않는다.
c 언어로 작성된 프로그램은 운영체제에 의존하기 떄문이다.
운영체제는 프로그램을 실행하기 위해 필요한 라이브러리, 시스템 호출, 컴파일러, 런타임 환경 등을 제공한다.
리눅스와 윈도우는 서로 다른 운영체제이기 때문에, 컴파일러는 해당 운영체제에 맞게 프로그램을 컴파일한다.
이때, 컴파일러가 사용하는 라이브러리, 시스템 호출 등은 해당 운영체제에서 지원하는 것을 사용한다.
그 결과로 컴파일된 실행 파일은 해당 운영체제에서만 정상적으로 작동할 수 있다
따라서, 리눅스에서 컴파일된 실행 파일은 리눅스에서만 실행 가능하고, 윈도우에서 컴파일된 실행 파일은 윈도우에서만 실행 가능하다.
또는, 호환성을 위해 크로스 컴파일러를 사용하여 여러 운영체제에서 실행 가능한 실행 파일을 생성할 수도 있다.
하지만 Java는 javac 컴파일러를 통해 .java 소스코드가 .class 확장자명을 사용하는 바이트코드로 바뀌고, 이를 각 jvm에 가상머신에 실행시키면 어느 운영체제에서든 실행이 된다는 장점이있다.
즉
플랫폼에 영향을 받지 않으므로 다양한 환경에서 사용할 수 있다.
프로그램의 구현을 시간의 흐름순이 아닌 객체간의 관계와 협력을 기반으로 프로그램 하는 것
Object oriented programming(OOP) 이라고 함 ( cf. 절차 지향 프로그래밍 procedural programming )
사용 하는 언어 : Java, C++, C#, Python, JavaScript, Ruby 등 다수
절차지향 프로그래밍이란 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다.
자동차 제조를 예로 들자면, 자동차는 엔진, 차체, 핸들, 의자, 바퀴 순으로 차례대로 만들어져야 한다.
서로 분리되어도 안 되고 , 순서가 틀려도 안 된다. 절차지향 프로그래밍 역시 이와 같다.
절차지향언어의 구조는 컴퓨터의 처리구조 와 유사하다. 따라서 실행 속도가 빠르다는 것이 장점이다.
핸들이 고장났다고 엔진부터 바퀴까지 전부 수리해야 한다면 얼마나 비효율적일까 -> 유지보수가 어려움
실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움
윈도우라면 윈도우전용 JVM을, 리눅스라면 리눅스전용 JVM을 설치해줘야한다.
컴파일된 바이트코드를 재컴파일 할 필요없이 바로 JVM에서 돌려서 실행이 가능하다는 것이 위에서 말한 장점인데,
그렇다고해서 JVM을 하나의 통일된 것을 사용하는 건 불가능하다.
각 운영체제에 맞는 JVM이 필요하다는 점은 맞지만, 일반적으로 자바 프로그래머가 직접 JVM을 설치할 필요는 없다.
보통 JDK(Java Development Kit)를 설치하면 해당 운영체제에 맞는 JVM도 함께 설치되기 때문이다.
자바 언어의 가상머신이라는 과정을 한번더 거쳐야 하는 실행 방식은 과거에는 상대적으로 느리다는 이슈가 있었지만,
현재는 JIT(Just-In-Time) 컴파일러 등의 기술이 적용되어 성능이 크게 개선되었다.
따라서 이제는 속도 차이를 느끼지 못할 정도로 빠른 속도로 자바 프로그램이 실행된다.
프로그램을 실행하기 전(컴파일 타임)에 처음 한 번 컴파일하는 대신, 프로그램을 실행하는 시점(런 타임)에서 필요한 부분을 즉석으로 컴파일하는 방식을 말한다.
보통 인터프리터 방식의 언어 구현들이 성능 향상을 목적으로 도입하는 경우가 많다.
Java에서 JIT 컴파일러는 바이트코드를 기계어로 번역할 때 사용한다. 이런 과정에서 JIT 컴파일러는 반복적으로 실행되는 코드를 실시간으로 분석하여 미리 기계어로 컴파일한 뒤 캐싱한다.
이를 통해 같은 코드가 반복해서 실행될 때마다 반복적인 컴파일 작업을 수행하지 않고, 미리 캐싱된 기계어 코드를 사용하여 실행속도를 높일 수 있다.
JVM(Java Virtual Machine)은 약자 그대로 Java 프로그램이 실행되는 가상 머신이다. JVM을 사용하면 Java 프로그램이 다양한 운영 체제와 하드웨어에서 실행될 수 있다.
JVM은 Java 바이트 코드(bytecode)를 실행한다. Java 바이트 코드는 Java 컴파일러에서 생성되며, Java 소스 코드를 컴파일한 결과물이다. 이 바이트 코드는 운영 체제나 하드웨어와는 독립적이며, JVM이 이를 해석하여 실행한다.
JVM은 다음과 같은 기능을 수행한다.
클래스 로더(Class Loader)
JVM은 클래스를 로드하기 위해 클래스 로더를 사용한다. 클래스 로더는 클래스 파일을 JVM 메모리에 로드하고, 이를 실행할 수 있는 형태로 변환한다.
바이트 코드 검증(Bytecode Verifier)
클래스 파일이 로드되면, JVM은 바이트 코드 검증 과정을 수행한다. 이 과정에서, 코드가 안전한지, 적법한지, 스택에 올바른 값이 있는지 등을 검증한다.
인터프리터(Interpreter)
JVM은 바이트 코드를 읽어들이고 실행하기 위해 인터프리터를 사용한다. 인터프리터는 바이트 코드를 한 줄씩 읽어들이고, 이를 기계어로 변환하여 실행한다.
JIT 컴파일러(JIT Compiler)
인터프리터가 바이트 코드를 실행할 때, 같은 코드를 반복적으로 실행하는 경우에는 성능 저하가 발생한다. 이를 해결하기 위해 JIT 컴파일러가 사용된다. JIT 컴파일러는 인터프리터가 실행하는 코드를 분석하여, 자주 실행되는 코드는 기계어로 변환한다. 그리고 이후에는 기계어를 바로 실행하여 성능을 개선한다.
가비지 컬렉터(Garbage Collector)
Java는 자동 메모리 관리를 지원하기 때문에, 메모리를 자동으로 해제하기 위해 가비지 컬렉터가 사용된다. 가비지 컬렉터는 더 이상 사용되지 않는 객체를 탐지하고, 이를 메모리에서 해제한다.
가비지 컬렉터는 주로 자바의 동적메모리 할당 영역인 힙(heap) 영역에서 실행되고, 자동으로 메모리 관리를 하기때문에 개발자가 메모리를 수동으로 할당하거나 해제할 필요가 없다.
네이티브 메서드 라이브러리(Native Method Libraries)
자바의 네이티브 메서드 라이브러리는 자바 언어와는 다른 언어로 작성된 코드를 자바에서 사용할 수 있도록 해주는 라이브러리이다. 이러한 라이브러리는 주로 C, C++, 어셈블리 등과 같은 다른 프로그래밍 언어로 작성된 코드를 자바에서 사용할 수 있도록 제공한다.
JRE (Java Runtime Environment)은 JVM과 Java 애플리케이션을 실행하는 데 필요한 클래스 라이브러리 및 구성 요소를 포함하는 소프트웨어 패키지이다. JRE는 Java 애플리케이션을 실행하기 위한 런타임 환경을 제공하기 위해 설계되었다.
JRE를 사용하면 사용자는 Java 애플리케이션을 실행할 수 있으며, 개발자는 Java 애플리케이션을 개발할 때 사용할 수 있는 Java 클래스 라이브러리를 포함한 필수 구성 요소를 사용가능함. JRE는 Java SE(Standard Edition) 및 Java EE(Enterprise Edition) 버전에 따라 다양한 패키지로 있음.
Java 프로그램에서 자주 사용되는 기본 클래스와 인터페이스의 집합.
크게 3가지 유형이 있다.
Java SE API: Java Standard Edition API는 자바 개발자들이 대부분 사용하는 기본 라이브러리. 입출력, 데이터베이스 연결, 그래픽 등 다양한 기능을 제공한다.
Java EE API: Java Enterprise Edition API는 엔터프라이즈 환경에서 사용되는 라이브러리로, 분산 시스템, 웹 어플리케이션, 데이터베이스 액세스 등을 지원한다.
Java ME API: Java Micro Edition API는 모바일 기기에서 사용하는 라이브러리로, 자바 개발자들이 모바일 애플리케이션을 개발할 때 사용된다.
JDK(Java Development Kit)는 자바 언어로 개발을 할 때 필요한 컴파일러, 디버깅 툴, 실행 환경 등을 포함한 개발 도구 모음이다.
자바 개발을 위해 필요한 컴파일러(javac), 자바 실행 환경(java), 자바 디버깅 툴(jdb) 등이 포함되어 있다.
JDK는 개발자가 자바 애플리케이션을 개발하고, 컴파일하고, 실행하고, 디버깅하는 데 필요한 모든 도구를 제공한다. 또한 JDK는 자바 클래스 라이브러리, 자바 API 문서 등도 함께 제공하므로 개발자는 이를 활용하여 보다 쉽게 개발할 수 있다.