일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- C#변수
- Literal
- 자바
- 코드업
- 코드업자바
- 코드업100제자바
- 제어구조
- 개발입문
- 백준
- 기초프로그래밍
- C#프로그래밍
- 자바연산자
- 알고리즘
- Algorithm
- 코딩테스트
- Codeup
- 수학연산
- 백준파이썬
- SWEA파이썬
- 코드업100제
- c#
- 자바클래스
- SWEA
- 디자인패턴
- VARIABLE
- 프로그래머스파이썬
- 리터럴
- 사용자입력
- 변수
- Java
- Today
- Total
제니노트
변수와 리터럴의 타입 불일치 [자바] 본문
변수에 저장할 리터럴의 타입은 변수의 타입과 일치해야하는 것이 보통이지만 반드시 일치해야 하는 것은 아니다.
- 저장범위가 '변수>리터럴' 인 경우 , OK - > 물건보다 그릇이 더 크므로 가능한 것
ex ) int i = 'A'; //int>char
이는 i에 문자 A가 저장되는 것이 아니라 문자 A의 문자코드 65가 i에 저장된다. 저장하려는 리터럴이 character이지만, 변수의 타입이 Integer이므로 저장범위가 더 넓어서 가능한 것이다.
long l = 123; //long>int
integer 타입의 리터럴을 더 넓은 범위의 Long타입 변수에 저장하니 문제가 없다.
double d = 3.14f; //double>float
float 범위의 값을 더 넓은 범위의 double에 저장하는 것이니 괜찮다.
2. 저장범위가 '변수<리터럴' 인 경우, 에러 - > 담으려는 물건이 그릇보다 크므로 X
int i = 30_0000_0000; //int의 범위(±20억) 벗어남
long l = 3.14f; //long<float
정수형 Long은 8byte이고, 실수형 Float는 4byte 이므로 언뜻 될 것 같지만, 실수형의 저장범위는 훨씬 크기 때문에 에러가 발생한다.
float f = 3.14; //float<dobule
double 타입의 값을 float에 저장하는 것이므로 에러가 나는 것 참고로 실수형 뒤에 접미사가 아무것도 없으면 실수형 double에 접미사인 d가 생략되있는 것을 잊으면 안된다.
3. byte,short 변수에 int 리터럴 저장가능
byte와 short에는 지정된 리터럴이 없으므로 그냥 int를 사용하는 것이다
byte b = 100; //OK, byte의 범위(-128~127) 에 속함
byte b = 128; //에러. byte의 범위를 벗어남
아래에 코드로 실습하였다.
결과는
false 라고 넣으면 콘솔에는 false라고 뜬다.
true와 false 외에 다른 값을 넣으면
타입 미스매치가 뜬다.
byte 형을 알아보자.
이 또한 타입이 맞지 않는다는 에러가 출력되었다. 128은 byte의 범위를 넘어가므로 생긴 에러다.
이는 127로 고치면 에러가 사라진다.
8진수와 16진수를 알아보자.
8진수와 16진수를 저장하고 이를 출력해보았다. System.out.println은 숫자를 10진수로만 출력해준다. 접두사와 접미사는 출력되지 않는다.
이를 10진수가 아닌 8진수와 16진수로 출력하고 싶으면 System.out.printf 함수를 사용하면 된다.
이번엔 Long타입을 확인해보자.
long에 10억을 넣어보았다. 보기좋게 밑에 _ 도 넣어주었다. 리터럴에 아무런 접미사도 붙이지 않았으므로 integer 리터럴이다. long은 integer 의 저장범위보다 넓은 저장범위를 가지고 있응므로 이는 에러가 나지 않는다.
이제 100억을 넣어보자.
100억이 되어버리면 에러가 뜬다. integer 타입의 최댓값이 20억이기 때문이다. 이 때는 뒤에 접미사 L을 붙여야 에러가 나지 않는다.
float와 double 형을 확인해보자.
double 형은 d가 생략되어도 에러가 뜨지 않는다.
float의 접미사 f를 생략하면 에러가 뜬다.(타입 미스매치)
이는 에러가 발생하지 않는다. 리터럴과 변수의 타입이 일치하진 않지만 double이 float보다 더 넓음, 즉 작은 그릇을 큰 그릇에 담는 것이므로 에러가 발생하지 않는다.
실수형을 마저 알아보자.
두 번째 출력인 .10 은 0.1로 출력되었는데 뒤의 0은 생략된 것이다. 그리고 세 번째 출력인 10f도 접미사 f가 생략되고 10.0으로만 출력된 것을 확인할 수 있다.
출처 : 자바의 정석 강의 3판 https://youtu.be/_fz8XCW3NJg
'Java > Java 입문' 카테고리의 다른 글
printf()에 대하여 [자바] (0) | 2023.02.26 |
---|---|
classpath 설정하기 [자바] (0) | 2023.02.23 |
문자와 문자열 [자바] (0) | 2023.02.10 |
리터럴의 접두사와 접미사 [자바] (0) | 2023.02.10 |
변수,상수,리터럴 [자바] (0) | 2023.02.08 |