이 글은 "Java의 정석 (남궁 성 지음)"을 읽고 주관적으로 요약한 글입니다.
1. 변수
- 변수
- 단 하나의 값을 저장하는 메모리 공간
- 변수 타입
- 변수에 저장될 값의 타입
- 변수 이름
- 변수의 구별을 위해 붙인 이름
- 변수의 초기화
- 변수 사용 전 처음 값을 저장하는 것
- 초기화하지 않으면 쓰레기값
- 대입 연산자 '=' 이용
- 여러 변수를 콤마 ','로 한줄에 선언 가능
- thousand = hundred * 10 -> hundred 값을 "읽어" 10을 곱한 값을 thousand에 저장
- 두 변수의 값 교환
- tmp 저장소 이용
- 변수의 명명 규칙
- 예약어(keyword)로 사용 불가능
- 특수문자는 '_'와 '$'만 사용 가능
- 카멜 케이스
- 클래스는 첫 문자가 대문자
- 메소드나 변수는 첫 문자가 소문자
2. 변수의 타입
- 기본형과 참조형
- 타입은 변수의 공간의 크기와 저장형식을 정의
- 기본형
- 값(data)을 저장 - 값(data)의 종류(type) = 자료형 (data type)
- 문자
- 숫자
1) 정수
2) 실수
- 참조형
- 값이 저장된 주소를 값으로 가짐
- 변수 타입은 클래스의 이름 사용
- C언어와 달리 참조형 변수끼리(주소끼리) 연산이 불가능하여 실제 연산은 값끼리 - 객체의 주소(참조형 변수의 크기)는 JVM이 32bit면 4byte, 64bit면 8byte
- 정리
- 기본형의 타입은 자료형
- 참조형은 타입 (객체의 종류)
- 타입은 자료형을 포함하는 의미의 용어
- 기본형
- 논리형
- Boolean - 문자형
- char
- 유니코드 사용으로 2byte - 정수형
- byte, short, int, long
- 기본 자료형은 int
- CPU 처리 효율이 가장 좋은 int를 가장 많이 사용 - 실수형
- float, double
- 기본 자료형은 double
- 정밀도가 중요 - 값의 범위 -2n-1 ~ 2n-1 - 1 (n은 bit)
- 논리형
- 상수
- 상수
- 키워드 'final'을 사용
- 사용 전에만 초기화하면 되고, 초기화되면 변경 불가능 - 상수의 장점
- 변수명을 응용한 명확한 의미
- 값을 수정시 상수의 초기화만 바꾸면 됨
- 상수
- 리터럴
- 리터럴
- 그 자체로 값을 의미하는 상수 - 리터럴의 타입
- 접미사로 타입 구분
- 정수형
- 접미사가 없으면 int
- long : 'l' or 'L'
- byte나 short는 접미사 없이 사용
- 큰 숫자를 편하게 읽도록 '_' 구분자 사용 가능
ex. 100_000_000L == (long) 100000000 - 실수형
- 접미사가 없으면 double
- float : 'f' or 'F'
- 'e' : 10의 제곱을 나타내는 기호
ex. 3e1 == 30.0d
- 'p' : 2의 제곱
- 정수형
- 리터럴의 진법
- 접두사로 진법 구분- 16진수
- '0x' -> 0x10 - 8진수
- '0' -> 010 - 2진수
- '0b' -> 0b10
- 16진수
- 타입의 불일치
- 저장범위가 넓은 타입에 좁은 타입을 저장 가능 - 문자/문자열 리터럴
- 문자 : 작은 따옴표 ('), 빈 칸을 허용하지 않음
- 문자열 : 큰 따옴표 ("), 빈 칸 허용 - 문자열 리터럴의 덧셈 연산
- 덧셈 연산자로 문자열 결합 가능
- String이 아닌 피연산자를 String으로 자동으로 변환 (int, bool, null)
- 왼쪽에서 오른쪽 순서
1) 7 + 7 + "" = "14"
2) "" + 7 + 7 = "77"
- 리터럴
- printf
- println은 변수값을 그대로 출력
- 같은 값을 다른 형식으로 출력하고 싶을 때 printf 사용
- printf는 줄바꿈이 없음 -> "%n" 추가
- 지시자(specifier)를 통해 여러 형식으로 변환
- 지시자
%b | boolean |
%d | decimal, 10진수 |
%o | octal, 8진수 |
%x, %X | hexa-decimal, 16진수 |
%f | floating-point, 부동소수점 |
%e, %E | exponent, 지수 표현형식 |
%c | character, 문자 |
%s | string, 문자열 |
- 지시자 활용
- 출력될 값이 차지할 공간 지정
- %5d : [___10]
- %-5d : [10___]
- %05d : [00010] - 16진수
- %x : ffffffffffffffff
- %#x : 0xffffffffffffffff
- %#X : 0XFFFFFFFFFFFFFFFF - 2진수 변환
- Integer.toBinaryString(int i) : 정수를 2진수 문자열로 반환
- %s 사용 - 소수점
- %14.10f : 전체 14자리 중 소수점 아래 10자리 - 문자열
- %.8s : 왼쪽 8글자만 출력
- 출력될 값이 차지할 공간 지정
- Scanner
- 입력을 받아 처리하는 클래스
- Console 클래스는 IDE에서 동작하지 않음
- 입력 받는 방법은 다 똑같다고 함 - import java.util.*
- Scanner scanner = new Scanner(System.in)
- 메서드
- nextLine()
- nextInt()
- nextFloat() - 입력받은 문자열 타입 변경
- Integer.parseInt()
- Float.parseFloat()
3. 진법
- bit / byte
- bit : 한 자리의 2진수
- byte : 1비트 8개
- 워드(word)
- CPU가 한 번에 처리할 수 있는 데이터 크기
- [정수] 10진수 <-> n진수
- 10진수 -> n진수
- n으로 나눈 나머지 거꾸로 연결 - n진수 -> 10진수
- 각 자리수에 대한 n의 지수를 곱해서 더하기
- 10진수 -> n진수
- [실수] 10진수 <-> n진수
- 10진수 -> n진수
- 소수부에 0이 될 때까지 n을 곱하여 나온 정수부를 차례로 연결 - n진수 -> 10진수
- 각 자리수에 대한 n의 지수를 곱해서 더하기
- 10진수 -> n진수
- 2의 보수법
- 어떤 수의 'n의 보수'는 더했을 때 n이 되는 수를 의미
- 2의 보수와의 합은 0이 됨
- 1의 보수 + 1
4. 기본형 (Primitive type)
- 논리형
- 기본값은 false
- 자바에서 데이터를 다루는 최소단위가 byte이므로, boolean 크기가 byte
- 대소문자 구분 (False != false)
- 문자형
- 문자의 유니코드(정수)가 저장되기 때문에, 문자 리터럴 대신 유니코드 직접 저장 가능
- 특수 문자
\f | form feed, 프린트 출력시 현재 페이지를 마침 |
\n | new line, 화면 출력시 다음 행 (Unix는 new line만 사용) |
\r | carriage return, 행의 처음 커서로 이동 |
\b | backspace, 이전 문자 하나 지움 |
\u | Unicode, 유니코드 (ex. char a = '\u0041') |
- 인코딩과 디코딩
- 인코딩과 디코딩
- 문자 'A'의 유니코드는 65
- 인코딩 : 문자를 코드로 변환
- 디코딩 : 코드를 문자로 변환 - 웹브라우저의 인코딩 설정과 웹페이지의 인코딩이 다른 경우, 글자가 깨짐
- 유니코드
- 전 세계의 모든 문자를 하나의 통일된 문자집합으로 표현
- 유니코드 문자 셋 : 유니코드에 포함시키고자하는 문자들의 집합
- 유니코드 인코딩 : 이 문자 셋에 붙인 번호 (UTF-8, UTF-16...)
- 자바에선 UTF-16 사용
- UTF-16 : 2byte로 모든 문자가 고정 크기 (다루기 쉬우나, 인터넷 전송속도가 느림)
- UTF-8 : 1~4byte의 가변 크기 (다루기 어려우나, 인터넷 전송속도가 빠름)
- 두 인코딩 모두 아스키를 그대로 포함
- 인코딩과 디코딩
- 정수형
- 부호 비트(sign bit)외에 나머지는 값을 표현
- JVM의 피연산자 스택이 4byte 단위로 저장
- 4byte보다 작은 자료형(byte, short)를 계산할 때는 4byte로 형변환하여 연산 - 공간과 성능이 트레이드 오프
- 오버플로우
- 타입이 표현가능한 값의 범위를 넘는 것
- 실수형
- 부호(S), 지수(E), 가수(M)로 이루어짐
- ±M × 2E
- 범위를 넘어서면 무한대, NaN과 같은 특별한 키워드로 관리
- 정밀도 (Precision)
- float는 7자리 : a x 10n으로 표현된 7자리를 오차없이 표현 가능
- 무한소수의 존재와 2진수 변환시 무한소수가 되는 등의 문제로 오차 발생
- a x 10n와 같은 형태로 바꾸는 것을 정규화라 함
5. 형변환 (casting)
- 형변환
- 서로 다른 타입간의 연산 수행을 하기 전 타입이 일치해야함
- 타입 변환을 casting이라 함
- float -> int일 때 소수부는 버려짐
- 정수형간 형변환
- 크기가 작은 형태로 변환할 경우 값손실 발생할 수 있음
- 크기가 큰 형태로 변환할 경우, 부호 비트에 따라 빈공간이 채워짐
- 실수형간의 형변환
- 가수부는 0으로 채워지거나 버려짐(버려질 때는 반올림 발생)
- 자동 형변환
- 컴파일러가 생략된 형변환을 자동으로 추가
- 값손실이 발생할 수 있을 경우 에러 메시지를 보냄
- 명시적으로 변환할 경우 에러 메시지 없음
- 연산 과정에서는 표현이 더 넓은 타입으로 형변환
- 이를 산술 변환이라고 함 - byte -> short / char -> int -> long -> float -> double
- 실수형이 정수형보다 더 큰 표현 범위를 가짐
'책읽기' 카테고리의 다른 글
[쉽게 배우는 운영체제](요약)[Part-4][Ch-11] 파일 시스템 (0) | 2021.08.02 |
---|---|
[쉽게 배우는 운영체제](요약)[Part-4][Ch-10] 입출력 시스템과 저장장치 (0) | 2021.08.02 |
[Java의 정석][Chapter-1] 자바를 시작하기 전에 (0) | 2021.08.01 |
[파이썬 알고리즘 인터뷰][최단경로] K 경유지 내 가장 저렴한 항공권 (0) | 2021.07.30 |
[파이썬 알고리즘 인터뷰][최단경로] 네트워크 딜레이 타임 (0) | 2021.07.30 |