# 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에 전달한다. ![image](https://hackmd.io/_uploads/r1_ROlWip.png) ### JVM ![image](https://hackmd.io/_uploads/ryd2ne-s6.png) #### 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-배열