책읽기

[Java의 정석][Chapter-2] 변수

pythaac 2021. 8. 1. 17:49
이 글은 "Java의 정석 (남궁 성 지음)"을 읽고 주관적으로 요약한 글입니다. 

출처 : http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788994492032#N

 

1. 변수

  • 변수
    • 단 하나의 값을 저장하는 메모리 공간
  • 변수 타입
    • 변수에 저장될 값의 타입
  • 변수 이름
    • 변수의 구별을 위해 붙인 이름
  • 변수의 초기화
    • 변수 사용 전 처음 값을 저장하는 것
    • 초기화하지 않으면 쓰레기값
    • 대입 연산자 '=' 이용
    • 여러 변수를 콤마 ','로 한줄에 선언 가능
    • thousand = hundred * 10 -> hundred 값을 "읽어" 10을 곱한 값을 thousand에 저장
  • 두 변수의 값 교환
    • tmp 저장소 이용
  • 변수의 명명 규칙
    • 예약어(keyword)로 사용 불가능
    • 특수문자는 '_'와 '$'만 사용 가능
    • 카멜 케이스
      - 클래스는 첫 문자가 대문자
      - 메소드나 변수는 첫 문자가 소문자

 

2. 변수의 타입 

  • 기본형과 참조형
    • 타입은 변수의 공간의 크기저장형식을 정의
    • 기본형
      - 값(data)을 저장
    • 값(data)의 종류(type) = 자료형 (data type)
      1. 문자
      2. 숫자
        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'을 사용
      - 사용 전에만 초기화하면 되고, 초기화되면 변경 불가능
    • 상수의 장점
      - 변수명을 응용한 명확한 의미
      - 값을 수정시 상수의 초기화만 바꾸면 됨
  • 리터럴
    • 리터럴
      - 그 자체로 값을 의미하는 상수
    • 리터럴의 타입
      - 접미사로 타입 구분
      1. 정수형
        - 접미사가 없으면 int
        - long : 'l' or 'L'
        - byte나 short는 접미사 없이 사용
        - 큰 숫자를 편하게 읽도록 '_' 구분자 사용 가능
        ex. 100_000_000L == (long) 100000000
      2. 실수형
        - 접미사가 없으면 double
        - float : 'f' or 'F'
        - 'e' : 10의 제곱을 나타내는 기호
        ex. 3e1 == 30.0d
        - 'p' : 2의 제곱
    • 리터럴의 진법
      - 접두사로 진법 구분
      1. 16진수
        - '0x' -> 0x10
      2. 8진수
        - '0' -> 010
      3. 2진수
        - '0b' -> 0b10
    • 타입의 불일치
      - 저장범위가 넓은 타입에 좁은 타입을 저장 가능
    • 문자/문자열 리터럴
      - 문자 : 작은 따옴표 ('), 빈 칸을 허용하지 않음
      - 문자열 : 큰 따옴표 ("), 빈 칸 허용
    • 문자열 리터럴의 덧셈 연산
      - 덧셈 연산자로 문자열 결합 가능
      - 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진수
      - 소수부에 0이 될 때까지 n을 곱하여 나온 정수부를 차례로 연결
    • 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
      - 실수형이 정수형보다 더 큰 표현 범위를 가짐