[JAVA] 변수와 자료형

AI 개발자 웅이·2022년 6월 26일
0

Java

목록 보기
1/11
post-custom-banner

컴퓨터에서 데이터 표현하기

  • 컴퓨터는 0과 1로만 데이터를 저장한다.
  • bit: 컴퓨터가 표현하는 데이터의 최소 단위로 2진수 하나의 값을 저장할 수 있는 메모리의 크기
  • byte: 1byte = 8bit

Java에서 진수 표현하기

Java에서 진수로 입력하는 규칙은 아래 예시를 참고하자. 아래 예시는 숫자 '10'을 10, 2, 8, 16진수로 표현한 것이다.

public static void main(String[] args) {

	int num = 10; //10진수
	int bNum = 0B1010; // 2진수
	int oNum = 012; // 8진수
	int hNum = 0XA; // 16진수
	
	System.out.println(num);
	System.out.println(bNum);
	System.out.println(oNum);
	System.out.println(hNum);
}
  • 10진수: 일반적으로 사용하는 숫자 표현 방식을 사용한다.
  • 2진수: 2진수 입력 전에 '0B'를 붙여준다.
  • 8진수: 8진수 입력 전에 '0'를 붙여준다.
  • 16진수: 16진수 입력 전에 '0X'를 붙여준다.

Java에서 음의 정수를 2진수로 표현하기

32bit로 정수를 표현했을 때 가장 왼쪽에 존재하는 비트(MSB, Most Significant Bit)가 부호비트다. 부호비트가 0이면 양수, 1이면 음수를 나타낸다.

먼저 -5를 표현하는 방법을 단계별로 보면 아래와 같다.

step 1. 양의 정수를 표현한다.

0000..0101

step 2. 1의 보수(0이면 1, 1이면 0)를 취한다.

1111..1010

step 3. 1을 더한다.

1111..1011

정상적으로 음의 정수가 표현되었는지를 확인하기 위해 5를 이진수로 표현한 것과 -5를 이진수로 표현한 것을 더해보자.

0000..0101 + 1111..1011

자릿수가 33으로 바뀌고 맨 앞의 숫자가 1, 나머지는 모두 0이 된다. 33자리 숫자는 32bit으로 표현할 수 없기 때문에 맨 앞 숫자가 제외되므로, 합은 0으로 처리된다.

이것을 코드로 확인해보면 아래와 같다.

public static void main(String[] args) {

	int num1 = 0B00000000000000000000000000000101; // 5
	int num2 = 0B11111111111111111111111111111011; // -5
	
	int sum = num1 + num2; // 0
	System.out.println(num1);
	System.out.println(num2);
	System.out.println(sum);
	
}

변수(variable)와 자료형(data type)

변수

  • 프로그램에서 사용되는 자료를 저장하기 위한 공간
  • 할당 받은 메모리의 주소 대신 부르는 이름
  • 사용되기 이전에 선언되어야 한다.

자료형

변수가 사용할 공간의 크기와 특성에 따라 자료형을 사용하여 변수를 선언한다.

  • 정수는 default로 int 자료형으로 저장이 되기 때문에, long 자료형을 쓰고 싶으면 literal 뒤에 l 또는 L을 붙여줘야 한다.
long lNum = 30L;
  • 실수는 default로 double 자료형으로 저장이 되기 때문에, float 자료형을 쓰고 싶으면 literal 뒤에 f 또는 F를 붙여줘야 한다.
float fNum = 3.14F;

컴퓨터에서는 문자도 내부적으로는 비트의 조합으로 표현되며, 자바에서는 문자를 2바이트로 처리한다. 이때 문자를 특정한 숫자 값으로 변환하는 것을 인코딩, 숫자 값을 원래의 문자로 변환하는 것을 디코딩이라고 한다. 인코딩, 디코딩 과정에서 변환 숫자 값이 필요한데, 이것을 정해놓은 것이 문자세트이다. 문자세트에는 ASCII, Unicode 등이 있다.

이처럼 변수를 선언할 때, 자료형을 함께 사용하는 이유는 해당 변수가 사용할 메모리 크기와 타입을 구분하기 위해서다. 만약 자료형을 함께 입력하지 않는다면(자료형 대신 var을 쓰는 경우), 지역 변수 자료형 추론(local variable type inference)으로 변수에 대입되는 값(literal)을 보고 컴파일러가 추론해서 자료형을 지정해준다.

상수(constant)

상수는 변하지 않는 값으로, 선언하기 위해서는 final 키워드를 사용한다.

Example.

public static void main(String[] args) {
	final int MAX_NUM = 100;
	final double PI = 3.14;
	
	final int STUDENT_NUM = 30;
	int num = 0;
	if (num == STUDENT_NUM) {}
	System.out.println(STUDENT_NUM);
}

final로 선언된 상수에 다른 값을 대입하면 에러가 난다. 프로그램 내에서 변경되지 않아야 하는 값을 상수로 선언해두고 혹시 변경되는 경우 선언된 값만 수정하는 식으로 사용한다.

리터럴(literal)

리터럴은 프로그램에서 사용하는 모든 숫자, 값, 논리 값을 의미한다. 예를 들어 10, 3.14, 'A', true가 리터럴에 해당된다. 리터럴에 해당되는 값은 특정 메모리 공간인 상수 풀(constant pool)에 있는데, 필요한 경우 상수 풀에서 가져와서 사용한다. 상수 풀에 저장할 때, 정수는 int, 실수는 double로 저장되므로 long이나 float 값으로 저장해야 하는 경우에는 식별자(L, l, F, f)를 명시해야 한다.

형 변환(type conversion)

자료형을 변환하고 싶을 때는 (변환 후 자료형) literal 형식으로 써주면 된다. 아래는 예시 코드이다.

public static void main(String[] args) {

	double dNum = 3.14;
	iNum = (int)dNum; // 3
	System.out.println(iNum);
	float fNum = 0.9F;
	
	int num1 = (int)dNum + (int)fNum; // 3
	int num2 = (int)(dNum + fNum); // 4
	System.out.println(num1);
	System.out.println(num2);
}
profile
저는 AI 개발자 '웅'입니다. AI 연구 및 개발 관련 잡다한 내용을 다룹니다 :)
post-custom-banner

0개의 댓글