오늘은 부트캠프 23일차이다. 벌써 벨로그에 공부한 것을 적는 것도 5주차가 되어 버렸다. 자바 기초를 배운지 몇 일 되지도 않았는데 심화과정까지 온 것도 신기하다. 지금 뭘 배웠는지 그 때 당시에는 아무것도 몰랐지만 확실한 것은 캠프 전보다는 개발에 대해 잘 알아가고 있고, 프로그램에 대한 지식뿐만 아니라 같은 팀원과의 협업에 대해서도 배워가는 것 같아 좋았다.
오늘 배운 것
1. JAVA 코드가 실행되는 과정
.java파일을 만들기
--> 자바 컴파일러
--> .class 생성됨
--> .class파일을 JVM에 입력하여 클래스 파일을 로드하고 실행된다.2. JVM이 작동되는 3가지 방법
2-1 클래스 로더 서브시스템
-.class에서 바이트코드를 읽고 메모리에 저장되고 여기서 정적 변수는 원래 값으로 할당되고 정적 블록이 실행됩니다.
2-2 런타임 데이터의 5가지 영역
2-2-1 메서드 영역: 정적 변수를 포함하여 모든 클래스 수준 데이터가 여기에 저장된다.
2-2-2 힙 영역: 모든 개체와 해당 인스턴스 변수 및 배열이 여기에 저장된다.
2-2-3 스택 영역: 모든 스레드에 대해 별도의 런타임 스택이 생성된다.
2-2-4 PC레지스터: 각 스레드에는 별도의 PC레지스터가 있고, 명령이 실행되면 현재 실행 중인 명령의 주소를 보유하고 PC레지스터는 다음 명령으로 업데이트된다.
2-2-5 네이티브 메서드 스택: 네이티브 메서드 정보를 보유하고 있다. 모든 스레드에 대해 별도의 기본 메서드 스택이 생성된다.
*Native Method Libraries: Excution Engine에 필요한 Navtive Libraries의 모음이다.
2-3. 실행 엔진
-2-2에서 할당된 바이트코드는 실행 엔진에 의해 실행된다.
2-3-1 인터프리터: 바이트코드를 더 빠르게 해석지만 실행 속도가 느리다. 단점은 하나의 메서드를 여러 번 호출할 때마다 새로운 해석이 필요하다는 점이다.
2-3-2 JIT 컴파일러: 실행 엔진은 바이트 코드를 변환할 때 인터프리터의 도움을 받지만 반복되는 코드를 발견하면 전체 바이트 코드를 컴파일하고 네이티브 코드를 변경하는 JIT 컴파일러를 사용한다.
2-3-3 Garbage Collector: 참조되지 않는 객체를 수집하고 제거한다.
추가적인 키워드
1. Block
-필드의 초기화
-자바에서 필드는 초기화하지 않아도 변수의 타입에 맞는 초기값으로 자동으로 초기화된다.1-1. 명시적 초기화
-생성자를 이용한 초기화는 객체의 생성과 동시에 필드를 초기화하는 방법
1-2. 초기화 블록
-클래스 필드의 초기화만을 담당하는 중괄호({})로 둘러싸인 블록의 의미한다.
-static 키워드의 유무에 따라 인스턴스와 클래스 초기화 블록 두 가지로 구분된다.1-3. 필드의 초기화 순서
1-3-1. 클래스 변수 : 기본값 --> 명시적 초기화 --> 클래스 초기화 블록
1-3-2. 인스턴스 변수 : 기본값 --> 명시적 초기화 --> 인스턴스 초기화 블록 --> 생성자2. Scope
-프로그램상에서 사용되는 변수들의 사용 가능한 범위를 가진다. 그 범위를 변수의 스코프라고 한다.
3. Auto Boxing
-원시 타입의 값을 해당하는 Wrapper 클래스의 객체로 바꾸는 과정을 의미
-원시 타입이 Wrapper 클래스의 타입의 파라미터를 받는 메서드를 통과할 때
-원시 타입이 Wrapper 클래스의 변수로 할당될 때
-return하는 text의 타입은 원시 타입이지만 해당 메서드의 리턴 타입은 Integer이다.4. Unboxing
-Wrapper 클래스 타입을 원시 타입으로 변환하는 과정의 의미
-Wrapper 클래스 타입이 원시 타입의 파라미터를 받는 메서드를 통과할 때
-Wrapper 클래스 타입이 원시 타입의 변수로 할당될 때5. Call By Value
-인자로 받은 값을 복사하여 처리를 한다.
-장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
-단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.6. Mutable(변경할 수 있는, 가변)
-가변 객체는 불변객체와 다르게 heap 영역에 생성된 객체를 변경 할 수 있다.
대표적인 가변 객체는 List, ArrayList, HashMap, StringBuilder, StringBuffer 등이 있다.7. Immutable(변경할 수 없는, 불변)
-불변 객체라는 것은 이 객체의 값을 heap 영역에서 바꿀 수 없다라는 뜻이다.
대표적으로 불변 객체는 String, Boolean, Integer, Float, Long 등이 있다.