TIL/myself

TIL(Today I Learned) 20220416 자바 변수

토희 2022. 4. 16. 00:50
728x90

https://youtu.be/RJewaCQZEHU

자바는 문자와 문자열을 다르게 인식!
"" 큰따움표로 감싼것을 문자열로 인식
문자열은 char 타입에 저장할 수 없음 strong 타입에 저장해야함(strong 타입은 자바의 기본타입에는 속하지 않음, 참조타입)
char타입에는 작은따움표''로 감싼 하나의 문자 리터럴만 저장가능

이스케이프

자바는 실수리터럴을 기본적으로 double 타입으로 해석
float var = 3.14;(X)
3.14를 기본적으로 double타입으로 인식해서 float타입으로 저장하고자 하면 컴파일 오류 발생
float타입으로 저장할려고 하면, f를 리터럴 앞이나 뒤에 넣어줘야함, 대소문자 상관없음
float var = 3.14f; (O) 🙆‍♀️

논리타입

정수를 지정할수 있는 타입으로는 byte, short, int, long이 있음



https://youtu.be/B3KFhJJG9Kc

자바 타입변환
자동 타입변환, 강제 타입변환, 결합 연산(문자열 경우)

타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것!
ex) byte 타입 -> int 타입
int 타입 -> byte 타입
double 타입 -> int 타입
String 타입 -> int 타입

변수 선언 당시 다른 타입의 변수에 저장할대 타입 변환이 발생할수 있다.
byte a = 10; byte 타입 변수 a에 10을 저장
int b = a; byte 타입 변수 a에 저장된 10이 int 타입값으로 변환됨

자동 타입 변환(promotion): 값의 허용 범위가 작은 타입이 큰 타입으로 저장될 경우
기본 타입의 허용 범위 순: byte < short < int < logn < float < double

char 타입의 경우도 int 타입으로 자동변환되며, 유니코드 값이 int 타입에 저장
char charValue = 'A';
int intValue = charValue A의 유니코드 65가 저장됨, char는 2byte, int는 4byte

byte byteValue = 65;
char charValue = byteValue (X) 컴파일에러 발생 why? byte 타입의 허용범위는 -128~127까지임, 그러나 char 타입의
혀용범위는 0~65000까지임 따라서 음수부분에서 문제발생
(음수를 가질 수 있는 타입으 char타입으로 변환할려고 하면 컴파일에러 발생)


강제 타입 변환(casting): 큰 허용 범위 타입을 작을 허용 범위 타입으로 강제로 나누어 한 조각만 저장
() 캐스팅 연산자 사용 : 괄호 안이 나누는 단위
int intValue = 10;
byte byteValue = (byte) intValue;

int타입을 char타입으로 강제 변환, 문자 출력 위함
int intValue = 65;
char charValue = (char) intValue;
System.out.println(charValue). 'A' 가 출력

실수 타입을 정수 타입으로 강제변환, 소수점 이하 부분 버려지고 정수부분만 저장, 자주 쓰임!
double doubleValue = 3.14;
int intValue = (int) doubleValue; intValue는 정수 부분인 3만 저장


https://youtu.be/PCfKL5eb4Bc

정수 타입 변수가 산술 연산식( + , - , * , %)에서 피연산자로 사용되는 경우
byte, char, short 타입 변수는 int 타입으로 자동 변환
byte x = 10;
byte y = 20;
byte result = x + y; (X) 컴파일 에러 발생
int result = x + y; (O)

특별한 경우가 아니라면 정수 연산에 사용하는 변수는 int 타입으로 선언하는 것이 효과적
피 연산자 중 하나가 long 타입이면 다른 피연산자는 long 타입으로 자동변환
피 연산자 중 하나가 double 타입이면 다른 피연산자는 double 타입으로 자동변환

다른 타입 연산이 필요한 경우 먼저 강제 변환한 뒤 연산 수행
int intValue = 10;
double doubleValue = 5,5;
int result = intValue + (int) doubleValue; result에 15가 저장됨

실수 리터럴 연산
double result = 1.5 + 2.3;
float result = 1.5 + 2.3; (X)
float result = 1.5f + 2.3f; (O)

정수 연산의 결과를 실수로 저장할때 주의할 점
정수 연산의 결과는 정수!!
int x = 1;
int y = 2;
double result = x / y; 1/2는 0.5지만, 정수 연산의 결과는 정수니까 앞의 값 0만 나오고, double타입에 저장했으니 0.0값 도출됨

0.5의 결과값을 얻을려면(실수 결과를 얻을려면) 실수 연산으로의 변환 필요
1) x를 강제변환
int x = 1;
int y = 2;
double result = (double) x / y; x를 double타입으로 강제 변환해서 1.0 으로 바꿔주고 실수에 산수연산을 그 결과가 y도 2.0으로 바뀜
따라서 0.5값 도출
2) y를 강제변환
int x = 1;
int y = 2;
double result = x / (double) y; 원리가 위랑 똑같음
3) x,y 모두 강제 변환
int x = 1;
int y = 2;
double result = (double) x / (double) y;

https://youtu.be/gJqfge-beGc

+ 연산에서의 문자열 자동 타입변환
+ 연산
피연산자가 모두 숫자일 경우 덧셈 연산
피연산자 중 하나가 문자일경우 나머지 피연산자도 문자열로 자동 변환되고 문자열 결합 연산
+연산은 앞에서부터 순차적으로 수행
먼저 수행된 연산이 결합 연산인 경우 이후 모든 연산이 결한 연산이 됨

문자열을 기본타입으로 강제 변환
String -> int
String str = "30000";
int value = Integer.parseInt(str);

String -> double
String str = "12.345";
double value = Double.parseDouble(str);

parseByte, parseShort, parseInt, parseLong, parseFloat, parseDouble, parseBoolean

문자열이 숫자 외 요소를 포함할 경우 숫자 타입 변환 시도할 경우 숫자형식 예의 발생
String sta = "1a";
int value = Integer.parseInt(str); NumberFormatException 발생

String.valueOf() 메소드 사용하여 기본타입을 문자열로 변환
String.valueOf(3); "3"
String str = "" + 3; 빈문자열 더해주면 숫자는 문자열로 변환해서 "3" 이 나옴

728x90