ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 변수
    JAVA/변수( variable ) 2023. 5. 2. 09:29
    728x90

    1. 변수란?

    값을 담는 공간. 변수 이름을 부여하여 관리한다.

     

    2. 변수의 선언

    // 변수의 선언
    // 변수 타입 변수이름;
    	int num1;

     

    동일한 타입의 변수들은 한번에 선언이 가능하다.

    // 정수를 나타내는 int type의 변수 선언
    
    int num2, num3, num4;

     

    3. 변수의 초기화

    선언한 변수는 해당 타입에 맞는 값을 부여해주면 된다.

    // 변수 선언
    	int a;
        
        // 변수 초기화
        a = 100;

     

    4. 변수 생성의 규칙

    • 변수명으로 사용가능한 것은 알파벳, 숫자, _, $
    • 숫자로 시작 할 수 없다
    • 띄어쓰기 안된다
    • 대소문자 구분해야 한다
    • 중복 안된다
    • 자바 기준, 일반적으로 commel notation(myHome)을 사용한다

    ※ 변수명은 기본적으로 그 의미를 생각하여 부여하는 것이 좋다

     

    5. 변수의 종류

    자바의 변수는 기본적으로 Primitive type(기본형) 과 Reference type(참조형)으로 나뉜다.

    이 둘은 메모리에 할당되는 공간이 달라지는데, 우선 여기서는 Primitive type만 보도록 하자.(추후에 다룸)

    Primitive Type의 변수들은
    대개 메모리의 Method Area / Heap / Stack 영역 중
    Stack 영역에 생성됨 ( 코드 블럭(body)가 끝나면 소멸 )

    여기서 해당 자료 형이 표현할 수 있는 범위는 코드로도 알 수 있다.

    // 정수형 변수
    
    System.out.println("byte: " + Byte.MIN_VALUE + " ~ " + Byte.MAX_VALUE);
    System.out.println("short: " + Short.MIN_VALUE + " ~ " + Short.MAX_VALUE);
    System.out.println("int: " + Integer.MIN_VALUE + " ~ " + Integer.MAX_VALUE);
    System.out.println("long: " + Long.MIN_VALUE + " ~ " + Long.MAX_VALUE);
    System.out.println("float : " + Float.MIN_VALUE + " ~ " + Float.MAX_VALUE);
    System.out.println("double : " + Double.MIN_VALUE + " ~ " + Double.MAX_VALUE);
    
    
    // 실행 결과
    // byte: -128 ~ 127
    // short: -32768 ~ 32767
    // int: -2147483648 ~ 2147483647
    // long: -9223372036854775808 ~ 9223372036854775807
    // float : 1.4E-45 ~ 3.4028235E38
    // double : 4.9E-324 ~ 1.7976931348623157E308
    • 1byte = 8 bit >> 2^8 = 256 으로 256개의 표현이 가능하다는 의미.
      ex) 4byte의 크기를 가지는 int :  4byte = 32bit  >>  2^32 = 4,294,967,296 개의 숫자 표현가능
    • 실수 타입은 음수와 양수를 나누는 것이 아니라, 소수점 아래 자릿수 표현 볌위가 크기를 나타낸다.

    여기서 overflow와 underflow 의 개념을 알고 가야 한다.

    byte a = (byte)127;
    byte b = (byte)128;
    
    System.out.println(a);
    System.out.println(b);
    
    // 결과
    // 127
    // -128

    앞서 설명했드시, byte의 표현은 -128 ~ 127 의 정수다. 만약 127을 넘어가는 수가 나오면 맨 마지막 숫자인 -128로 넘어가게 된다.

    1  2  3  ... 125  126  127  -128 - 127  ...   >> 이렇게 된다는 것! ( -128 ~ 127 범위를 순환! )

    이것이 Overflow!

    반대의 경우도 가능하다.

    byte c =  Byte.MIN_VALUE;
    System.out.println((byte)(c - 1));
    
    // 결과
    // 127

    -125   -126   -127  - 128  >>>  127      이렇게 된다는 것이다.

    이것이 Underflow!

    때문에 자료형은 매우 조심히 다루어져야 한다.

     

    자바의 변수들은 메모리의 공간을 차지하므로, 할당받는 크기를 알아두는 것은 중요하다

     

     

    6. 변수 사용시, 유의해야할 사항들

    여기서 하나 짚고 넘어 갈 것은,

    byte num1 = -128;		// ok
    byte num2 = 0;			// ok
    byte num3 = 123;		// ok
    
    byte num4 = 1234;		//  Incompatible types. Found: 'int', required: 'byte'
    변수의 타입을 "byte"로 선언 했는데, 왜 저런 문구가 나오지? 
    크기를 넘어가서 그런건가?

    틀린말은 아니다. 그럼 다음의 경우는?

     int num9 = 9876543210; // Integer number too large >> 그래도 납득
    
    long num10 = 9876543210; // Integer number too large ??????

     

    리터럴(literal) : 코드에 직접 입력하는 값.

    int num9          >> int 타입의 변수
    9876543210    >> literal

    리터럴에도 타입이 존재한다.
    정수타입리터럴은 int 타입으로 인식하려 한다.
    실수타입리터럴은 double 타입으로 인식하려 한다.

     

     

    때문에 선언한 변수와 리터럴의 타입을 맞춰주는 작업이 필요하다.

    long a = 12315L;  // 대소문자 상관없음
    float b = 3.23F;  // 대소문자 상관없음
    
    
    // 추가
    String str1 = "";  // ""(큰따옴표)가 String literal
    Char char1 = '';   // ''(작은따옴표)가 char literal

     

     

    7. 변수의 형변환 - Casting

    다음의 코드를 보면서 생각을 해보자

    int korean = 50, eng = 50, math = 33;
    
    int total = korean + eng + math;
    
    double avg = total / 3;
    
    System.out.println(total);
    System.out.println(avg);
    
    // 결과
    // 133
    // 44.0

    평균이 44.0 ??

    여기서 중요한 포인트는 2가지이다.

    1. total은 int , 3 도 int인데 어떻게 double 타입에 담겼지?
    2. double 타입의 변수 avg는 왜 내가 계산한 것과 다른 44.0이라는 숫자가 나온거지?

    이를 알려면 형변환을 알아야 한다.

     

     

     

     

    1. total은 int , 3 도 int인데 어떻게 double 타입에 담겼지?

    에 대한 답은,

    작은 타입에서 큰 타입으로, 정수에서 실수로는 자동형변환이 일어나기 때문에 double ← int 가 허용된 것이다.

     

    그리고 위의 코드를 순차적으로 보면,

    int korean = 50, eng = 50, math = 33;
    int total = korean + eng + math;
    double avg = total / 3;
    
    System.out.println(total);
    System.out.println(total / 3);
    System.out.println(avg);
    
    // 133
    //  ↓
    // 44
    //  ↓
    // 44.0

    int 와 int 의 연산의 결과는 int가 나온다. ( total / 3 ~= 44 )

    이 결과를 double 타입에 담다보니, 결과적으로 뒤에 소숫점만 표시된 44.0이라는 값이 나온 것

    제대로 표현해주기 위해선,

     

    total 또는 3 을 double 형으로 만들어주야 한다

     

    이렇게 자동으로 형변환이 되지 않는 경우에는 명시적으로 우리가 형변환을 해주어야하는데, 이를

    명시적 형변환이라고 한다.

     

    double 타입의 변수 avg는 왜 내가 계산한 것과 다른 44.0이라는 숫자가 나온거지?

    에 대한 답은 위에서 되었고, 실질적으로 정확한 숫자가 나오게 하려면,

    int korean = 50, eng = 50, math = 33;
    int total = korean + eng + math;
    double avg = (double)total / 3;   //  <<<-------✔️✔️✔️
    
    System.out.println(total);
    System.out.println(total / 3.0);   //  <<<-------✔️✔️✔️
    System.out.println(avg);
    
    // 결과
    // 133
    // 44.333333333333336
    // 44.333333333333336

    이중에서 3번째 줄의   double avg = (double) total / 3;  이 부분이 명시적 형변환이다.

     

    명시적 형변환시에는 앞서 설명한 overflow / underflow를 조심해야한다.

    // 명시적 형변환
    byte num5 = (byte)513;
    System.out.println(num5); // 자료 소실 가능성 주의!
    
    // 결과
    // 1

     

    체계적으로 적기보단 그냥 두서없이 내가 필요한 내용들을 담는다, 한 번 더 보면서 공부한다는 생각으로 작성!!

Designed by Tistory.