도찐개찐

[JAVA] 자료형(Data Type) 본문

JAVA

[JAVA] 자료형(Data Type)

도개진 2022. 6. 29. 15:15

자료형 Data Type

  • 메모리를 얻고 사용하는 절차
  • 필요한 메모리의 크기를 정한다.
  • 크기에 해당하는 만큼의 메모리를 얻는다.
  • 메모리에 데이터를 집어 넣는다. (만약 4바이트의 메모리를 프로그래머가 얻어낸다는 것은 어렵기 때문에 메모리의 크기를 미리 지정해 두 었는데 그것이 데이터 타입이다.)
  • 데이터 타입을 이용하면 효과적인 메모리 활용이 가능 하다.

기본 데이터 타입 Primitive Type

자바에서 사용하는 기본적인 데이터타입 8가지(기본형)

 

1. 정수형 - 소수점이 없는 데이터

표현 가능한 정수 범위에 따라 4가지 타입으로 분류

  • byte (1Byte = 8bit) : -128 ~ + 127까지 표현 가능
  • short (2Byte = 16bit) : -32768 ~ +32767까지 표현 가능
  • int (4Byte = 32bit) : -21억 ~ +21억 까지 표현 가능
  • long (8Byte = 64bit) : -922경 ~ +922경 까지 표현 가능

2. 실수형 - 소수점이 있는 데이터

표현 가능한 실수 범위 또는 정확도에 따라 2가지 타입으로 분류

  • float (4Byte = 32bit)
  • double (8Byte = 64bit)
// 정수형 표현 범위
byte b = 100; // byte 타입 변수 b 에 정수 100 저장
System.out.println(b);

b = 127;

// byte 타입 변수 b 에 새로운 정수 128 저장
// b = 128; // 오류 발생! byte 타입에 저장 가능한 정수는 -128 ~ +127 까지

short s = 128;
System.out.println(s);

s = 32767;
// s = 32768; // 오류 발생! short 타입에 저장 가능한 정수 -32768 ~ +32767 까지

int i = 32768;
System.out.println(i);

i = 2147483647;

//	System.out.println(2147483648); // 오류 발생!
// => 정수형의 기본 타입은 int 형이며, int형의 표현 가능 범위는 약 21억이다.
//    따라서, 기본형태로 표현 가능한 정수 자체의 범위가 21억으로 한정되어 있음
// => int형으로 표현 불가능한 정수는 long 타입으로 표현해야함
//    long 타입 숫자를 나타내기 위해서는 숫자 뒤에 접미사 L 붙여서 표현
System.out.println(2147483648L);

// i = 2147483648L; // 오류 발생! long 타입 데이터는 int형 변수에 저장 불가

long l = 2147483648L;
System.out.println(l);


// float 타입 실수를 표현하는 경우 접미사 F 를 사용
float f = 3.14f;
System.out.println(f);

f = 1000000000000000000000f;
System.out.println(f);


double d = 3.14;
System.out.println(d);

 

3. 문자형 - 문자 1개를 나타내는 데이터

  • char (2Byte = 16bit)

문자 데이터 1개(1글자)를 저장할 수 있는 데이터 타입

문자 데이터는 작은따옴표 사이에 1개의 문자를 지정하여 표현

ex) 'A', 'r', '1' 등

주의!
작은따옴표 사이에 2개 이상의 문자가 올 수 없으며 반드시 1개의 문자가 포함되거나 공백 문자가 있어야 함

ex) ''는 사용 불가

문자 데이터를 2Byte 정수 형태로 저장

 

표현 가능 범위 : 2^16 = 0 ~ 65535

표현 범위의 차이 때문에 byte 또는 short 타입과 상호 강제 형 변환 필수!

최소 int타입에 저장 시 자동 형변환

실제 사용되는 문자 데이터들은 유니코드 방식을 사용하여 전 세계의 모든 문자 표기

char ch = 'A'; // 대문자 A 를 변수 ch 에 저장
    System.out.println(ch);

//ch = ''; // 오류 발생! 작은따옴표 사이에는 반드시 1글자 필수!
    ch = ' '; // 공백 가능

//ch = 'ab'; // 오류 발생! 작은따옴표 사이에 2글자 이상 사용 불가!
// => 2글자 이상의 문자는 문자열 형태로 큰따옴표 "" 를 사용해야함

    char ch2 = 65;
    System.out.println(ch2);

    char ch3 = '\u0041'; // 유니코드를 사용하는 방법
    // => '\u0000' 형식으로 u 뒤에 16진수 4자리 표기
    System.out.println(ch3);


    // char 타입은 정수형태로 관리되므로 정수 데이터처럼 연산 가능
    System.out.println('A' + 3); // 65 + 3 = 68 출력됨
 
4. 논리형 - true 또는 false 값을 갖는 데이터
  • boolean

정수형 숫자에 별도의 표시(접두사)가 없을 경우 **10진수(0 ~ 9)**로 취급됨

2진수(0 또는 1) 표기법 : 숫자 앞에 접두사 0b를 붙여서 표기

8진수(0 ~ 7) 표기법 : 접두사 0을 붙여서 표기

16진수(0 ~ 15, 0 ~ 9 그리고 A ~ F) 표기법 : 접두사 0x 붙여서 표기

자동으로 10진수로 변환되어 사용

System.out.println(255); // 10진수

System.out.println(0b11111111); // 2진수
//System.out.println(0b1234); // 오류 발생! 2진수에서는 0 또는 1 외에는 표기 불가

System.out.println(0377); // 8진수
//System.out.println(0378); // 오류 발생! 8진수에서는 0 ~ 7 외에는 표기 불가

System.out.println(0xFF); // 16진수
System.out.println(0xff); // 16진수(대소문자 무관)
//System.out.println(0xFG); // 오류 발생! 16진수 알파벳 A ~ F 외에는 표기 불가

long l = 1_000_000_000_000L;
System.out.println(l);

 

참조 데이터 타입 Reference Type

  • String 문자열

큰 따옴표("")로 둘러싸서 표기하는 문자

1개 이상의 문자를 사용할 수 있으며, 아무것도 없는 빈 문자("" = 널스트링)도 표현 가능하다

문자열을 저장할 수 있는 데이터 타입은 String 타입

String 타입은 기본 데이터 타입이 아닌 참조 데이터타입

//String 타입 변수 str 에 문자열 "Hello, World!" 저장
String str = "Hello, World!";
System.out.println(str);

str = "A"; // 1글자 표기도 가능
System.out.println(str);

str = ""; // 큰따옴표 사이에 아무 문자도 없는 널스트링도 사용 가능
System.out.println(str);

 

기본 데이터 타입 vs 참조 데이터 타입의 복사

객체 지향 프로그래밍을 공부하면서 배운 거

 

두 종류의 데이터 타입에 대한 값을 전달할 경우 해당 값을 복사하여 전달

기본 데이터 타입은 실제값의 복사가 일어남

=> 전달받은(복사된) 데이터(복사된 실제값)를 변경하더라도 원본 데이터에는 아무런 영향이 없다

 

참조 데이터 타입은 주소 값의 복사가 일어남

=> 전달받은 데이터(복사된 주소 값)의 데이터(실제값)를 변경하면 원본 데이터도 동일한 주소 값을 참조하므로 변경된 내용이 동일하게 적용되어 있다

즉, 동일한 위치의 주소를 공유하므로 변경 사항 공유

public static void main(String[] args) {	
    int money = 100000; // 로컬변수이면서 기본형 변수

    System.out.println("변경 전 money = " + money);

    // primitiveChange() 메서드를 호출하여 int형 변수 money 의 값 전달
    primitiveChange(money); // 실제 값(100000)을 복사하여 전달

    // 메서드에서 전달받은 실제값을 변경하더라도
    // 원본 데이터는 아무런 영향을 받지 않는다!
    System.out.println("변경 후 money = " + money);

    System.out.println("===========================");

    // MyMoney 클래스의 인스턴스 생성
    MyMoney mm = new MyMoney();

    System.out.println("변경 전 mm.money = " + mm.money);
    // => 멤버변수이자 기본형 변수인 money 에 접근

    // primitiveChange() 메서드를 호출하여 MyMoney 인스턴스의
    // 인스턴스 변수인 기본데이터타입 money 를 파라미터로 전달
    //		System.out.println("MyMoney 인스턴스의 money = " + mm.money);
    primitiveChange(mm.money); // 실제 값(100000)을 복사하여 전달
    // => MyMoney 인스턴스 mm 의 기본데이터타입 money 변수값 전달
    // => 멤버변수이자 기본형 변수인 money 의 값을 복사하여 전달

    // 메서드에 전달하는 변수가 인스턴스 내의 변수라 하더라도
    // 기본 데이터타입일 경우 값을 복사하여 전달함.
    // 따라서, 실제 값을 복사하여 전달받은 메서드에서 값을 변경하더라도 
    // 원본 데이터는 아무런 영향을 받지 않는다!
    System.out.println("변경 후 mm.money = " + mm.money);

    System.out.println("===================================");

    MyMoney mm2 = new MyMoney();

    System.out.println("변경 전 mm2.money = " + mm2.money);

    // referenceChange() 메서드를 호출하여
    // MyMoney 인스턴스의 주소값(mm2)을 파라미터로 전달
    referenceChange(mm2); // 주소값을 복사하여 전달

    // 참조변수가 가진 주소값을 복사하여 메서드에 전달한 뒤
    // 메서드 내에서 해당 참조변수에 접근하여 인스턴스 변수값을 변경하면
    // 원본 데이터가 있는 곳의 값을 변경하게 되므로
    // 원본 데이터도 영향을 받는다!
    // => 즉, 원본 데이터와 전달받은 값이 가리키는 인스턴스가 동일하므로
    //    한 곳에서 값을 변경하면 다른 곳에서도 동일한 값을 사용하게 됨
    System.out.println("변경 후 mm2.money = " + mm2.money);
    // => 메서드 내에서 변경된 값이 그대로 적용되어 출력됨
}

public static void referenceChange(MyMoney mm) {
    // 외부로부터 전달받은 데이터(주소값)에 접근하여
    // 해당 인스턴스 내의 멤버변수 값(실제값)을 변경
    System.out.println("메서드 내의 변경 전 mm.money = " + mm.money);
    mm.money -= 9999; // 전달받은 주소값의 인스턴스 변수값 변경
    System.out.println("메서드 내의 변경 후 mm.money = " + mm.money);
}

public static void primitiveChange(int money) {
    // 외부로부터 전달받은 데이터(실제값)를 변경
    System.out.println("메서드 내의 변경 전 money = " + money);
    money -= 9999;
    System.out.println("메서드 내의 변경 후 money = " + money);
}

 

출처 : https://rateye.tistory.com/3

 

[JAVA] 자바의 데이터 타입

처음 공부할 때 엄청 헷갈렸던 변수의 데이터 타입.. 자바에서 변수는 태어날 때부터 돌잡이 때 물건을 쥐는 아기처럼 자신이 담을 데이터 쥐어줘야 한다. 연필을 잡았지만 공부를 못했던 나와

rateye.tistory.com

 

728x90

'JAVA' 카테고리의 다른 글

[JAVA] 형 변환(casting)  (0) 2022.06.29
[JAVA] 변수와 상수  (0) 2022.06.29
[JAVA] InteliJ 0.0.0.0.0.1 수정  (0) 2022.05.07
[Spring] DAO, DTO, Repository, Entity  (0) 2022.05.07
MacOS OpenJDK 11 설치  (0) 2022.03.22
Comments