
JAVA의 특징
- 객체지향 프로그래밍 언어
- 기본 자료형 (Primitive type : 원시 자료형)을 제외한 모든 것들이 객체로 표현되어 있다.
- JVM 위에서 동작하기 때문에 OS에 독립적이다.
- GC (Garbage Collector)를 통한 자동 메모리 관리가 되어 메모리를 직접 헤제하지 않아도 된다.
- JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느린 편이다.
- 다중 상속이나 Type에 엄격하다.
JVM 이란 ?
- Java 와 OS 사이에서 Java Byte Code를 운영체제에 맞게 해석해 주는 역할
- JVM 덕분에 Java가 OS에 구애받지 않고 똑같이 동작할 수 있게 된다.
- Java의 Garbage Collection을 수행하는 것도 JVM이다.
Java 에서 리소스를 정리해주는 인터페이스는 무엇인가
Java에서 리소스를 정리해주는 인터페이스는 AutoCloseable 이다.
Java의 컴파일 과정
- 개발자가 Java 코드 작성 (.java 파일)
- build
- Java Compiler가 javac의 명령어를 통해 Java Byte Code를 생성
- Java Byte Code가 Class Loader를 통해 JVM으로 로드됨
- JVM이 운영체제에 맞게 기계어로 해석
Java 메모리 구조
Method Area
JVM이 실행되면서 생기는 공간이다.
- Class, 전역변수, Static 변수 정보가 저장되는 공간
- Runtime Constant Pool 에는 말 그대로 ‘상수’ 정보가 저장되는 공간
모든 스레드에서 정보가 공유
Heap
new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
Compiler / InterPreter / Java 는 ?
Compiler와 Interpreter
두 가지 모두 고레벨의 언어를 컴퓨터가 이해할 수 있는 기게어로 변환하는 것
- Compiler : 전체 소스코드를 보고 명령어를 수집하여 재구성한다.
- InterPreter : 소스코드의 각 행을 연속적으로 분석한다.
Java 는 ?
Java Compiler는 Java 코드를 JVM이 실행시킬 수 있는 Java Byte Code로 변환된다.
이렇게 변환된 Java Byte Code는 JVM의 Java InterPreter를 이용하여 한 줄씩 실행된다.
- 즉, Java Code는 Java Compiler를 통해 Java Byte Code로 변환되고, Java Byte Code는 Java InterPreter를 통해 한 줄씩 실행되어 기계어로 변환됩니다.
Java의 접근 제어자
public : 어디서나 사용할 수 있도록 열어두는 것
protected : 같은 패키지 내에서만 사용할 수 있게 하는 것
default : 접근 제어가자 없으면 default (상속이 불가능)
private : 같은 클래스 내에서만 사용할 수 있게 하는 것
Java의 원시 타입 (Primitive Type)
- boolean (1), byte(1), char(2), short(2), int(4), long(8), float(4), double(8)
- (1) == 1byte
이외의 모든 것은 참조 타입 객체로 취급한다.
Static 키워드
static 키워드는 여러 인스턴스가 공유하는 기준 값이 필요한 경우에 사용합니다.
- 인스턴스가 생성될 때 만드어지는 변수가 아니고, 프로그램이 처음으로 메모리에 올라갈 때 메모리를 할당받고 바로 사용할 수 있습니다.
- 객체 생성(인스턴스) 없이 사용합니다.
- 모든 객체가 메모리를 공유하고 GC 관리 영역 밖에 있기 때문에, 프로그램이 종료될 때 까지 메모리 값이 유지된 채로 존재하게 됩니다.
Final 키워드
변하지 않는 상수가 필요한 경우에 사용
- 변수명은 전부 대문자로 사용하는게 관례
- static final을 이용하여 지역변수의 상수로 사용할 수 있다.
String vs StringBuilder vs StringBuffer 차이점
String 은 한번 메모리가 할당되면 불편
StringBuilder와 StringBuffer는 내부적으로 가변적인 char[] 배열을 가져서 크기가 가득차면 크기를 늘리면서 유연하게 동작
StringBuilder와 StringBuffer의 차이
두 가지는 비슷하지만, StringBuffer는 내부적으로 synchronized 키워드를 통해 동시 접근을 제어하며, 동기화를 지원한다는 차이가 있다.
따라서 StringBuffer는 멀티스레드 환경에서 사용하며, StringBuilder는 싱글스레드 환경에서 사용한다.
Thread Safe / Synchronized / 동기화
동기화란 ?
동기화란 여러 개의 스레드가 한 개의 자원을 동시에 사용하고자 할 때 하나의 자원에 하나의 스레드만 접근할 수 있도록 하는 개념
- Thread Safe : Synchronized, 동기화를 지원한다. ex) ConcurrentHashMap
- Thread Safe 하지 않음 : Unsynchronized, 동기화를 지원하지 않음 ex) HashMap
CheckedException vs UnCheckedException
CheckedException
컴파일 시점에서 예측할 수 있는 예외를 말하고, 필수적으로 예외처리를 해야 한다.
- ex) IOException, ClassNotFoundException 등
UnCheckedException
실행 중에 발생할 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 된다.
- ex) NullPointerException, ArrayIndexOutOfBoundException 등
Error vs Exception
Error는 실행 중에 일어날 수 있는 치명적인 오류
- Error가 발생하면 프로그램이 비정상 종류되고, UnCheckedException에 속한다.
- Exception은 Error보다 경미한 오류이며, try-catch를 이용해 예외를 다룰 수 있다.
Java 8 변경사항
- Lambda : 함수형 프로그래밍을 지원하기 위한 기능
- Stream : 고차 함수를 지원
- Optional : NullPointerException을 방지하는 기능
Java에서 Null-Safety한 방법
Optinal을 이용하여 null을 방지할 수 있다.
상황에 따라 isPresent(), isEmpty() 등을 통해 null 여부를 확인하는 로직을 작성할 때도 있고,orElseThrow를 통해 RuntimeException을 상속받은 CustomException을 만들어서 예외를 터트리는 방식으로 처리할 때도 있다.
JDK와 JRE
- JDK(Java Development Kit)는 개발자가 Java로 개발하는 데 사용하는 도구로, JRE를 포함
- JRE(Java Runtime Environment)는 자바로 만들어진 프로그램을 실행시키는데 필요한 도구의 역할 운영 서버에는 개발에 필요한 도구가 아닌 프로그램을 실행시키는 도구만 필요하기 때문에 JDK가 아닌 JRE만 설치해도 됨.