도찐개찐
[JAVA] 자료형(Data Type) 본문
자료형 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 출력됨
- 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' 카테고리의 다른 글
[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 |