728x90
상수
- 한 번만 값이 저장 가능한 변수
-
숫자에 의미있는 이름을 붙여 코드 자체의 가독성을 늘리기 위해 사용 ex) '시험의 만점은 100점이다.'
final int finalScore = 100;
리터럴
- 그 자체로 값을 의미하는 것
- 기존의 상수와 같은 의미지만 상수는 변수 리터럴은 데이터를 의미
변수, 상수, 리터럴 구별하기
int score = 100;
final int finalScore = 1000;
- score : 변수
- finalScore : 상수
- 100, 1000 : 리터럴
리터럴의 접두사와 접미사
접두사
접두사를 사용하여 2진수(0b), 8진수(0), 16진수(0x), 를 표현할 수 있다.
int ob = 0b0101; // 2진수, 접두사 0b
int i = 100; // 10진수
int oct = 0100; // 8진수, 접두사 0
int hex = 0x100; // 16진수, 접두사 0x
접미사
- 정수형
- byte, short, int, long
- 기본형 : int (접미사를 붙이지 않음)
- long : 구분을 위해 리터럴 마지막에 접미사로 L을 붙임 ex) 100L
접미사는 대소문자를 구별하지 않지만 L의 소문자 l 은 숫자 1 혼동되기 쉽기 때문에 대문자를 사용
long price = 2_147_483_648L; // _ 를 사용하여 숫자 표현 가능!
// long l1 = 2_147_483_648; // Error 발생, int 범위를 넘었으니 L 접미사 필수!
long l2 = 100; // int의 범위를 넘지 않으면 L 생략 가능!
- 실수형
- float, double
- 기본형 : double (접미사를 붙이지 않음)
- float: 구분을 위해 리터럴 마지막에 접미사로 f를 붙임 ex) 3.14f
// float tax1 = 3.14; // 기본형이 double 이므로 접미사 f 필요
float tax2 = 3.14f;
double score1 = 3.14159265358979; // d 생략 가능!
double score2 = 3.14159265358979d;
float f1 = 10f; // 10.0f
double d1 = 10.; // 10.0
double d2 = .10; // 0.10
double d3 = 1e3; // 1000.0 , e3 = 10의 3제곱
double d4 = -1e3; // -1000.0
변수와 리터럴의 타입 불일치
- 범위가 '변수 > 리터럴' 인 경우 : OK
int i = 'A'; // int > char, 'A' = 65
long l = 123; // long > int
double l = 3.14f; // double > float
- 범위가 '변수 < 리터럴' 인 경우 : Error
int i = 30_0000_0000; // int의 범위(대략 20억)를 넘음
long l = 3.14f; // long < float
// long(8bye), float(4byte)라 가능할 것 같지만
// 실수형은 정수형 보다 저장 범위가 훨씬 넓기 때문에 Error
float f = 3.14; // float < double;
- byte, short 변수에 int 리터럴 저장 : OK (단, 변수의 타입의 범위 이내여야함)
기본형
- 기본형 : 가장 기본이 되는 타입
- 논리형 (boolean) : 조건식과 논리적 계산에 사용
- 문자형 (char) : 변수 당 하나의 문자만을 저장
- 정수형 (byte, short, int, long) : 정수 값을 저장. 주로 int, long을 사용. byte는 이진데이터를 다루는데 사용
- 실수형 : float, double
- 기본형 변수는 실제 값을 저장함
기본형의 표현범위
- 1bit 에는 0과 1이 들어갈 수 있음
- n비트로 표현할 수 있는 값의 개수 : 2ⁿ 개 ex) 8bit = 2⁸ : 256개
- n비트로 표현할 수 있는 부호없는 정수의 범위 : 0 ~ 2ⁿ-1 ex) 8bit : 0 ~ 255
- n비트로 표현할 수 있는 부호있는 정수의 범위 : – 2ⁿˉ¹ ~ 2ⁿˉ¹-1 ex) 8bit : -128 ~ 127
- 각 자료형의 MAX, MIN 값을 가져올 수 있음
System.out.println(Short.MAX_VALUE);
System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
System.out.println(Float.MAX_VALUE);
System.out.println(Float.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
실수형의 표현범위
정밀도 : 소수점 몇자리 까지 오차없이 표현할 수 있는가
- S(부호) : 양수, 음수를 표현
- E(지수) : 2의 지수를 표현
- M(가수) : 소수점 이하를 표현
float의 M(가수)는 23자리인데 정규화를 통해서 24자리까지 표현이 가능 ( 10⁷ < 2²⁴ < 10⁸ 이므로 정밀도는 7자리 )
마찬가지의 이유로 double은 15자리
실수형은 +-M x 2^E 형태로 저장하기 때문에 더 큰 범위의 값을 저장 가능
같은 4byte 크기지만 float이 int 보다 더 큰 범위의 값을 저장
메모리에 값이 저장되는 과정
- 변수 b에 10진수 3을 저장하면 컴퓨터는 이를 2진수로 변환하여 메모리에 저장
- 타입 마다 위처럼 값이 저장되는 형식이 있어서 그 형식에 맞게 변환되어 저장됨
아스키코드
문자를 표현하기 위해 문자와 숫자를 매칭하는 코드 ( 컴퓨터는 아스키 코드표를 기준으로 매칭하여 문자를 저장 )
문자코드는 음수를 사용할 필요가 없기 때문에 char의 범위에는 부호가 없음
- 아스키코드
128개의 문자조합을 제공하는 7비트 부호
알파벳, 숫자, 특수기호, 그 외 컴퓨터에 필요한 몇 가지만이 정의 - 유니코드
각 나라별 언어를 모두 표현하기 위해 나온 코드 체계
문자마다 고유한 코드 값을 제공하는 새로운 개념의 코드
16비트로 표현 - 최대 65,536 자 표현 가능 - UTF-8
유니코드를 사용하는 인코딩 방식 중 하나
영문/숫자/기호는 1바이트로, 한글/한자는 3바이트로 표현
전세계 모든 글자들을 한꺼번에 표현 가능
유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지 사용
정수형 오버플로우
정수형은 해당 변수타입의 최솟값, 최댓값 범위를 넘어가면 값을 순환
// 부호있는 경우
short sMin = -32768;
short sMax = 32767;
// short 타입에서 최솟값 범위를 넘었을 때
System.out.println((short)(sMin - 1)); // 32767
// short 타입에서 최댓값 범위를 넘었을 때
System.out.println((short)(sMax + 1)); // -32768
// 부호없는 경우
char cMin = 0;
char cMax = 65535;
// short 타입에서 최솟값 범위를 넘었을 때
System.out.println((int)(--cMin)); // 65535
// short 타입에서 최댓값 범위를 넘었을 때
System.out.println((int)(++cMax)); // 0
타입간의 변환방법
- 문자와 숫자간의 변환
- 숫자를 문자로 : 숫자 + '0' → 문자
- 문자를 숫자로 : 문자 - '0' → 숫자
int num = 5;
char ch = '5';
// 숫자 -> 문자
// '0' 이 48이기 때문에 결과값을 char 타입으로 변환 필요
System.out.println("num + '0' = " + (char)(num + '0'));
// 문자 -> 숫자
System.out.println(("ch - '0' = " + ch - '0');
// '5' 에서 숫자 5로 변환되었기 때문에 결과값 6
System.out.println("ch - '0' + 1 = " + ch - '0' + 1);
- 문자열로의 변환
- 숫자를 문자열로 : 숫자 + "" → 문자열
- 문자를 문자열로 : 문자 + "" → 문자열
int num = 5;
char ch = '5';
// 숫자 -> 문자열
// num 이 "5" 로 변환되었기 때문에 "5" + "5" 로 결과값은 "55"
System.out.println(num + "" + "5");
// 문자 -> 문자열
// ch 이 '5' 에서 "5" 로 변환되었기 때문에 "5" + "8" 로 결과값은 "58"
System.out.println(ch + "" + "8");
- 문자열을 숫자로
- Integer.parseInt("문자열")
- Double.parseDouble("문자열")
- 문자열을 문자로
- "문자열".charAt(0)
String str1 = "100";
String str2 = "3.14";
String str3 = "8";
// 문자열 -> 숫자
System.out.println(Integer.parseInt(str1));
System.out.println(Double.parseDouble(str2));
// Integer.parseInt() 은 int 타입만 가능
System.out.println(Integer.parseInt(str2)); // Error 발생
// 문자열 -> 문자
System.out.println(str1.charAt(0) + str1.charAt(1) + str1.charAt(2));
참조형
- 기본형을 제외한 나머지 타입 ex) String, System
- 참조형 변수는 null 또는 메모리 주소를 저장함 (null 은 어떤 객체의 주소도 저장되지 않음)
- 타입에 관계없이 변수의 크기가 항상 4byte (JVM이 64bit일 경우 8byte)
- 4byte는 2진수로 대략 40억개로, 40억byte(4GB)의 메모리를 다룰 수 있음
문자와 문자열 차이
char ch1 = 'A'; // 문자
// char ch2 = 'AB'; // Error 발생
// char ch3 = ''; // Error 발생, 빈 문자 불가능
String s1 = "ABC"; // 문자열
String s2 = ""; // 빈 문자열 가능
String s3 = "A"; // 문자 한 개도 문자열!
// 아래 두 표현식 모두 사용 가능하지만 ss2 방식은 거의 사용하지 않음!
String ss1 = "AB";
String ss2 = new String("AB");
문자열 결합
// 문자열의 결합
String s1 = "A" + "B"; // "AB"
// 문자열은 문자열하고만 결합 (숫자는 문자열로 바꾼 다음에 결합)
String s2 = "" + 7;
// 문자열 결합 순서에 의한 차이 확인!
String s3 = "" + 7 + 7; // "77"
String s4 = 7 + 7 + ""; // "14"
728x90
'개발일기 > Java' 카테고리의 다른 글
[Java] 배열 (0) | 2023.02.16 |
---|---|
[Java] 연산자 (0) | 2023.02.16 |
자바 이해하기 (0) | 2023.02.15 |
자바 버전 변경하기 (0) | 2023.02.14 |
인텔리제이 프로젝트 시작하기 (0) | 2023.02.08 |