DNH

CS 정리 - JAVA

날아 2024. 3. 25. 17:30

2024.03.25 (추가 예정)

 

Java의 특징

더보기
  • 객체 지향 프로그래밍 언어
  • 장점 
    • JVM 위에서 동작하기 때문에 운영체제(OS)에 독립적이다
    • GC를 통해 자동으로 메모리 관리가 가능하다
  • 단점
    • JVM 위에서 동작하기 때문에 실행 속도가 다른 언어에 비해 느리다
    • 단일 상속만 가능하고, 문법이 엄격하다

 

Java의 실행방식

더보기
  • 자바 컴파일러가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환
  • 클래스 로더를 통해 클래스 파일들을 JVM으로 로딩
  • 로딩된 클래스 파일들은 실행 엔진을 통해 해석 
  • 해석된 바이트 코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어진다

 

JVM (Java Virtual Machine)

더보기
  • 자바 가상 머신의 줄임 용어 
  • 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행 
  • 자바 프로그램이 어느 운영체제(OS)에서도 동일하게 작동할 수 있게 해준다
  • 메모리 관리(GC)를 수행하며 Stack 기반의 가상 머신

 

JVM 구조

더보기
  • Class Loader, Excecution engine, Runtime Data Area, JNI, Native Method Library
  • 클래스 로더 : JVM 내로 클랫스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈 
  • 실행 엔진 : 바이트 코드를 실행시키는 역할 
    • 인터프리터 : 바이트 코드를 한줄 씩 실행
    • JIT 컴파일러 : 인터프리터 효율을 높이기 위한 컴파일러로 반복되는 코드를 발하면 네이티브 코드로 바꾼다. 그 다음부터 인터프리터는 네이티브 코드로 바로 사용한다.
    • GC
  • Runtime Data Area : 프로그램 실행 중에 사용되는 다양한 영역
    • PC Register : 스레드가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있다
    • Stack Area : 지역 변수, 파라미터 등이 생성되는 영역 / 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장
    • Heap Area : 동적을로 생성된 오브젝트와 배열이 저장되는 곳
    • Method Area : 클래스 멤버 변수, 메서드 정보, static, final 변수 등이 생성
  • JNI : Java Native Inteface. 자바 애플리케이션에서 C, C++로 작성된 함수를 사용할 수 있는 방법을 제공한다. 대표적인 메서드는 Thread의 currentThread()이다
  • Native Method Libarary : C, C++로 작성된 라이브러리

 

GC (Garbage Collecter)

더보기
  • 힙 영역에서 사용하지 않는 객체(인스턴스)들을 주기적으로 삭제하는 프로세스
  • GC가 수행되는 동안 GC를 수행하는 스레드가 아닌 다른 모든 스레드는 일시정지된다 (stop-the-world)

 

GC 동작방식 

더보기
  • Serial GC 방식 
  • Minor GC (young 영역), Major GC(old 영역)
  • Minor GC는 Eden 영역이 가득 차면 시작된다. Eden 영역에서 참조가 남아있는 객체를 mark하고 survivor 영역으로 복사한 뒤, Eden 영역을 비운다 Survivor 영역도 가득차면 같은 방식으로 다른 Survivor 영역에 복사하고 계속해서 살아남은 객체는 old 영역으로 이동한다.
  • Major GC는 위와 반대로 삭제되어야 하는 객체를 mark한 뒤 지운다. 

 

OOP (Object Oriented Programming)

더보기
  • 객체 지향 프로그래밍 
  • 현실 세계를 프로그램 설계에 반영한다는 개념을 기반으로 한다
  • 프로그래밍에서 필요한 데이터를 추상화시켜 행위와 상태를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
  • 캡상추다 (캡슐화, 상속, 추상화, 다형성)의 특징을 가진다

 

OOP에서 지향하는 점 

더보기
  • 객체지향에서 중요한 것은 객체 
    • 역할 : 모든 객체는 자신이 해야하는 역할을 가지고 있다
    • 책임 : 모든 객체는 잣신의 역할을 가지게 되는 것으로 특정 작업을 해야하는 책임이 생긴다
    • 협력 : 객체 혼자서는 활동할 수 없으며, 다른 객체에 의하여 작업이 이루어지기 때문에 협력이 중요하다
  • 위의 세 특징을 지키기 위하여 객체들은 서로 독립되어야 한다. (독립성을 지키기 위해 싱글톤 패턴을 사용한다. 코드의 재사용을 위해 DI를 사용한다)
  • 결국, 객체지향은 기존에 만들어놓은 코드를 재사용하기 위해 노력한다. 

 

클래스와 객체

더보기
  • 클래스 - 객체를 정의하는 틀 또는 설계도
  • 객체 - 식별 가능한 개체 또는 사물 / 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다

 

객체지향 5대 원칙(SOLID)

더보기
  • SRP(단일 책임 원칙) : 하나의 클래스는 하나의 책임만 가져야 한다
  • OCP(개방-폐쇄 원칙) : 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 다형성을 활용한다.
  • ISP(인터페이스 분리 원칙) : 거대한 인터페이스보다는 더 작고 구체적인 인터페이스로 분리하여 클라이언트는 자신이 사용하지 않는 메서드에는 의존관계를 맺지 않는다
  • DIP(의존관계 역전 원칙) : 추상적인 것은 자신보다 구체적인 것에 의존하지 않는다

 

리플렉션(Reflection)

더보기
  • 구체적인 클래스 타입을 알지 못해도 클래스의 메서드, 타입, 변수들을 접근할 수 있게 해주는 자바 API
  • JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용된다
  • 장점
    • 런타임 시점에서 클래스의 인스턴스를 생성하고, 접근 제어자와 관계없이 필드와 메서드에 접근하여 필요한 작업을 수행할 수 있는 유연성을 가진다
  • 단점
    • 캡슐화를 저해
    • 컴파일 시점에서 해당 타입을 체크할 수 없다

 

제네릭(Generics)

더보기
  • Java의 타입 안정성을 맡는다
  • 컴파일 과정에서 타입 체크를 해주는 기능으로 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형 변환의 번거로움을 줄여준다

 

접근 제어자

더보기
제어자 같은 클래스  같은 패키지 자식 클래스 전체
public O O O O
protected O O O  
default O O    
private O      

 

인터페이스 VS 추상 클래스

더보기
  • 추상 클래스 : 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용 / 단일 상속 / 추상 클래스를 상속하는 집합 간에는 연관관계가 있다
  • 인터페이스 : 구현 객체가 같은 동작을 한다는 것을 보장 / 다중 상속 / 인터페이스를 구현하는 집합 간에는 관계가 없을 수 있다

 

컬렉션 프레임워크 (Java Collection Framework)

더보기
  • 자료 구조를 바탕으로 객체, 데이터들을 효율적으로 관리할 수 있는 라이브러리
  • List, Set, Map, Stack, Queue 

 

직렬화

더보기
  • Java에서는 입출력을 할 때 스트림이라는 데이터 통로를 통해 이동
  • 하지만 객체는 그렇지 않아서 객체를 스트림으로 입출력하기 위해 바이트 배열로 변환하는 것
  • 역 직렬화 : 스트림 -> 객체

 

정적(static)

더보기
  • static은 클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메서드 메모리 영역에 적재할 때 클래스 별로 관리된다
  • 저장된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있다
  • GC 의 관리 영역 밖에 존재하기 때문에 프로그램 종료 시까지 메모리가 할당된 채로 존재해서, 과용하면 안된다

 

Java의 멀티 스레드

더보기
  • 멀티 스레드란 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것이다
  • 멀티 스레드 프로그램은 공유하는 자원에 대해 동기화 문제가 발생할수 있다
  • method area, heap area는 스레드가 공유하는 영역이다
  • 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유하므로, 시스템 자원의 낭비가 적다
  • 하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성이 좋다

 

오버라이딩 vs 오버로딩

더보기
  • 오버라이딩 
    • 상위 클래스의 메소드를 재정의 하는 것 
    • 런타임 다형성
  • 오버로딩
    • 같은 클래스 내에서 동일한 메소드 이름을 가지지만 매개변수의 타입을 다르게 구현
    • 컴파일 다형성

 

자바의 원시타입 종류와 용량

더보기
  • boolean(1)
  • byte(1), char(2)
  • short(2), int(4), long(8)
  • float(4), double(8)

 

eqauls() VS ==

더보기

동일성은 객체의 주소를 비교하는 것이고, 동등성을 객체의 같음을 비교하는 것이다.

기본적으로 가바에서는 Object 클래스에 정의된 equals() 메소드가 동일성 비교를 한다. 따라서 개발자는 원한다면 equals() 메소드를 오버라이딩 해서 동등성의 판단 기준을 정의하면된다. 

 

String , StringBuilder, StringBuffer

더보기
  String StringBuilder StringBuffer
타입 불변 가변 가변
Thread-safe   X O (멀티스레드 환경에 용이)

 

Java 8 

더보기
  • Java 8에서는 람다, 스트림 API, Optional, 날짜 시간 API, StringJoiner 등이 추가되었다
    • 람다 : 함수형 프로그래밍을 지원
    • 스트림 API : 고차함수 지원
    • Optional : Null-safety 지원
    • StringJoiner : 문자열을 간단하게 구분자로 합칠 수 있는 기능을 제공

 

try-with-resource

더보기
  • 자바 7 버전에 도입된 문법
  • 이전 버전에서는 하나 이상의 리소스를 사용할 경우 개발자가 finally 문에서 clase()를 사용하여 자원을 해제시켜야 했다
  • 만약 개발자가 해제하지 않고 누락할 경우 자원이 해제되지 않은 채로 프로그램이 오작동했다
  • 이를 해결하기 위해 try() 안에 사용할 리소스 객체를 명시적으로 선언하여 사용하면, 로직의 성공여부와 관계 없이 JVM에서 자동으로 자원을 반납해주는 기능을 하도록 도입
  • 추가로 자바 9 버전에서는 try() 안에 명시적으로 객체 선언을 하기 보다는 try 문 바깥에서 객체 선언을 하고 생성된 인스턴스의 변수를 넣어줄 수 있도록 바뀌었다.