지금까지 나는 언어를 책으로 공부해본 적이 없다. 백엔드 개발자를 희망하고 지금까지 스프링 부트 프로젝트를 진행해 왔는데, 자바 언어에 대한 깊은 이해를 한 적이 없어 2018년 혹은 2019년도에 산 책을 꺼내본다. 지금까지 코드 잘 작성해왔고 요즘 AI가 다 잘 해주는데 굳이? 라는 생각을 할 수 있다. 맞다. 근데 지금 이 시기가 내가 자바에 대해 잘 몰랐던 부분과, 추상적으로 알고 있는 개념들을 명확하게 이해할 수 있는 마지막 기회라고 생각해 공부하려 한다. 개정 전 책이라 최신 문법 일부가 빠져있어서 해당 부분은 책을 모두 읽고 난 후에 보충하여 공부할 계획이다.

 

 

1장: 자바 시작하기

java : JVM 실행 → 바이트코드 로드/검증/실행 (바이트코드 → 기계어)

  • 인터프리터
  • JIT 컴파일러

javac : Java compiler. java → class 바이트 코드 변환.

 

2장: 변수와 타입

리터럴(literal)

소스 코드 내에서 직접 입력된 값. 상수와 같은 의미지만 구분하기 위해 리터럴 용어 사용

(프로그램에서의 상수 : 값을 한 번 저장하면 변경할 수 없는 변수)

  • 정수 리터럴
    • 10진수
    • 8진수 : 0으로 시작되는 숫자
    • 16진수 : 0x 또는 0X로 시작
  • 실수 리터럴 (기본 타입은 double. float는 리터럴 뒤에 f 혹은 F를 붙여야 한다.)
  • 문자 리터럴 : 작음 따옴표로 묶은 텍스트
  • 문자열 리터럴
  • 논리 리터럴

데이터 타입

  • char : 2바이트 정수. Unicode를 저장하기 위함 ('\u유니코드값(16진수)' 로 저장 가능)
  • int : 4바이트 (byte, short, char는 산술 연산을 하면 먼저 int로 승격되어 연산되고, 결과 타입도 int임)
  • float, double — 부동소수점 ($\pm\ (1.m) * 2^n$ 꼴) … IEEE 754
    • 부호 (1 bit)
    • 가수 m (23 or 52 bits)
    • 지수 n (8 or 11 bits)

타입 변환

  • 묵시적 타입 변환 : 실행 중에 자동으로 변환. 작은 크기 타입이 큰 크기 타입에 저장될 때 발생
    • 정수 → 실수는 O (가수 범위로 인한 정밀도 손실 발생 가능)
    • 실수 → 정수는 X
  • 명시적 타입 변환 (캐스팅)
    • intbyte로 캐스팅해서 저장하면, 4바이트 중, 앞에 3바이트는 버려지고 끝에 있는 1바이트만 저장됨

 

3장: 연산자

  • 단항 연산자 : 증감(++, --), 부호(+, -), 비트(~), 논리(!)
  • 이항 연산자
  • 삼항 연산자

NaN과 Infinity 연산

  • 0으로 나누면 → 컴파일 OK, but 런타임 ArithmeticException
    • 실수 타입 0.0 / 0.0F로 나누면 → / 연산은 Infinity, % 연산은 NaN(Not a Number)
      ⇒ NaN인 이유는 a % b = a - trunc(a / b) * b 인데 b = 0.0이면 Infinity * 0.0이 되고 IEEE 754에 따라 NaN이 된다.
  • Double.isInfinite() → Infinity인지 확인
  • Double.isNaN() → NaN인지 확인
  • NaN은 != 연산자를 제외하고 모든 비교 연산자에서 false 리턴

비트 이동 연산자

  • <<
  • >> : 빈자리는 최상위 부호 비트와 같은 값으로 채워짐
  • >>> : 빈자리는 무조건 0으로 채워짐

 

4장: 조건문과 반복문 (패스)