본문 바로가기

Server Programming/BackEnd Project

10일차 -자바 (2) 정수형 오버플로우와 형변환

반응형

+)  인텔리제이 세로편집 단축키 cmd+shift+8

 

변수와 자료형

  • 컴퓨터가 연산을 하는 기본 단위 4바이트
  • 따라서, 4바이트 기준 자료형인 int를 사용하는 것이 필요하지 않은 연산을 줄일 수 있다.
  • 기본 자료형인 정수형일 경우 int형(4바이트), 실수형일 경우 double형(8바이트)을 사용을 권장

  • 하나의 문자를 저장하는 char
  • char 자료형은 문자형이지만, 내부적으로 정수값으로 변환해서 저장하기 때문에 정수형으로도 표현
  • char가 2바이트인이유는 문자를 표현하는 유니코드는 2바이트이기 때문에 
    : '\u'가 유니코드를 의미하는 표기 형식
    • 또한 65,536개의 문자를 표현한다.
  • 논리형 boolean은 참 거짓 값을 지정하는 자료형으로 1바이트로 표현
    • cpu가 처리할 수 있는 최소 단위가 1바이트
  • 정수 오버플로우 : 정수형 변수는 자신이 저장할 수 없는 범위를 벗어나면 최솟값부터 다시 반복하는 Cicular 구조
    • byte의 경우 -128~127를 벗어나면 -128부터 시작 (범위를 모를 경우 int형 사용 권장)

 

byte 변수의 Cicular 구조 예제

(1) 낮은 자료형으로 변환시에 값의 범위를 넘는지 확인해야 한다.

(2) byte 자료형 변수인 b가 127을 넘어가면 오버플로우 발생

package ch02;

/**
 * 데이터 오버풀로우
 * 해당 자료형의 범위가 넘어갔을시 자료 손실이 발생하는 것을 의미함
 * 정수형 자료형을 작은 범위에서 -> 반대쪽 끝에서 다시 시작하는 서큘러(circular) 구조를 보인다.
 */
public class ByteOverflow {
    public static void main(String args[]) {
        byte b = 0; // byte형 변수b를 선언하고 0을 초기화
        int  i = 0;
        // 정수 리터럴값을 byte로 형변환
        // 낮은 자료형으로 형변환시에는 값의 범위를 넘어서는지 확인해야 함
        byte ofb = (byte)128; // -128
        // int -> byte가 호환되지 않는 유형으로 변환할 수 없음
        // byte nb = 128; // 컴파일 오류 발생 : incompatible types: possible lossy conversion from int to byte

        // 반복문을 이용해서 byte 타입 변수 b값을 0~270까지 증가시킨다
        // byte의 값의 범위인 -128 ~ 127을 넘어서면 overflow가 발생한다
        for(int j=0; j<=270; j++) {
            System.out.print(b++);
            System.out.print('\t');
            System.out.println(i++);
        }

        System.out.println("byte overflow (대입값 : 128) :" + ofb);
    }
}

기본 자료형의 메모리 영역

-지역 변수의 경우 자바 스택의 지역변수 메모리영역에 저장되고, 메서드 종료시 소멸된다.

-기본형 타입의 변수들이 생성되면 JVM의 스택 영역에 저장된다.

-상수는 메서드 영역의 상수 풀에 따로 저장된다.

 

 

-스택 메모리에는 주소값만 저장

-힙 메모리에 실제 값을 저장

-String은 불변 객체로 문자열 풀에 저장되어있고, 같은 값이 존재하면 새로 만들지 않고 사용한다.

 

 

형변환

-기본 자료형 간의 형변환 (기본형과 참조형(래퍼클래스)의 경우 오토박싱으로 형변환이 가능)

-boolean을 제외한 7개의 자료형은 서로 형변환이 가능하다.

 

  • 자동 형변환(up-casting) : 큰 자료형에 작은 자료형의 값을 대입할 경우
  • 강제 형변환(down-casting) : 작은 자료형에 큰 자료형의 값을 대입할 경우
    • 강제 형변환시 소수점을 버린다.
package ch02;

/**
 * casting 에제
 * 업캐스팅
 * byte -> short -> char -> int -> long -> float -> double
 *
 * 다운캐스팅
 * double -> float -> long -> int -> char -> short -> byte
 */
public class TyepCastingEx1 {
    public static void main(String args[]) {

        int value1 = (int)3.14; // 다운캐스팅
        long value2 = (long)10; // 업캐스팅
        //실수형의 기본 자료형이 double이기 때문에
        float value3 = (float)6.123; // 다운캐스팅
        //캐스팅을 하지 않으려면 f를 붙인다.
        //float value3 = 6.123F; // 다운캐스팅
        double value4 = (double)16; // 업캐스팅

        System.out.println(value1); //3
        System.out.println(value2); //10
        System.out.println(value3); //6.123
        System.out.println(value4); //16.0

    }
}

 

package ch02;

/**
 * casting 에제
 */
public class TyepCastingEx2 {
    public static void main(String args[]) {
        double douVal  = 35.3;
        int score = (int)douVal; // 강제 캐스팅으로 소수점 절사
        int score3= (int) Math.floor(douVal);
        int score2= (int) Math.ceil(douVal);
        int score4= (int) Math.round(douVal);


        System.out.println("int score="+score);
        System.out.println("올림한 int score="+score2);
        System.out.println("버림한 int score="+score3);
        System.out.println("반올림한 int score="+score4);
        System.out.println("double douVal="+douVal);

        byte b = 10;
        int i = b; // up-casting
        System.out.println("byte b : " + b + ", int i : " + i);

        int i2 = 300;
        byte b2 = (byte)i2; // down-casting
        System.out.println("int i2 : " + i2 + ", byte b2 : " + b2);

        int n1 = 123;
        double d1 = n1;  // 정수를 실수로 바꿀때에는 캐스팅이 필요없다.
        System.out.println(d1);  // 123.0 출력

        double d2 = 123.456;
        int n2 = (int) d2; // 실수를 정수로 바꿀때에는 반드시 정수형으로 캐스팅해 주어야 한다.
        System.out.println(n2);  // 소숫점이 생략된 123 출력

        // 과제 : 오류나는 코드를 정상적으로 동작하도록 수정하고, 이렇게 해야하는 이유를 작성
        short sa,sb,sc;
        sa = 1;
        sb = 2;
//        // incompatible types: possible lossy conversion from int to short
        //sc = sa+sb;
//        sc = (short) ((int) sa+(int) sb);
//short 변수를 이용해 연산을 수행하면 자동 int로 형변환
		  sc = (short) (sa+sb);

        System.out.println("sc:"+ sc);
    }
}

 

package ch02;

/**
 * casting 에제
 * 업캐스팅
 * byte -> short -> char -> int -> long -> float -> double
 *
 * 다운캐스팅
 * double -> float -> long -> int -> char -> short -> byte
 */
public class TyepCastingEx1 {
    public static void main(String args[]) {

        int value1 = (int)3.14; // 다운캐스팅
        long value2 = (long)10; // 업캐스팅
        //실수형의 기본 자료형이 double이기 때문에
        float value3 = (float)6.123; // 다운캐스팅
        //캐스팅을 하지 않으려면 f를 붙인다.
        //float value3 = 6.123F; // 다운캐스팅
        double value4 = (double)16; // 업캐스팅

        System.out.println(value1); //3
        System.out.println(value2); //10
        System.out.println(value3); //6.123
        System.out.println(value4); //16.0

    }
}
반응형

'Server Programming > BackEnd Project' 카테고리의 다른 글

11일차 - TIL  (0) 2022.12.22
10일차 -TIL  (0) 2022.12.21
9일차 -TIL  (0) 2022.12.21
8일차 -TIL  (0) 2022.12.20
7일차. 자바 (1) Java 언어의 특징  (0) 2022.12.19