티스토리 뷰

프리미티브 타입 종류와 값의 범위 그리고 기본 값

  • 논리형
    • boolean
      • 1 byte
      • 기본값(field) : false
  • 문자형
    • char
      • 2 bytes
      • 0 ~ 2^16-1 (0~63335)
      • 기본값(field): ‘\u0000’
  • 정수형
    • byte
      • 1 byte
      • -2^7 ~ 2^7-1
      • 기본값(field): 0
    • short
      • 2 bytes
      • -2^15 ~ 2^15-1
      • 기본값(field): 0
    • int
      • 4 bytes
      • -2^31 - 2^31-1 -> 약 20억
      • 기본값(field): 0
    • long
      • 8 bytes
      • -2^63 ~ 2^63-1
      • 기본값(field): 0L
  • 실수형
    • float
      • 4 bytes
      • 기본값(field): 0.0f
    • double
      • 8 bytes
      • 기본값(field): 0.0d

프리미티브 타입과 레퍼런스 타입

  • primitive type : 실제 값을 저장.
  • reference type : 객체의 주소(memory)를 저장. 8개의 primitive type을 제외한 나머지 타입

reference type은 null 혹은 객체의 주소(32bit JVM 일 경우 4byte, 64bit JVM일 경우 8 byte) 를 값으로 갖는다.


리터럴

구체적인 값.
e.g. 12 , 3.14 , 'A'

구체적인 값을 ‘상수’라고 명명하면 되지만 이미 상수를 ‘값을 한 번 저장하면 바꿀 수 없는 저장공간’ 으로 정의했기 때문에, 구체적인 값을 리터럴이라고 부르기로 했다.

접미사

  • long : l 혹은 L 을 뒤에 붙인다.
  • float : f 혹은 F 를 뒤에 붙인다.
  • double: d 혹은 D를 뒤에 붙인다. (기본 자료형이라서 접미사 생략 가능)리터럴 값이 변수 타입 값의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장 범위가 넓으면 컴파일 에러가 발생한다.
  • 정수형과 실수형에는 여러 타입이 존재하므로 리터럴 뒤에 접미사를 붙여서 타입을 구분한다. 참고로, byte 와 short는 int 타입의 리터럴을 동일하게 사용한다. (아무 접미사도 붙이지 않는다.)
int i = 0x123456789; // 에러 (리터럴이 int 타입 범위를 벗어남)
float f = 3.14;    // 에러 (리터럴의 타입 double > 변수 타입 float)

변수 선언 및 초기화하는 방법

  • 변수 선언
    {변수타입} {변수이름}
  • 초기화 방법
    • 명시적 초기화
    • 초기화 블록
      • 클래스 초기화 블록
        • static { } block 내부에 초기화하는 코드를 적는다.
        • static 변수의 복잡한 초기화에 사용된다.
          e.g. static array 의 element를 for-loop으로 초기화
      • 인스턴스 초기화 블록
        • 클래스 내부에서, { } block 내부에 초기화하는 코드를 적는다.
        • instance 변수의 복잡한 초기화, instance 생성자 코드 마다 반복되는 초기화에 사용된다.
    • 생성자초기화 순서
      static 변수 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블록
      instance 변수 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자

변수의 스코프와 라이프타임

Scope : 해당 변수를 접근할 수 있는 코드 범위
Lifetime : 해당 변수가 메모리에 남아 있는 시간.

  • Class variable
    • scope : class 내 모든 코드에서 접근 가능
    • lifetime : class가 메모리에 load 된 시점(프로그램이 loading되는 시점) ~ 프로그램이 종료되는 시점
  • Instance variable
    • scope : static method를 제외한, class 내 모든 코드
    • lifetime : object가 메모리에 load되는 시점 ~ object가 메모리에서 내려오는 시점
  • local variable
    • scope : local variable이 선언된 block 내 코드
    • lifetime : program control이 block 내부에 있는 시기.

타입 변환과 타입 프로모션

타입 변환(Casting)

  • 변수나 리터럴의 타입을 다른 타입으로 변환하는 것.
  • 기본형에서 boolean을 제외한 나머지 타입은 서로 형변환이 가능
  • 기본형 - 참조형 간 형변환은 불가능
  • 형변환 연산자 ‘()’를 이용함. (타입)피연산자

정수형 간 형변환

  • 큰 타입 -> 작은 타입 : 값 손실 발생 가능
  • 작은 타입 -> 큰 타입 : 값 손실 X.
    • 음수 : 빈 자리를 1로 채운다
    • 양수 : 빈 자리를 0으로 채운다

실수형 간 형변환

  • float -> double
    • exponent는 127을 빼고 1023을 더한다.
    • fraction은 23자리를 그대로 옮기고 나머지는 0으로 채운다.
  • double -> float
    • exponent는 1023을 빼고 127을 더한다.
    • fraction은 23자리만 저장되고 나머지는 버려진다.
    • 이때, 24번째 자리 값이 1이면 23번째 자리 값이 1 증가(반올림)
      • 만약 float 범위를 넘는 값을 double -> float 변환하면 Infinity 혹은 0 값을 얻게 된다.

정수형 - 실수형 간 형변환

  • 정수형 -> 실수형 : 정수 -> 2진수 -> 정규화 -> 실수로 저장.
    • float는 10진수로 약 7자리 정밀도를 제공하므로, 8자리 이상의 정수는 변환시 오차 발생 가능.
      double d3 = 91234567; 
      float f3 = 91234567f; 
      int f_int = (int) f3; //91234568 
      int d_int = (int) d3; //91234567
  • 실수형 -> 정수형 : 소수점 이하 값이 버려진다.
    • 만약 소수점을 버리고 남은 정수가 정수형 저장범위를 넘어서면, 정수의 오버플로우가 발생한 것과 동일한 결과 (?)
    • double d4 = 1.5e13; int overflow_int = (int) d4; //2147483647 System.out.println("overflow_int = " + overflow_int);

타입 프로모션(자동 형변환, Promotion)

서로 다른 타입 간의 대입이나 연산을 할 때 형변환을 생략하면, 컴파일러가 자동으로 형변환하는 코드를 추가해주는 것

  • 컴파일러는 기존 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
  • 자동 형변환 가능한 방향 (반대 방향은 형변환 연산자를 반드시 사용해야 함)
    byte -> short -> int -> long -> float -> double

1차 및 2차 배열 선언하기

1차원 배열

  • 선언
    타입[] 변수이름; or 타입 변수이름[];
  • 생성
    변수이름 = new 타입[원소개수]
int[] score = new int[5];

2차원 배열

  • 선언
    타입[][] 변수이름;
  • 생성
    변수이름 = new 타입[][]
int[][] score = new int[4][3];

타입 추론, var

  • Java10 에 처음 도입
  • 사용 가능한 곳
    • local variable (선언과 동시에 초기화해야 함)
    • for loop
  • 주의사항
    • null 로 초기화 불가능
    • 배열에 사용 불가
//for each
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
for (var i : integers){
    System.out.println(i);
}

//가독성
/*
URL url = new URL("http://www.oracle.com/"); 
URLConnection conn = url.openConnection(); 
Reader reader = new BufferedReader(
    new InputStreamReader(conn.getInputStream()));
*/

var url = new URL("http://www.oracle.com/"); 
var conn = url.openConnection(); 
var reader = new BufferedReader(
    new InputStreamReader(conn.getInputStream()));

Java Platform, Standard Edition Java Language Updates, Release 10


(추가학습) String

(추가학습) 참조 변수의 형변환

백기선님 리뷰 영상

  • 값의 표현 범위가 어떻게 산출되는지
  • 리터럴에서 다양한 진수 표현 방법
  • float(부동소수점) 는 정확하지 않음. 돈 계산이 필요할 때는 BigDecimal이 필요하다.
  • var 하트 받으신 분 과제 확인하기
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함