모카스터디/Java

변수와 기본타입과 타입변환(캐스팅)

softmoca__ 2024. 9. 30. 21:21
목차

변수

변수 : 하나의 값을 저장할 수 있는 메모리 공간에 붙여진 이름

변수 선언 : 어떤 타입의 데이터를 저장할 것인지, 변수 이름이 무엇인지 결정하는 것.

 

지역변수는 사용되기 전에 반드시 초기화해야하며,

필드(클래스 변수와 인스턴스 변수)는 초기화를 생략할 수 있다.

 

 

8개의 기본타입

자바는 8개의 기본 타입이 있다.

값의 분류 기본 타입
정수 byte, char, short, int, long
실수 float, double
논리 boolean

 

정수타입 

타입 메모리크기 저장되는 값의 허용 범위
byte 1byte -128 ~ 127
short 2byte -32,768 ~ 32,767
char 2byte 0 ~ 65,535(유니코드)
int 4byte 약 -21억 ~ 21억
long 8byte 약 -9경 ~ 9경

 

진수 표현방식

System.out.print는 항상 10진수로 출력한다.

public class IntegerLiteralExample {
	public static void main(String[] args) {
		int var1 = 0b1011; //2진수
		int var2 = 0206; //8진수
		int var3 = 365; //10진수
		int var4 = 0xB3; //16진수

		System.out.println("var1: " + var1);  //11
		System.out.println("var2: " + var2); // 134
		System.out.println("var3: " + var3); // 365
		System.out.println("var4: " + var4); //179
	}
}

 

public class LongExample {
	public static void main(String[] args) {
		//long var1 = 1_000_000_000_000; //컴파일러는 int로 간주하기 때문에 에러 발생
		long var2 = 1000000000000L;
	}
}

기본적으로 컴파일러는 정수 리터럴을 int타입 값으로 간주한다.

int타입의 허용범위를 초과하는 리터럴은 뒤에 소문자 l이나 대문자 L을 붙여 long타입 값임을 컴파일러에게 알려줘야한다.

(컴파일러는 리터럴(1000000000000) 자체가 int로 해석될 수 없는 값이라는 점에서 에러를 발생)

문자타입

문자 리터럴은 유니코드(0~65535)로 변환되어 저장되며, 이러한 유니코드를 저장할 수 있도록 char 타입을 제공한다.

char var1='A'; // 'A' 문자와 매핑되는 숫자 : 65로 대입
char var2='가'; // '가' 문자와 매핑되는 숫자 : 44032로 대입

 

public class CharExample {
	public static void main(String[] args) {
		char c1 = 'A';          	//문자 저장
		char c2 = 65;          	//유니코드 직접 저장
		
		char c3 = '가';         	//문자 저장
		char c4 = 44032;      	//유니코드 직접 저장
				
		System.out.println(c1); // A
		System.out.println(c2); // A
		System.out.println(c3); // 가
		System.out.println(c4); // 가
	}
}

println()은 다양한 데이터 타입을 처리할 수 있는 오버로드된 메서드로서, char 타입을 입력 받으면 해당 값에 대응하는 유니코드 문자를 출력한다.(내부적으로 String.valueOf(char) 메서드가 호출)

 

정수로 출력하는 방법 1 : 명시적 형변환

System.out.println((int) c1); // 65
System.out.println((int) c3); // 44032


정수로 출력하는 방법 2 : 연산을 통해 암시적 변환

System.out.println(c1 + 0); // 65
System.out.println(c3 + 0); // 44032

 

 

실수 타입

컴파일러는 실수 리터럴을 기본적으로 double 타입으로 해석하기 떄문에 double 타입 변수에  대입해야 한다.

flaot 타입에 대입하고 싶다면 리터럴 뒤에 소문자 f나 대문자 F를 붙여 컴파일러에게 float 타입임을 알려야한다.

public class FloatDoubleExample {
	public static void main(String[] args) {
		//정밀도 확인
		float var1 = 0.1234567890123456789f;
		double var2 = 0.1234567890123456789;
		System.out.println("var1: " + var1); // var1 : 0.123456789
		System.out.println("var2: " + var2); // var2 :0.123456789012345678
	}
 }

double타입은 float 타입에 비해 2배의 정밀도를 가져 이름이 '더블'이다.

자동 타입 변환

byte < short, char < int < long < float < double

값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.

큰 허용 범위 타입 = 작은 허용 범위 타입

 

자동 타입 변환 예외 

byte byteValue = 65;
char charValue = byteValue; // 컴파일에러

char 타입의 허용 범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문.
(char 타입의 범위 내부의 4,5와같은 값도 대입하면 에러 발생)

강제 타입 변환

큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장할 때 발생.

캐스팅 연산자로 () 를 사용하며, 괄호 안에 들어가는 타입은 쪼개는 단위이다.

작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입

 

int -> byte 예시

int intValue = 10;
byte btyeValue = intValue;  // 값 보존 OK 

int intValue = 100000000;
byte btyeValue = intValue; // 값 보존 X

작은 허용 범위 타입에 저장될 수 있는 값을 캐스팅해야 값이 보존 된다.

연산식에서의 자동 타입 변환

자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 연산을 수행한다.

byte v1 = 10;
byte v2 = 20;
byte result2 = v1 + v2; //int 타입으로 변환 후 연산 -> 컴파일 에러

byte result2 = (byte)(v1 + v2);
int result2 = v1 + v2;

위와 같이 변수(x,y)가 피연산자로 사용되면 변수값은 int 타입으로 변환되어 연산되고 결과타입도 int타입으로 생성된다.

따라서 결과값을 (명시적형변환 없이)byte타입에 저장할 수 없고, int 변수에 저장해야한다.

 

기본적으로 정수는 변수가 피연산자로 사용되면 int타입으로 변환 된다.

int v4 = 100;
long v5 = 1000L;
long result3 = v4 + v5; //long 타입으로 변환 후 연산

하지만 허용 범위가 큰 타입이 피연산자로 사용되면 다른 피연산자는 해당 허용 범위가 큰 타입으로 변환되어 연산을 수행하며 반환값 또한 큰 허용 범위 타입이다.

실수또한 마찬가지이며, 피연산자 모두 f가 붙어있으면 float타입으로 연산을 수행하며 결과도 float타입이다.

 

자바에서의  +연산자의 두가지 기능

int value = 1 + 2 + 3; ==> int value = 3 + 3; ==>  int value = 6;

String str = 1 + 2 + "3"; ==>  String str = 3 + "3"; ==>  String str = "33";

String str = 1 + "2" + 3; ==>  String str = "12" + 3; ==>  String str = "123";

String str = "1" + 2 + 3; ==>  String str = "12" + 3; ==>  String str = "123";

 

피연산자가 모두 숫자일 경우에는 덧셈 연산을 수행하고, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다.

또한 연산식에서 + 연산자가 연이어 나오면 앞에서부터 순차적으로 + 연산을 수행한다.

 

자바에서의 계산

1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.

2. 서로 다른 타입의 계산은 큼 범위로 자동 형변환 일어난다.

 

문자열을 기본타입으로 변환

변환 타입 사용 예
String => byte String str = "10";
byte value = Byte.parseByte(str);
String => short String str = "200";
short value = Short.parseShort(str);
String => int String str = "300000";
int value = Integer.parseInt(str);
String => long String str = "40000000000";
long value = Long.parseLong (str);
String => float String str = "12.345";
float value = Float.parseFloat(str);
String => double String str = "12.345";
double value = Double.parseDouble(str);
String => boolean String str = "true";
boolean value = Boolean.parseBoolean(str);

기본타입을 문자열로 변환

String str = String.valueOf(기본타입값);

 

형식 문자열 printf

형식 문자열에서 %와 conversion(변환문자)는 필수이며 이외는 생략가능하다.

%는 형식문자열의 시작을 뜻하고, converseion은 제공되는 값의 타입에 따라 d(정수), f(실수), c(문자), s(문자열), o(8진수), x(16진수)가 온다.

System.out.printf("이름 : %1$s, 나이 : %2$d", "김자바",25);

값이 두 개 이상일 경우에는 값의 순번(argument_index$)을 포함시켜야한다.

 

flag는 빈공간을 채우는 방법이며, 생략되면 왼쪽이 공백으로 채워지고 -가 오면 오른쪾이 공백으로 채워지며 0은 공백 대신 0으로 채운다.

with는 소수점을 포함한 전체 자릿수.

precision은 소수 이하 자릿수이다.

 

'모카스터디 > Java' 카테고리의 다른 글

연산자와 반복문과 조건문  (0) 2024.10.01
자바의 특징 및 자바 프로그램 실행과정  (1) 2024.09.30
자바 문자열 및 배열  (0) 2024.09.14