공부/f-lab
f-lab 2주차
heeyeon
2024. 3. 26. 14:07
1. 객체 지향 언어가 상태를 가져서 좋은 점은?
- 상태 = 객체의 속성 = 해당 객체가 가지고 있는 데이터 → 객체의 특성을 정의하고 객체가 수행할 수 있는 작업을 결정
- 상태가 중요한 이유
- 데이터 보관 : 해당 객체가 가진 데이터를 보관한다.
- 행동 지정 : 객체가 수행할 수 있는 작업을 결정하는데 중요한 역할을 한다.
- 상호 작용 : 객체들 간에 서로의 상태를 변경하고 이를 통해 상호작용을 할 수 있다.
- 시스템 상태 관리 : 시스템의 상태를 객체들의 상태의 집합으로 나타낼 수 있다.
- 객체에 새로운 상태를 추가하거나 상태를 변경함으로써 기능을 확장할 수 있다.
2. JIT 컴파일러
- 프로그램이 실행되는 동안 필요한 부분을 실시간으로 컴파일해서 기계어로 변환하는 동적 컴파일 방식
- 장점
- 실행 도중에 컴파일을 하기 때문에 실행 환경에 최적화된 기계어를 생성할 수 있다.
- 실행 환경에 최적화된 기계어를 만들기 때문에 여러 플랫폼에서 실행될 수 있다.
- 필요한 코드만을 실행시키기 때문에 메모리를 효율적으로 관리할 수 있다.
3. .class vs .jar vs .war
- .class : 자바 소스 코드를 컴파일하여 생성한 바이트 코드 파일. JVM에서 실행된다.
- .jar
- 자바 애플리케이션 또는 라이브러리 배포에 사용되는 파일.
- 자바 클래스 파일, 리소스 파일, 메타데이터 파일들을 하나로 묶은 압축 파일.
- 클래스 파일과 관련된 리소스들을 패키징하고 배포하는 데 사용된다.
- .war
- 웹 애플리케이션을 패키징하고 배포하기 위한 파일.
- 서블릿, JSP, HTML, 이미지, CSS 및 기타 웹 애플리케이션 구성 요소들을 포함할 수 있다.
4. 동시성 이슈
- 멀티 스레딩 프로그램에서 발생할 수 있는 여러가지 문제
- 경쟁 조건( Race Condition ) : 여러 스레드가 공유된 자원에 동시에 접근하려고 할 때 발생되는 문제
- 데드락( Deadlock ) : 두 개 이상의 스레드가 서로가 소유한 자원을 대기하고 있어 상황을 벗어나지 못하는 상태
- 스레드 안정성( Thread Safety ) : 여러 스레드가 동시에 접근해도 안전하게 사용될 수 있는 프로그램의 속성
- synchronized 키워드 사용
- synchronized 키워드를 메서드나 블록에 선언해서 임계 영역으로 설정한다.
- 임계 영역인 코드는 스레드가 하나만 진입할 수 있고 진입 시점에 락(lock)을 획득하고 실행이 끝나면 락을 해제한다.
- 락이 획득된 임계 영역에 접근하려는 스레드는 대기열에 있게 되고 락이 해제된 뒤 락을 획득하고 접근할 수 있다.
- synchronized vs ReentrantLock
- 둘 다 임계 영역에 재진입할 수 있지만 ReentrantLock에서는 명시적으로 생성되어야 한다.
- synchronized는 공정한 락만 제공하지만 ReentrantLock은 비공정한 락도 제공한다.
- ReentrantLock은 락의 범위를 더 유연하게 세밀하게 설정할 수 있다.
5. 클래스 변수는 GC의 대상이 되는가? 어떤 메모리에 저장되는가? GC의 대상이 되는 변수는?
- 클래스 변수는 메서드 영역에 저장된다.
- GC의 대상은 주로 힙 영역이지만 메서드 영역이나 스택 영역도 대상이 될 수 있다.
- 클래스/인스턴스/지역/매개 변수 모두 GC의 대상이 될 수 있다.
- 어떤 영역에 있든 객체가 참조되어 있지 않다면 GC의 대상이 된다.
- static final 변수는 GC의 대상이 되지 않는다.
6. 메모리가 디스크보다 데이터에 대한 접근 속도가 빠른 이유는?
- 메모리와 CPU는 동일한 버스를 사용하기 때문에 데이터의 전송 속도가 더 빠르고 디스크는 디스크 컨트롤러를 통해 이루어지기 때문에 더 느리다.
- 메모리는 캐시 메모리와 함께 동작하기 때문에 더 빠르고 디스크도 캐시가 있긴 하지만 사용률이 크지 않기 때문에 더 느리다.
- 메모리는 전기적 신호에 의해 데이터에 빨리 접근하지만 디스크는 회전하는 디스크나 플래시 기반 메모리를 사용하여 데이터에 접근하기 때문에 더 느리다.
7. String 상수 풀 저장 위치(java7 vs java8)
- Permanent Generation 메모리 영역 → Metaspace 영역
- permgen 은 자바 힙 영역에 있었고 Metaspace 는 네이티브 메모리 영역에 있다.
- permgen은 메모리가 제한된 크기를 가지고 있고 Metaspace 동적으로 크기를 조절할 수 있다.
8. ArrayList 동작 방식
- 끝에 요소를 추가하는 경우 : arraylist의 상태를 확인하고 현재 배열의 크기의 1.5배의 새로운 배열을 생성한다. 새로 생성한 배열에 원래 배열의 값을 인덱스도 그대로 복사한다. 새로운 요소를 배열의 마지막 인덱스에 저장한다. 원래 배열은 사용되지 않는 메모리로 해제된다.
- 중간에 요소를 추가하는 경우 : arraylist의 상태를 확인하고 현재 배열의 크기의 1.5배의 새로운 배열을 생성한다. 새로 생성한 배열에 원래 배열의 값을 인덱스도 그대로 복사한다. 새로운 요소를 추가할 인덱스부터 기존의 값들을 뒤로 하나씩 미룬다. 해당 인덱스에 값을 저장한다. 원래 배열은 사용되지 않는 메모리로 해제된다.
- 삭제할 경우 : 삭제할 요소의 인덱스 이후의 값들을 앞으로 하나씩 이동하고 해당 요소를 제거한 뒤 배열의 크기를 1 감소시킨다.
9. Static Block이란? 언제 사용하는지? 단점은?
- Static Block
- 클래스가 로드될 때 실행되는 블록. 클래스가 처음으로 로드될 때 한 번만 실행된다.
- 클래스 내에 선언되어야 하고 메서드 내에서는 선언될 수 없다.
- 여러 개 선언될 수 있으며 선언된 순서대로 호출된다.
- static 블록 안에서는 static한 것만 호출할 수 있다.
- 정적 변수나 정적 메서드를 초기화하는 것처럼 클래스를 초기화할 때 꼭 수행되어야 하는 작업이 있을 경우 사용될 수 있다.
- 단점 : 블록 안에서 수행되는 것이 많을수록 초기에 클래스 로드하는데 시간이 지연될 수 있고, 블록이 많이 선언되어 있거나 블록 안의 변수나 객체가 많을 경우 메모리를 많이 쓰게 된다.
10. Pass by value와 Pass by reference의 차이는?
- 매개 변수가 함수에 전달될 때 값이 전달되는 방식
- Pass by value(값에 의한 전달)
- 함수에 전달되는 매개변수의 값이 복사되어 전달된다.
- 함수 내에서 값이 변경되어도 호출자에 영향을 주지 않는다.
- 원래 변수의 값이 변경되지 않는다.
- 기본형 변수에 대해 적용된다.
- Pass by reference(참조에 의한 전달) :
- 함수에 전달되는 매개변수의 참조가 전달된다.
- 함수 내에서 매개변수를 통해 원래 변수를 변경할 수 있고 호출자에게 영향을 준다.
- 객체나 배열 등 참조 타입에 적용된다.
11. Java는 포인터 없는 언어라고 했는데 왜 NullPointerException이 발생하는 걸까요?
- 포인터의 개념은 메모리상에서 주소를 참조하는 변수를 뜻한다.
- 자바에서는 직접적으로 포인터라는 개념을 사용하지는 않지만 참조형 변수가 포인터와 유사한 역할을 한다.
- 참조형 변수가 null을 가리키는 상태에서 객체의 멤버나 메서드를 참조하려고 할 때 NullPointerException이 발생한다.
12. 그 밖의 포인터 관련 개념들
13. JVM의 구조와 작동 원리에 대해 더 깊이 공부하기
※ 용어사전 & 참고사항 ※
- 자바 애플리케이션과 웹 애플리케이션 : 자바 애플리케이션은 로컬 환경에서 실행(자바 기반의 데스크톱 애플리케이션이나 콘솔 응용 프로그램)되며, 사용자와 직접 상호작용하거나, 특정 작업을 수행하는 프로그램을 의미하며, 웹 애플리케이션은 웹 브라우저를 통해 실행되며, 네트워크를 통해 사용자에게 제공되는 서비스를 의미한다.
- 임계 영역 : 여러 스레드가 동시에 접근하면 안되는 코드 영역
- 메타데이터 : 데이터에 대한 데이터. 데이터를 설명하거나 분류하기 위한 정보
- 메타스페이스(Metaspace) : 자바의 클래스로더가 로드한 클래스들의 메타데이터가 저장되는 공간