JAVA : 기본(2)
Literal 과 정수 Literal
- Literal
- 프로그램에서 직접 표현한 값
- 정수, 실수, 문자, 논리, 문자열 literal 있음
- ex) 34, 42.195, ‘%’, true, “hello”
- 정수 literal
- 10진수, 8진수, 16진수, 2진수 literal
15 -> 10진수 literal 15 015 -> 0으로 시작하면 8진수. 십진수로 13 0x15 -> 0x로 시작하면 16진수. 십진수로 21 0b0101 -> 0b로 시작하면 2진수. 십진수로 5 🔽 int n = 15; int m = 015; int k = 0x15; int b = 0b0101;
- 정수 literal은 int 형으로 컴파일
- long 타입의 literal은 숫자 뒤에 L 또는 I을 붙여 표시
- ex) long g = 24L
- 실수 literal
- 소수점 형태나 지수 형태로 표현한 실수
- ex) 12., 12.0, .1234, 0.1234, 1234E - 4
- 실수 타입 literal은 double 타입으로 컴파일
double d - 0.1234; double e = 1234E - 4; // 1234E - 4 = 1234x10^-4이므로 0.2134와 동일
- 숫자 뒤에 f(float)나 d(double)을 명시적으로 붙이기도 한다
float f = 0.1234f; // f 또는 F는 반드시 작성 필요 double w = .1234D; // .1234D와 .1234는 동일
- 문자 literal
- 단일 인용부호 (‘‘)로 문자를 표현
- ex) ‘w’, ‘A’, ‘가’, ‘*’, ‘글, ₩u0041
- ₩u 다음에 4자리 16진수(2바이트의 유니코드)
- \u0041 -> 문자 ‘A’의 유니코드(0041)
- \uae00 -> 한글 문자 ‘글’의 유니코드(ae00)
char a = 'A'; char b = '글'; char c = ₩0041; // 문자 'A'의 유니코드 값(0041) 사용 char d = ₩uae00; // 문자 '글'의 유니코드 값(ae00) 사용
- 특수문자 literal은 백슬래시(₩)로 시작
특수 문자 literal
- 논리 literal 과 boolean 타입
- 논리 literal은 두 개
- true, false
- boolean 타입 변수에 치환하거나 조건문에 이용
boolean a = true; boolean b = 10 > 0; // 10 > 0 참이므로 b값은 true boolean c = 1; // 타입 불일치 오류. C/C++과 다르게 Java에서 1,0을 boolean으로 사용 불가. while(true) { // 무한 루프. while(1) 로 사용 불가. ... }
- 기본 타입 이외의 literal
- null literal
- 레퍼런스에 대입 사용
int n = null; // 기본 타입에 사용불가 String str = null;
- 문자열 literal(String literal)
- 이중 인용 부호로 묶어 표현
- ex) “Carefree”, “Life”, “자바”, “01.16”, “26”, “a”
- 문자열 literal은 String 객체로 자동 처리
String str = "Good";
- JDK7 부터 숫자에 ‘_’ 허용
- 숫자 literal의 아무 위치에나 언더스코어 ‘_‘허용
- 컴파일러는 리터럴에서 ‘_’ 를 빼고 처리
- 사용 예시
int price = 20_100; // 20100과 동일 long cardNumber = 1234_5678_1357_9998L; // 1234567813579998L 와 같음 long controlBits = 0b10110100_01011011_10110011_11110000; //L 또는 l를 안 붙이면, int값으로 인식(32비트) long maxLong = 0x7fff_ffff_ffff_ffffL; // 16진수는 4비트 크기이므로 총 64비트 크기 int age = 2_____5; // 25와 동일
- 허용되지 않는 4가지 경우
int x = 15_; //오류. literal 끝에 사용할 수 없다. double pi = 3_.14 //오류. 소수점(.) 앞뒤에 사용할 수 없다. long idNum = 980116_1234567_L; // 오류. _L(_F) 앞에 사용할 수 없다. int y = 0_x15; //오류. 0x 중간이나 끝에 사용할 수 없다. 0x_15(오류)
- var 키워드를 사용하여 변수 타입 생략
- Java 10 부터 도입된 키워드.
- C++의 auto 키워드
- 지역 변수의 선언에만 사용
- 변수 타입 선언 생략: 컴파일러가 변수 타입 추론
- 사용 예시
var price = 200; // price는 int 타입으로 결정 var name = "kitae"; // name은 String 타입으로 결정 var pi = 3.14; // pi는 double 타입으로 결정 var point = new Point(); // point는 Point 타입으로 결정(4장 참조) var v = new Vector<Integer>(); // v는 Vector<integer> 타입으로 결정(7장 참조)
- 변수 선언문에 반드시 초깃값 지정
var name; // 컴파일 오류. 변수 name의 타입을 추론할 수 없음
- 상수 선언
- final 키워드 사용
- 선언 시 초기값 지정
- 실행 중 값 변경 불가
상수의 선언
- 변수, literal, 상수 활용 예제
- 원의 면적을 구하는 프로그램을 작성해보자.
public class CircleArea { public static void main(String[] args) { final double PI = 3.14; // 원주율을 상수로 선언 double radius = 10.0; // 원의 반지름 double circleArea = radius * radius * PI; // 원의 면적 계산 //원의 면적 화면에 출력 System.out.println("원의 면적 = " + circleArea); } }
자동 타입 변환
- 자동 타입 변환
- 작은 타입은 큰 타입으로 자동 변환
- 컴파일러에 의해 이루어짐
- 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때
자동 타입 변환
- 작은 타입은 큰 타입으로 자동 변환
강제 타입 변환
- 자동 타입 변환이 안 되는 경우: 큰 타입이 작은 타입으로 변환할 때
int n = 300; byte b = n; // 컴파일 오류. int 타입이 byte 로 자동 변환 안됨.
- 강제 타입 변환
- 개발자가 필요하여 강제로 타입 변환을 지시
- () 안에 변환할 타입 지정
- 강제 변환은 값 손실 우려가 있다.
강제 타입 변환
- 개발자가 필요하여 강제로 타입 변환을 지시
- 타입 변환 예제
public class TypeConversion { public static void main(String[] args) { byte b = 127; int i = 100; System.out.println(b+i); // 227 System.out.println(10/4); // 2 System.out.println(10.0/4); // 2.5 System.out.println((char)0x12340041); // A System.out.println((byte)(b+i)); // -29 (아래에 풀이) System.out.println((int)2.9 + 1.8); // 3.8 System.out.println((int)(2.9 + 1.8)); // 4 System.out.println((int)2.9 + (int)1.8); // 3 } }
- (byte)(b+i) 풀이
- b + i 는 10 진수 227
- 2진수로 바꾸면 11100011
- 첫 비트가 1이면 음수이므로 2의 보수를 취한다 -> 00011101
- 10진수 29와 동일
- 음수 이므로 -29가 된다.
- (byte)(b+i) 풀이
최대한의 설명을 코드 블럭 내의 주석으로 달아 놓았습니다.
혹시 이해가 안가거나 추가적인 설명이 필요한 부분, 오류 등의 피드백은 언제든지 환영합니다!
긴 글 읽어주셔서 감사합니다. 포스팅을 마칩니다.
- Literal 과 정수 Literal
- 정수 literal
- 실수 literal
- 문자 literal
- 논리 literal 과 boolean 타입
- 기본 타입 이외의 literal
- JDK7 부터 숫자에 ‘_’ 허용
- var 키워드를 사용하여 변수 타입 생략
- 상수 선언
- 변수, literal, 상수 활용 예제
- 자동 타입 변환
- 강제 타입 변환
- 타입 변환 예제
Comments