본문 바로가기

Web/Java

[Java/개념] 변수와 상수, 형변환

반응형

변수

- 변하는 수

- 변수를 사용하기 위해 어떤 형태의 자료를 저장할 것인지 정해야 함. 이 형태를 '자료형'이라고 함.

- 변수를 선언한다 = 선언한 변수 이름으로 어떤 위치에 있는 메모리를 얼마 만큼의 크기로 사용하겠다

- 영문자나 숫자 사용 가능. 특수 문자 중에는 $, _만 사용 가능. 예약어는 사용 불가능

 

 

 

 

기본 자료형/프리미티브 타입(primitive)

- 자바 라이브러리에서 기본으로 제공. cf) 참조데이터타입

  정수형 문자형 실수형 논리형
1바이트 byte - - boolean
2바이트 short char - -
4바이트 int - float -
8바이트 long - double -

 

 

1. 정수 자료형

- 양수, 음수, 0을 나타낼 때 사용하는 자료형

- byte형: 바이트 단위의 정보를 저장하거나 통신할 때 주로 사용. 동영상이나 음악 파일을 재생할 때 또는 네트워크로 데이터를 전송할 때 사용 (-128~127)

- short형: -32,768~32,767

- int형: 컴퓨터에서 정수로 연산을 할 때 4바이트 단위로 처리하는 것이 가장 효율적이기 때문에 가장 많이 사용

- long형: 자바는 모든 정수 값을 기본으로 int 형으로 처리하기 때문에 long형으로 처리하라고 컴파일러에게 알려줘야 함. long형을 나타내는 식별자인 L이나 l 을 사용하려는 숫자 뒤에 붙인다. ex) long num = 12345678900L; (* long num = 1000; 의 경우에는 오류가 발생하지 않음 -> int 형 범위를 넘지 않고 int형이 long형으로 자동형 변환되기 때문. 즉, 범위 내부에 있는 값을 사용할 때는 식별자가 필요없음)

 

 

 

2. 문자 자료형

* 문자 인코딩: 문자를 정해진 코드 값으로 변환하는 것. 

* 문자 디코딩: 코드 값을 다시 문자로 변환하는 것.

 

- 아스키코드(ASCII): 영문자, 숫자, 특수 문자 등을 나타내는 문자 세트. 1바이트만 사용

- 유니코드(unicode): 각 언어의 표준 인코딩을 정의해놓은 것. 유니코드의 1바이트는 아스키코드 값과 호환되고, 그 밖의 문자를 2바이트나 그 이상의 조합으로 표현함. 자바는 유니코드에 기반하여 문자를 표현한다. (참고: 유니코드 찾는 사이트, 유니코드 한글 )

- 유니코드를 표현하는 인코딩 방법에는 크게 UTF-8과 UTF-16이 있음. 자바의 기본 인코딩 방식은 모든 문자를 2바이트로 표현하는 UTF-16이지만 메모리가 낭비될 수 있기 때문에 UTF-8을 더 많이 사용. UTF-8은 각 문자마다 1바이트에서 4바이트까지 사용하여 문자를 나타내는 방식. UTF-16에 비해 메모리 낭비가 적고 전송 속도가 빠름. 인터넷에서 많이 사용

 

char myChar = 'A';

 

- 문자를 변수에 대입하면 문자 그대로 저장되는 것이 아니라, 그 문자에 해당하는 정수값(아스키 코드값)이 저장됨

- 프로그램에서 문자를 사용할 때는 작은 따옴표(' ')를 사용. 

- 문자를 여러 개 이은 문자열을 사용할 때는 큰따옴표(" ")를 사용.  문자열의 끝에는 항상 널 문자('\0')가 있음.=> 기본 자료형으로는 표현할 수 없음(String 클래스 사용)

- 문자와 문자열은 전혀 다른 값을 가짐. 'A'는 정수 값 65로 정해져 있는 문자이고, "A"는 "A \0"과 같이 쓰임.

- char형은 문자 자료형이지만 컴퓨터 내부에서는 정수 값으로 표현되기 때문에 정수 자료형으로 분류하는 경우도 있음. 다른 정수 자료형과 차이점은 char형은 음수 값을 표현할 수 없다는 것.

 

package hello;

public class CharEx1 {
	public static void main(String[] args) {
		char ch1 = 'A';
		System.out.println(ch1);	// 결과값: A
		System.out.println((int)ch1);	// 결과값: 65
		
		char ch2 = 66;
		System.out.println(ch2);	// 결과값: B
		
		int ch3 = 67;
		System.out.println(ch3);	// 결과값: 67
		System.out.println((char)ch3);	// 결과값: C
	}
}
package hello;

public class CharEx2 {
	public static void main(String[] args) {
		char ch1 = '한';
		char ch2 = '\uD55C';	// 유니코드값을 직접 사용 가능
		
		System.out.println(ch1);			
		System.out.println(ch2);	// 결과값: 한
	}
}

 

 

 

3. 실수 자료형

- 부동 소수점 방식: 실수 값 0.1은 1.0 X 10^1 로도 표현할 수 있음 => 가수 부분(1.0)과 지수 부분(-1)을 나누어서 실수를 나타내는 방식을 부동 소수점 방식이라고 함. 무한의 실수를 표현하기 위한 방식.

- float형: 부호 1비트 + 지수부 8비트 + 가수부 23비트 = 총 32비트 (4바이트)

- double형: 부호 1비트 + 지수부 11비트 + 가수부 52비트 = 총 64비트 (8바이트). 자바에서 실수는 double형을 기본으로 사용. double형이 더 정밀하게 실수 표현 가능.

 

package hello;

public class DoubleEx1 {
	public static void main(String[] args) {
		double dnum = 3.14;
		float fnum = 3.14F;	// double형이 아닌 float형 값이 대입된다는 의미로 F나 f를 붙여서 식별해줌
		
		System.out.println(dnum);	// 출력 결과: 3.14
		System.out.println(fnum);	// 출력 결과: 3.14
	}
}

 

- 실수의 오차가 존재하는 것은 프로그램의 문제가 아니라 컴퓨터 구조 상의 문제

 

package hello;

public class DoubleEx2 {
	public static void main(String[] args) {
		double dnum = 1;
		
		for (int i = 0; i < 1000; i++) {
			dnum = dnum + 0.1;
		}
		System.out.println(dnum); // 출력 결과: 100.99999999999854
	}
}

 

 

 

4. 논리 자료형

- 어떤 변수의 참, 거짓의 값을 나타내는 데 사용

- 1바이트로 값 저장. true / false 두 가지 값만 가짐

 

package hello;

public class BooleanEx {
	public static void main(String[] args) {
		boolean isMarried = true;
		System.out.println(isMarried);
	}
}

 

 

 

 

자료형 없이 변수 선언하기

- 자바의 모든 변수를 사용할 때는 사용할 자료형을 정확히 명시해야 함. 즉, 어떤 변수가 얼마만큼의 메모리를 사용하고 어떤 방식으로 그 값을 저장할지 자료형으로 선언해주는 것.

- 자바 10부터는 자료형을 쓰지 않고도 변수 사용 가능 => 지역 변수 자료형 추론(local variable type interface): 변수에 대입되는 자료를 보고 컴파일러가 추측하여 알 수 있음

- 자바에서 var를 사용할 때

 1) 한번 선언한 자료형 변수를 다른 자료형으로 사용 불가

 2) 지역 변수만 가능 (* 지역변수: 프로그램의 { } 에서 사용할 수 있는 변수)

 

 

 

 

상수(constant)

- 항상 변하지 않는 값

- 상수를 사용할 때는 상수라는 것을 구분하기 위해서 변수와 다르게 전체를 대문자로 사용하는 것이 관례.

- 프로그램 내부에서 반복적으로 사용하고, 변하지 않아야 하는 값을 상수로 선언하여 사용하면 좋음. 

- 참고: 자바의 final 는 언제 사용할까 | 룰라랄라코딩

 

final double PI = 3.14;
final int MAX_NUM = 100;
package hello;

public class Constant {
	public static void main(String[] args) {
		final int MAX_NUM = 100; // 선언과 동시에 초기화
		final int MIN_NUM;
		
		MIN_NUM = 10; // 사용하기 전에 초기화. 초기화하지 않으면 오류 발생
		
		System.out.println(MAX_NUM);
		System.out.println(MIN_NUM);
	}
}

 

 

 

리터럴(literal)

- 프로그램에서 사용하는 모든 숫자, 문자, 논리값(true, false)을 일컫는 말.

- 리터럴은 프로그램이 시작할 때 시스템에 같이 로딩되어 특정 메모리 공간인 상수 풀(constant pool)에 놓인다. 예를 들어 int num = 3; 문장에서 값 3이 메모리 공간 어딘가에 존재해야 num 변수에 그 값을 복사할 수 있음. 즉, 숫자가 변수에 대입되는 과정은 일단 숫자 값이 어딘가 메모리에 쓰여 있고, 이 값이 다시 변수 메모리에 복사되는 것.

- 참고: 위키백과

 

 

 

형 변환(Type Conversion)

정수와 실수는 컴퓨터 내부에서 표현되는 방식이 다르기 때문에 정수와 실수를 더한다고 할 때  하나의 자료형으로 통일한 한 우에 연산을 해야 한다. 이때 형변환을 해줘야 함.

 

1. 묵시적 형 변환/자동 형 변환

- 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우

byte bNum = 10; 	// 1 byte
int iNum = bNum;	// 4 byte - 남은 3byte는 0으로 채워짐

 

- 덜 정밀한 자료형(정수)에서 더 정밀한 자료형(실수)으로 대입하는 경우: 같은 4 byte 라도 float형이 더 정밀하게 데이터 표현 가능

int iNum2 = 20;
float fNum = iNum2;

 

- 연산 중에 자동 변환되는 경우

int iNum = 20;
float fNum = iNum;
double dNum;

// fNum + iNum 에서 int형이 float형으로 변환. 두 변수를 더한 값이 dNum에 대입되면서 double형으로
dNum = fNum + iNum;	

 

 

2. 명시적 형 변환/강제 형 변환

* 캐스팅 연산자 사용: (byte) num

- 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우

// * 이 경우 대입된값이 10을 1바이트 안에 표현할 수 있으므로 자료 손실이 없음
int iNum = 10;
byte bNum = (byte)iNum;
// * 1000은 byte형 범위(-128-127)을 넘기 때문에 자료 손실이 발생해 대입된 값이 -24로 출력됨
int iNum = 1000;
byte bNum = (byte)iNum;

 

- 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우

double dNum = 3.14;
int iNum2 = (int)dNum;	// 출력값: 3 (소수점 이하 부분 생략됨)

 

- 연산 중 형변환 

double dNum1 = 1.2;
float fNum2 = 0.9F;

int iNum3 = (int)dNum1 + (int)fNum2;	// 두 실수가 각각 형 변환 => 1, 0 -> 1
int iNum4 = (int)(dNum1 + fNum2);		// 두 실수의 합이 계산된 후 형 변환 => 2.1 -> 2

 

 

* 내용 출처: 자바 프로그래밍 입문(박은종)

 

반응형