# ch1-자바의 특징
## 1. 자바로 작성된 프로그램은 운영체제에 독립적이다.
- Write once, run anywhere
- 운영체제(OS)에 맞는 JVM(Java Virtual Machine)만 설치되어 있다면 문제 없이 동작한다.
- 어떻게? JVM에 의해서. (JVM은 운영체제에 종속적이다.)
- java 소스 파일이 OS 위에서 실행되기까지의 과정을 이해해야 한다.
## 2. 객체지향
- 객체지향의 특징인 캡상추다(캡슐화, 상속, 추상화, 다형성)가 잘 적용됨
## 3. Garbage Collection
- 가비지 컬렉터가 알아서 메모리 관리를 해준다.
- 자동으로 관리해주기 때문에 비효율적인 면도 있지만 개발자는 프로그래밍에만 집중할 수 있다는 장점이 있음
- 어떻게 비효율적인가?
- GC 실행 시점을 정확하게 알 수가 없음
- GC 실행 시 애플리케이션을 중지시키는 stop the world가 발생하고 이는 오버헤드를 일으킴 -> 성능 저하
### JVM 동작 과정
- (자바 컴파일러에 의해 변환된) java btye code를 JVM에 의해 OS가 이해할 수 있는 기계어로 변환되고 OS에 전달한다.

### JVM

#### JVM 단점
- 속도가 느리다.
- 왜?
- 일반 애플리케이션은 OS만 거치고 하드웨어를 전달하는데 자바 애플리케이션의 경우 JVM을 거치기 때문
- 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니라, 실행 시에 해석되기 때문
- 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 **JIT컴파일러**와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄이긴 했다.
# ch2-변수
## 변수 정의
- 단 하나의 값을 저장할 수 있는 메모리 공간
## 변수를 선언하면?
- 메모리의 빈 공간에 변수 타입에 맞는 저장 공간을 확보한다.
- 변수 이름으로 해당 저장 공간을 접근해서 변수를 사용할 수 있게 된다.
```java
int age = 10 // 변수 선언
```
## 자료형 (data type)
- data의 type에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것
### 기본형과 참조형
#### 기본형 변수(primitive type)
- 계산을 위한 실제 값 저장
- 종류
- 문자형
- char
- **내부적으로 정수(유니코드)로 저장**하기 때문에 정수형 또는 실수형과 연산할 수 있다.
- 정수형
- byte, short, int, long
- 실수형
- float, double
- 정수형과 저장 방식이 달라서 같은 크기라도 훨씬 큰 값을 표현할 수 있다는 장점이 있다.
- 그런데 오차가 발생할 수 있다는 단점이 있음.
- **정밀도가 높을수록 오차 범위가 줄어든다.**
- float: 정밀도 7자리(10진수로 7자리의 수를 오차없이 저장할 수 있다는 뜻)
- double: 정밀도 15자리
- 논리형
- boolean
- 다른 기본형과의 연산 불가능
#### 참조형 변수(reference type)
- 어떤 값이 저장되어 있는 주소를 값으로 갖는다.
- 자바는 C언어와 다르게 참조형 변수 간 연산을 할 수 없기 때문에 실제 연산에 사용되는 것은 모두 기본형 변수다.
- 8개의 기본형을 제외한 나머지 타입
- 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 것
- 참조형 변수를 선언할 때는 변수의 타입으로 변수의 이름을 사용하기 때문에 클래스의 이름이 참조 변수의 타입이 된다.
- 참조 변수는 null 또는 객체의 주소를 값으로 갖는다.
- null의 의미는?
- 어떤 객체의 주소도 저장되어 있지 않음을 의미한다.
```java=
Date today = new Date ();
```
- 객체를 생성하는 new의 결과는 생성된 객체의 주소다. 이 주소가 대입 연산자에 의해 참조 변수 today에 저장된다.
- 참조 변수 today에 의해 생성된 객체를 쓸 수 있게 됨.
## 문자 인코딩
- 컴퓨터는 1과 0밖에 모름. 따라서 문자, 이미지, 동영상, 소리 등을 1과 0에 대응해서 표현해야 한다.
- 따라서 문자표가 필요하다.
### 문자표
- character set
- 숫자-문자 1:1 대응한 표
- 종류: 아스키코드, 유니코드, UTF-8 ...
### 아스키 코드
- character encoding
- 특히 문자를 1과 0으로 표현하기 위해서 문자표가 필요한데 대표적인 문자표가 아스키 코드표다.
- 7bit가 만들어 낼 수 있는 이진수 조합을 문자와 대응한 표(2^7, 128가지 표현)
- 한계: 영어만 표현 가능, 세계 각국의 문자 표현 불가능
### 유니코드
- universal character encoding
- 아스키코드 한계 극복
- 16bit를 활용한 유니코드가 나왔다. (2^16가지, 65536가지 문자 표현 가능)
- 모든 문자에 index를 지정시킨다.
- 그 index를 code point, code unit이라 부름.
- ex) 'A'라는 글자는 0x0041이라는 Index를 가진다.
- 한계: 영어는 1byte로 표현, 한글은 2byte로 표현... 가변적인 표현 방식
- 이때 컴퓨터는 언제 1byte로 읽을지 알 수가 없기 때문에 1btye일때는 앞에 어떤 표시를 한다. 또 다른 표시가 있으면 2byte로 해석하는데 이렇게 해석하는 방식을 인코딩이라 한다.
- 인코딩 방식이 여러가지가 있는데 UTF-8, UTF-16 등이 있는 것.
### UTF-8
- Unicode transformation format
- 유니코드라는 문자 집합을 UTF라는 문자열 인코딩 규칙으로 문자를 코드로 표현하는 것
- 유니코드 문자를 인코딩 하는 방식
- 즉 UTF는 유니코드가 매핑해놓은 표를 보면서 사람의 언어 <-> 기계어로 변경해주는 역할을 한다. (인코딩)
- 8bit를 사용해서 1개의 index 표현
- 유니코드를 위한 가변 길이 인코딩 방식
### UTF-16
- 16bit를 사용해서 1개의 index 표현
# ch3-연산자
- 해당 챕터 관련 흥미로운 영상
- https://www.youtube.com/watch?v=V_taqJlZeeE
# ch5-배열