정수 리터럴
리터럴 : 소스 코드에서 프로그래머에 의해 직접 입력된 값을 리터럴(literal) 이라고 부름.
int var1 = 0b1011; //2진수 기계어
int var2 = 0206; //8진수
int var3 = 365; //10진수
int var4 = 0xB3; //16진수
package ch02;
public class IntergerLiteralExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 리터럴
int var1 = 0b1011; //2진수
int var2 = 0206; //8진수
int var3 = 365; //10진수
int var4 = 0xB3; //16진수
System.out.println("var1: " + var1);
System.out.println("var2: " + var2);
System.out.println("var3: " + var3);
System.out.println("var4: " + var4);
}
}
byte 타입 변수
package ch02;
public class ByteExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
byte var1 = -128;
byte var2 = -30;
byte var3 = -0;
byte var4 = -30;
// byte var5 = 128;
//byte는 -128~127까지 값을 저장할 수 있기 때문에 컴파일 에러를 발생시킴
System.out.println(var1);
System.out.println(var2);
System.out.println(var3);
System.out.println(var4);
// System.out.println(var5);
}
}
long 타입 변수
자바 기본정수타입은 int
허용범위를 초과할 경우 long 타입임을 컴파일러에게 알려야함.
해결방법 : 소문자 l이나 대문자 L을 붙이면 됨. (접미사) - 대문자 사용하는걸 추천
package ch02;
public class LongExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
long var1 = 10;
long var2 = 20L;
long var3 = 1000000000000;
long var4 = 1000000000000L;
System.out.println(var1);
System.out.println(var2);
System.out.println(var4);
}
}
char 타입
하나의 문자를 작은따옴표(')로 감싼것을 문자리터럴이라고 한다.
문자리터럴은 유니코드(Unicode)로 변환되어 저장됨.
package ch02;
public class CharExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
char c1 = 'A'; // 문자를 직접 저장
char c2 = 65; // 10진수로 저장
char c3 = '\u0041'; // 16진수로 저장
char c4 = '가'; // 문자를 직접 저장
char c5 = 44032; // 10진수로 저장
char c6 = '\uac00'; // 16진수로 저장
int c7 = 'A';
//반대로 정수타입에 문자를 넣으면 유니코드 값을 반환하는걸 확인할 수 있음
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
}
}
이스케이프 문자
이스케이프 문자 출력용도
\t 탭 만큼 띄움
\n 줄 바꿈(라인 피드)
\r 캐리지리턴(현재 위치를 나타내는 커서 를 맨 앞으로 이동시킨다는 뜻)
\" " 출력
\' ' 출력
\\ \출력
\u16진수 16진수 유니코드에 해당하는 문자 출력
package ch02;
public class EscapeExample {
public static void main(String[] args) {
System.out.println("번호\t이름\t직업");
System.out.println("번호 이름 직업"); //탭키를 누름
System.out.print("행\n단위\n출력\n");
System.out.println("행");
System.out.println("단위");
System.out.println("출력"); //9번과 10~12 같음
System.out.println("우리는 \"개발자\" 입니다.");
System.out.print("봄\\여름\\가을\\겨울");
}
}
실수 타입
float와 double
자바의 기본 실수타입은 double
float 대략적으로 표현할때 사용, 7자리 f(접미사)를 붙여서 표현
double 정확하게 표현할때 사용, 15자리
package ch02;
public class FloatDoubleExample {
public static void main(String[] args) {
//실수값 지정
//float var1 = 3.14; //기본 실수타입 double
//유형 불일치: (Type mismatch: cannot convert from double to float)
//기본 실수타입 double에서 float로 변환할 수 없습니다
float var2 = 3.14f;
double var3 = 3.14;
//정밀도 테스트
// float var4 = 0.12345f; 작은 단위에서 출력해보면 값이 같아보임..
// double var5 = 0.12345;
float var4 = 0.1234567890123456789f;
double var5 = 0.1234567890123456789;
System.out.println(var4==var5);
// false가 나오는 이유 : 소수점 자리수 표현하는 값이 2배이상 차이남
// float타입보다 double이 2배정도 더 정밀하기 때문에 double이라는 이름을 가진다고함.
System.out.println("var2: " + var2);
System.out.println("var3: " + var3);
System.out.println("var4: " + var4);
System.out.println("var5: " + var5);
//e 사용하기
double var6 = 3e6; // 지수 3의 6승
float var7 = 3e6F;
double var8 = 2e-3; // 지수 2의 -3승
System.out.println("var6: " + var6);
System.out.println("var7: " + var7);
System.out.println("var8: " + var8);
}
}
논리타입
논리 리터럴로 true와 false를 사용한다.
1byte 크기의 boolean 타입 변수에 저장할 수 있다.
package ch02;
public class BooleanExample {
public static void main(String[] args) {
boolean stop = true;
if(stop){ //true일시 중지
System.out.println("중지합니다.");
}else { //false일시 시작
System.out.println("시작합니다.");
}
}
}
연습문제
package ch02;
public class test1 {
public static void main(String[] args) {
// byte var1 = 200;
// 이러한 오버플로우와 언더플로우가 발생한다고 하여 컴파일 에러나 런타임 에러가 발생하지 않으므로
최대값 혹은 최소값 범위를 고려해서 코드를 작성해야 함.(디버깅 시 가장 힘든 이유 중 한가지)
// 에러메시지 : Type mismatch: cannot convert from int to byte
// 뜻: int에서 byte로 변환 안됨
// 원인: byte보다 큰 숫자를 byte에 담으려고 함.
// 해결책: 작은 숫자로 바꾸거나, 강제형 변환시킴. byte b=(byte) 200;
byte var1 = (byte)200;
// char var2 = 'AB';
// 에러메시지 : Invalid character constant
// 뜻 : 잘못된 문자 상수
// 원인 : char에 문자열이 들어감
// 해결책 : 하나의 문자만 담거나, string으로 변경
char var2 = 'B';
String var2_1 = "AB";
char var3 = 65; //출력시 A출력 (자동 형변환)
// long var4 = 50000000000;
// 에러메시지 : The literal 50000000000 of type int is out of range
// 뜻 : 리터럴 값이 50000000000 int의 long 범위를 넘어남
// 원인 : Type mismatch
// 해결책 : 접미사가 없으면 int 정수형이므로 값 뒤에 l이나 L을 붙여줌
long var4 = 50000000000L;
// float var5 = 3.14;
// 에러메시지 : Type mismatch: cannot convert from double to float
// 뜻 : 유형 불일치: double에서 float로 변환할 수 없습니다
// 원인 : double타입으로 타입이 일치하지 않아서 발생
// 해결책 : 접미사가 없으면 double이므로 값 뒤에 f이나 F을 붙여줌
// 혹은 double타입으로 변경
float var5 = 3.14f;
double var5_1 = 3.14;
double var6 = 100.0; //문제없이 출력됨
// String var7 = "나이 직업은 "개발자" 입니다.";
// 에러메시지 : TSyntax error on token "개발자", invalid AssignmentOperator
// 뜻 : 토큰 "\"의 구문 오류, 잘못된 할당Operator
// 원인 : "\"의 구문오류로 문법을 지켜줘야함
// 해결책 : "\" escape문자를 사용하면 해결됨
String var7 = "나이 직업은 \"개발자 \"입니다.";
// boolean var8 = 0;
// 에러메시지 : Type mismatch: cannot convert from int to boolean
// 뜻 : 유형 불일치: int에서 부울로 변환할 수 없음
// 원인 : true 또는 false값이 아닌 값이 들어가서 발생
// 해결책 : true 또는 false값을 입력
boolean var8 = true;
boolean var8_1 = false;
// int v2 = 1e2; //1x10의 2승
// 에러메시지 : Type mismatch: cannot convert from double to int
// 뜻 : 유형 불일치: 유형 불일치: double에서 int로 변환할 수 없습니다
// 원인 : 정수형 변수에 double값이 들어감
// 해결책 : 실수형 타입인곳에 선언해주어야함
float v2 = 1e2f;
double v2_1 = 1e2;
// float = 1e2f;
// 에러메시지 : The left-hand side of an assignment must be a variable
// 뜻 : 할당의 왼쪽은 변수여야 함
// 원인 : 변수가 없어서 발생하는 오류
// 해결책 : 타입 뒤에 변수를 선언해주면 해결됨.
float var10 = 1e2f;
// double var11 = 2e-350; //2x10 -350승
// 에러메시지 : The literal 2e-350 of type double is out of range
// 뜻 : double의 리터럴 2e-350이 범위를 벗어났습니다
// 원인 : 입력값이 double타입을 넘어섬
// 해결책 : 값을 줄여줘야함..
double var11 = 2e-200;
System.out.println(var1);
System.out.println(var2);
System.out.println(var2_1);
System.out.println(var3);
System.out.println(var4);
System.out.println(var5);
System.out.println(var5_1);
System.out.println(var6);
System.out.println(var7);
System.out.println(var8);
System.out.println(var8_1);
System.out.println(v2);
System.out.println(v2_1);
System.out.println(var10);
System.out.println(var11); //1번 예제
/* 2번 예제 시작*/
System.out.println("자바는"); //enter
System.out.println("\n재미있는 \"프로그래밍\" 언어\n");
//enter //enter
System.out.println("입니다.");
/* 2번 예제 끝*/
/* 3번 예제 시작*/
boolean stop = false;
if(stop) {
System.out.println("멈춥니다."); //true면 출력
}else{
System.out.println("출발합니다."); //false면 출력
}
}
/* 3번 예제 끝*/
}
오버플로우
오버플로우는 이러한 범위 중 최대값을 뛰어 넘는 값을 표현하려고 하는 경우에 발생한다.
이런 경우에는 해당 데이터 타입의 최소값으로 반환된다.
즉, byte형의 최대값 127에 1을 더하는 경우 그 값은 128이 아닌 -128이 된다.
언더플로우
언더플로우는 범위 중 최소값을 뛰어 보다 더 아래 값을 표현하려고 하는 경우에 발생한다.
이런 경우에는 해당 데이터 타입의 최대값으로 반환된다.
즉, byte형의 최소값 -128에 1을 빼는 경우 그 값은 -129가 아닌 127이 된다.
타입 변환
기본 타입을 허용 범위 크기순으로 정리
byte < short < int < long < float < double
(1) (2) (4) (8) (4) (8)
정수 타입 | 실수 타입
- float와 double은 표현범위가 더 크기 때문에 더 큰 타입으로 들어감.
(정수와 소수까지 표현하기 때문에)
자동 형변환
작은 자료형에서 큰 자료형으로 이동할때 자동으로 형변환을 시켜줌.
큰 타입 = 작은 타입;
byte -> short
short -> int
int -> long
long -> float
package ch02;
public class PromtionExample {
public static void main(String[] args) {
//자동타입변환
byte byteValue = 10;
// int(4) <- byte(1) byte 타입이 int으로 변경
int intValue = byteValue;
System.out.println("intValue : "+ intValue);
char charValue = '가';
// int(4) <- char(2) char 타입이 int 타입으로 변경
intValue = charValue;
System.out.println("가의 유니코드: "+ intValue);
intValue = 50;
// long(8) <- int(4) int타입이 long 타입으로 변경
long longValue = intValue;
System.out.println("longVlaue: "+ longValue);
longValue = 100;
// float(4) <- int(4) int타입이 flaot 타입으로 변경
float floatValue = intValue;
System.out.println("floatValue: "+ floatValue);
// int(4) <- float(4)
// intValue = floatValue;
//실수(소수점이 있는 숫자)를 정수형으로 바꾸려면 데이터 손실이 생기기 때문에 강제 형변환이 필요함
floatValue = 100.5F;
// double(8) <- float(4) float타입이 double 타입으로 변경
double doubleValue = floatValue;
System.out.println("doubleValue: "+ doubleValue);
}
}
강제 형변환
큰자료형에서 작은 자료형으로 이동할때 오류가 발생하는데 오류가 발생하지 않도록 강제적으로 형변환을 해주는 것.
작은타입 = (작은타입)큰 타입;
package ch02;
public class CastingExample {
public static void main(String[] args) {
int intValue = 44032;
// char(2) <- int(4) 2칸의 손실 발생! -> 강제형변환이 필요
char charValue = (char)intValue;
System.out.println(charValue);
long longValue = 500;
// int(4) <- long(8) 4칸의 손실 발생! ->강제 형변환이 필요
intValue = (int)longValue;
System.out.println(longValue);
double doubleValue = 3.14; //3.14 (기본 : double)
// int(4) <- double(8)
intValue = (int)doubleValue;
System.out.println(doubleValue);
}
}
정수 연산에서의 자동 타입 변환
정수 타입 변수가 산술 연산식에서 피연산자로 사용되면
int 타입보다 작은 byte, short 타입의 변수는 int타입으로 자동 타입 변환되어 연산을 수행합니다.
[정수타입 연산 예제 1]
package ch02;
public class ByteOperationExample {
public static void main(String[] args) {
byte x = 20;
byte y = 30;
// x(byte)+y(byte)
// ↓ ↓
// int int
// byte result = (byte)x + y;//이렇게 쓰면 x만 바이트 형변환됨
//
// byte result = (byte)(x + y); // 첫번째 방법
int result = x + y; // 두번째 방법
byte result1 = 10 + 20;
System.out.println(result1);
}
}
[정수타입 연산 예제 2]
- 정수 연산식에서 항상 int 타입으로 변환되는 것은 아니고,
연산자 중 허용범위가 작은타입에서 큰타입으로 바뀜
package ch02;
public class LobgOperationExample {
public static void main(String[] args) {
byte value1 = 10;
int value2 = 100;
long value3 = 1000L;
// byte + int + long (기존)
// byte-> int로 바뀜 + int + long
// long + long + long
long result = value1 + value2 + value3;
System.out.println(result);
}
}
Java 기초 #3에 이어서...
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java 조건문과 반복문 #1 (0) | 2023.02.02 |
---|---|
Java 연산자 #2 (0) | 2023.02.02 |
Java 연산자 #1 (0) | 2023.02.01 |
Java 기초 #3 (0) | 2023.01.31 |
Java 기초 #1 (0) | 2023.01.27 |