[JAVA]

서승·2025년 6월 29일

기술 지식

목록 보기
9/12

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의 컴파일 과정

  1. 개발자가 Java 코드 작성 (.java 파일)
  2. build
  3. Java Compiler가 javac의 명령어를 통해 Java Byte Code를 생성
  4. Java Byte Code가 Class Loader를 통해 JVM으로 로드됨
  5. 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만 설치해도 됨.
profile
정진 또 정진

0개의 댓글