Java 기초 #2

jjinny_0609·2023년 1월 30일
0

Java

목록 보기
2/31

정수 리터럴

리터럴 : 소스 코드에서 프로그래머에 의해 직접 입력된 값을 리터럴(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);
	}
}


""(큰따옴표)를 쓰면 위와 같은 오류를 발생시킴
Type mismatch: cannot convert from String to char
(유형 불일치: 문자열에서 문자로 변환할 수 없습니다)

이스케이프 문자

이스케이프 문자	출력용도
\t				탭 만큼 띄움
\n				줄 바꿈(라인 피드)
\r				캐리지리턴(현재 위치를 나타내는 커서 를 맨 앞으로 이동시킨다는 뜻)
\"				" 출력
\'				' 출력
\\				\출력
\u16진수			16진수 유니코드에 해당하는 문자 출력

ex)

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자리

ex)

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번 예제 끝*/
}


1번 예제 결과

2번 예제 결과

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);
	}
}

강제 형변환

큰자료형에서 작은 자료형으로 이동할때 오류가 발생하는데 오류가 발생하지 않도록 강제적으로 형변환을 해주는 것.

작은타입 = (작은타입)큰 타입;

ex)

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 타입으로 변환되는 것은 아니고,
    연산자 중 허용범위가 작은타입에서 큰타입으로 바뀜

ex)

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에서 이어서...

profile
뉴비 개발자 입니다. velog 주소 : https://velog.io/@jjinny_0609 Github 주소 :

0개의 댓글