IT 개발/JAVA

변수(Variables) - 기본 자료형(Primitive Data Type)

미웡할꺼야 2021. 1. 12. 02:13

[참고] Oracle > Java Documentation > Primitive Data Types

[참고] 위키백과 - 원시 자료형

[참고] 위키백과 - Primitive wrapper class in Java

[참고] TCP School > JAVA > 9) 기본 자료

[참고] TCP School > JAVA > 10) 실수의 표현

 

운영체제(OS) : Windows10 64bit
개발환경 : JDK8
개발도구 : Eclipse IDE

기본 자료형(Primitive Data Type)이란

  • Data Type은 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 한다.

  • Java에서는 여러 형태의 타입을 미리 정의하여 제공하고 있는데, 이것을 기본 자료형(Primitive Data Type)이라고 한다.

  • Java의 기본 자료형은 8종류로 크게 정수형, 실수형, 문자형, 논리형으로 나눌 수 있다.


리터럴(Literal)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package variables;
 
public class PrimitiveDataType {
    
    public static void main(String[] args) {
        /*
         * 1. 원시 유형은 클래스에서 생성된 개체가 아닌 언어로 기본 제공되는 특수 데이터 유형이다.
         * 2. 리터럴(Literal)은 고정 값의 소스 코드 표현이며, 계산하지 않고도 코드에 직접 표시된다.
         *    즉, 변수의 값이 변하지 않는 데이터(메모리 위치 안의 값)를 의미한다.
         */
        boolean result = true// 리터럴은 true
        char capitalC = 'C';   // 리터럴은 'C'
        int i = 100000;        // 리터럴은 100000
    }
}
cs

기본 자료형(Primitive Data Type) 8가지

자료형 예약어 메모리 크기 기본값 표현 범위
논리형 boolean 1byte
(1bit)
false true, false
문자형 char 2byte
(16bit=216)
0(='\u0000') 0~65535('\u0000' ~ '\uffff')
(Unicode(UTF-16) : 영어/숫자=1byte, 그 외 다국어=2byte)
정수형 byte 1byte
(8bit=28)
0 -128 ~ 127(-27 ~ 27-1)
short 2byte
(16bit=216)
0 -32,768 ~ 32,767(-215 ~ 215-1)
int 4byte
(32bit=232)
0 -2147483648 ~ 2147483647(-231 ~ 231-1)
long 8byte
(64bit=264)
0L -9223372036854775808 ~ 9223372036854775807(-263 ~ 263-1)
실수형 float 4byte
(32bit=232)
0.0f ±1.4E-45 ~ ±3.4028235E38(±1.4 x 10-45 ~ ±3.4028235 x 1038)
(ANSI/IEEE 754-1985 표준)
double 8byte
(64bit=264)
0.0d ±4.9E-324 ~ ±1.7976931348623157E308
(±4.9 x 10-324 ~±1.7976931348623157 x 10308)
(ANSI/IEEE 754-1985 표준)

 


논리형

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package variables;
 
public class PrimitiveDataType {
 
    public static void main(String[] args) {
        /*
         * 1. 참/거짓 조건을 추적하는 간단한 플래그에 사용한다.
         * 2. 메모리 크기는 1byte를 나타내지만 사용하는 CPU마다 다르기 때문에
         *    정확한 bit의 크기는 알 수 없다.
         */
        boolean bf = false, bt = true;
        System.out.println(bf); // false
        System.out.println(bt); // true
    }
}
cs

문자형과 문자형 및 문자열 리터럴(Character and String Literals)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package variables;
 
public class PrimitiveDataType {
    
    public static void main(String[] args) {
        /*
         * 1. 문자 하나를 표현할 수 있는 타입.
         * 2. Unicode를 사용하며 문자를 표현한다(ASCII코드로도 표현할 수 있다).
         * 3. char 및 String 리터럴에 unicode escape와 escape sequence를 지원한다.
         * 4. char 값은 따옴표('') 안에 한 글자만 작성이 가능하다.
         */
        char minn = 0, maxn = 65535;
        char minc = '\u0000', maxc = '\uffff';
        System.out.println(minn + ", " + maxn + ", " + minc + ", " + maxc);
        // 표현 범위로 작성된 것은 Console창에 쉼표(,)말곤 안 나온다.
        
        char c1 = 'a', c2 = 'A', c3 = '1', c4 = 'ㅁ', c5 = '$';
        System.out.println(c1 + ", " + c2 + ", " + c3 + ", " + c4 + ", " + c5);
        // a, A, 1, ㅁ, $
    }
}
cs

 

  • char 및 String 유형의 리터럴에는 유니코드(UTF-16) 문자가 포함될 수 있다. 편집기와 파일 시스템에서 허용하는 경우 코드에서 직접 이러한 문자를 사용할 수 있다. 그렇지 않은 경우 '\u0108'(곡절 악센트 대문자 C) 또는 "S\u00ED Se\u00F1or"(Si Seøor 스페인어)와 같은 "Unicode escape"를 사용할 수 있다.

  • Java 프로그래밍 언어는 cher 및 String 리터럴에 대한 몇 가지 특수 이스케이프 시퀀스도 지원한다. 주로 JSON에 쓰인다.

    • \t : 수평 탭.

    • \n : 줄 바꿈.

    • \r : 줄 바꿈, 커서가 행의 앞으로 이동.

    • \' : 홑 따옴표.

    • \" : 큰따옴표.

    • \\ : backslash.

  • 모든 참조 유형의 값으로 사용할 수 있는 특수 null 리터럴도 있다. null은 원시 유형의 변수를 제외한 모든 변수에 할당할 수 있다. null 값의 존재 여부를 테스트하는 것 외에는 수행할 수 있는 작업이 거의 없다. 따라서 null은 프로그램에서 일부 개체를 사용할 수 없음을 나타내는 표시로 사용되는 경우가 많다.

  • 마지막으로, 클래스 리터럴이라고 불리는 특별한 종류의 리터럴도 있는데, 이것은 형식 이름을 따서 ".class"를 붙여서 형성된다. 예를 들어, String.class. 유형 자체를 나타내는 클래스 유형의 개체를 나타낸다.


정수형과 정수 리터럴(Integer Literal)

  • 부호(+,-)가 있는 정수(2의 보수)를 가지며, 소수 부분이 없는 수를 의미한다.

  • 표현 범위를 벗어나면 Overflow 또는 Underflow가 발생해 전혀 다른 값이 저장될 수 있다.(참고)

    • Overflow : 해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상. Overflow가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰므로, 잘못된 결과를 얻을 수 있다.

    • Underflow : 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상.

  • byte, short는 메모리 절감이 중요한 대규모 Array에서 메모리를 저장하는데 유용할 수 있다.

  • long 값이 int의 최솟값 or 최댓값을 초과할 경우 long 값 뒤에 l(or L)을 붙여야 한다.

  • 정수 리터럴은 다음과 같은 숫자 시스템으로 표현될 수 있다.

    • 10진수(Decimal) : 숫자 0~9인 10개로 구성. 평소 사람이 읽기 위한 숫자 시스템.

    • 16진수(Hexadecimal) : 숫자 0~9, 문자 A~F인 16개로 구성.

    • 2진수(Binary) : 숫자 0과 1인 2개로 구성. 기계어이다(JavaSE7 이상에서 이진 리터럴을 만들 수 있음).

  • 범용 프로그래밍의 경우 십진법만 사용할 수 있다. 그러나 다른 숫자 시스템을 사용해야 하는 경우 다음 예제로 볼 수 있다.
    (접두사 0x는 16진수이고 0b는 2진수이다)

    • int decVal = 26; // 숫자 26, 10진수(Decimal)

    • int hexVal = 0x1a; // 숫자 26, 16진수(Hexadecimal)

    • int binVal = 0b11010; // 숫자 26, 2진수(Binary)


실수형과 부동 소수점 리터럴(Floating-Point Literals)

  • ANSI/IEEE 754-1985 표준 부동 소수점 방식을 따르고 있다. 과거에는 실수를 표현할 때 float을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용한다.

  • ANSI/IEEE 754-1985 표준 부동 소수점(floating point) 방식(float) : 부호(1bit), 지수부(8bit), 가수부(23bit). 총 32bit.

  • ANSI/IEEE 754-1985표준 고정 소수점(fixed point) 방식(double) : 부호(1bit), 지수부(11bit), 가수부(52bit). 총 64bit.

  • 정수로 표기된 float 값이 int의 최솟값 or 최댓값을 초과할 경우 float 값 뒤에 f(or F)를 붙여야 한다. 소수점으로 표기 시 무조건 f(or F)를 붙여야 한다.

  • 정수로 표기된 double 값이 int의 최솟값 or 최댓값을 초과할 경우 double 값 뒤에 d(or D)를 붙여야 한다. 이 외엔 규칙에 의해 값 뒤에 d(or D)는 생략이 가능하다.


기본 자료형(Primitive Data Type)과 참조 자료형(Reference Data Type)의 차이

  • 기본 자료형(Primitive Data Type)은 Java에서 사전 정의돼있다. 참조 자료형(Reference Data Type)은 프로그래머가 작성하며 Java에서 정의하지 않는다. (String 제외).

  • 참조 자료형(Reference Data Type)은 특정 작업을 수행하기 위해 메서드를 호출하는 데 사용할 수 있지만 기본 자료형(Primitive Data Type)은 할 수 없습니다.

  • 기본 자료형(Primitive Data Type)은 null값을 넣을 수 없지만 참조 자료형(Reference Data Type)은 넣을 수 있다.

  • 기본 자료형(Primitive Data Type)은 첫 글자가 소문자로 시작하는 반면 참조 자료형(Reference Data Type)은 대문자로 시작한다.

  • 기본 자료형(Primitive Data Type)의 크기는 데이터 유형에 따라 다르지만 참조 자료형(Reference Data Type)은 모두 동일한 크기를 갖는다.

  • 참조 자료형(Reference Data Type)의 예로는 String, Arrays, Classes, Interface 등이 있다.


숫자 리터럴(Numeric Literals)에서 밑줄 문자 사용

  • JavaSE7 이상에서는 숫자 리터럴의 숫자 사이에 임의의 수의 밑줄 문자(_)가 나타날 수 있습니다. 예를 들어 이 기능을 사용할 수 있다. 숫자 리터럴로 자릿수 그룹을 구분하여 코드의 가독성을 향상할 수 있다.

  • 다음 예에서는 숫자 리터럴에서 밑줄을 사용할 수 있는 다른 방법을 보여준다.

    • long creditCardNumber = 1234_5678_9012_3456L;

    • long socialSecurityNumber = 999_99_9999L;

    • float pi = 3.14_15F;

    • long hexBytes = 0xFF_EC_DE_5E;

    • long hexWords = 0xCAFE_BABE;

    • long maxLong = 0x7fff_ffff_ffff_ffffL;

    • byte nybbles = 0b0010_0101;

    • long bytes = 0b11010010_01101001_10010100_10010010;

  • 밑줄은 자리 사이에만 배치할 수 있으며, 다음 위치에는 밑줄을 배치할 수 없다.

    • 숫자의 시작 또는 끝에

    • 부동 소수점 리터럴의 소수점 근처에 있음

    • F 또는 L 접미사 이전

    • 자릿수의 문자열이 필요한 위치

  • 다음 예제는 숫자 리터럴로 표시된 유효하거나 잘못된 밑줄 배치를 보여준다.

    • float pi1 = 3_.1415F; // 유효하지 않음: 밑줄을 소수점 근처에 놓을 수 없습니다.

    • long socialSecurityNumber1 = 999_99_9999_L; // 유효하지 않음: L 접미사 앞에 밑줄을 넣을 수 없습니다.

    • int x1 = 5_2; // OK (decimal literal)

    • int x2 = 52_; // 유효하지 않음: 리터럴 끝에 밑줄을 넣을 수 없습니다.

    • int x3 = 5_______2; // OK (decimal literal)

    • int x4 = 0_x52; // 유효하지 않음: 0x radix 접두사에 밑줄을 넣을 수 없습니다.

    • int x5 = 0x_52; // 유효하지 않음: 숫자의 시작 부분에 밑줄을 넣을 수 없습니다.

    • int x6 = 0x5_2; // OK (hexadecimal literal)

    • int x7 = 0x52_; // 유효하지 않음: 숫자의 끝에 밑줄을 넣을 수 없습니다.