Variables and Data type with Java

민준·2023년 2월 13일
0

1. Binary

ㄱ) 2진수

기본적으로 컴퓨터는 0과 1, 즉 이진법으로 데이터를 분석하고 저장합니다.
1bit = 0 또는 1을 저장할 수 있는 메모리 크기입니다.
1Byte = 8bit 입니다.

a) 2진수 > 10진수 변환

2진수는 2의 거듭제곱을 이용해 10진수로 변환할 수 있습니다.

예를 들어 2진수 '1101'을 10진수로 변환하려면
맨 오른쪽부터 '(1 * 2⁰) + (0 * 2¹) + (1 * 2²) + (1 * 2³)'을 계산하면 10진수가 됩니다.
= 1 + 0 + 4 + 8
= 13

b) 10진수 > 2진수 변환

반대로 10진수를 2진수로 변환할 때에는
2로 나누며 나온 몫을 다시 2로 나눠가며 나머지들을 나열해 뒤집으면 됩니다.

예를 들어 '13'을 2진수로 만들려면,
'13' / 2 = 2 * '6'(몫) + '1'(나머지)
> '6' / 2 = 2 * '3'(몫) + '0'(나머지)
> '3' / 2 = 2 * '1'(몫) + '1'(나머지)
> '1' / 2 = 2 * '0'(몫) + '1'(나머지)
위에서부터 '1011', 반대로 뒤집으면 '1101'이 됩니다.

자바에서 숫자를 표현할 때 그냥 수를 적으면 기본적으로 10진수이고,
'0B'를 맨 앞에 분이면 2진수, ex) 0B1010
'0'을 맨 앞에 붙이면 8진수, ex) 012
'0X'를 맨 앞에 붙이면 16진수 입니다. ex) 0XA
아래 화면 하단의 콘솔창에서 결과를 확인할 수 있습니다.

ㄴ) 2진수 음의 정수 표현

2진수로 음양의 정수를 표현할 때
맨 왼쪽 공간에 '보수'라고하여 0과 1로 '+', '-'부호를 지정합니다.
MSB : Most Significant Bit 이 수가 0이면 양수, 1이면 음수입니다.

예를 들어 10진수 5의 2진수 '00000101'(여기에서는 8bit만 사용)를 음수로 표현하려면
위에서 말한 것처럼 맨 왼쪽에 1만 붙여 '10000101'이 '-5'일까요?
두 수를 더하면 '10001010'이 되니 틀렸습니다.

강의에서는 2의 보수를 취한다고 표현하는데,
쉽게 말하자면 '00000101'과 더하여 '0'이 되는 2진수를 만들면 됩니다.
그러면 '11111011'이 10진수로 '-5'가 됩니다.
사실은 더 큰수가 될 것처럼 보이지만, 메모리공간 특성상 용량을 넘어간 수는 사라지는 것입니다.

위처럼 8bit만 사용하였을 때에는 'int'의 원래 메모리공간인 32bit를 넘어서지 않으므로
아래 코드에서는 위와 다르게 'int'의 메모리공간인 32bit(4Byte)를 사용하였습니다.
결과는 아래 코드의 화면 하단의 콘솔창에서 확인할 수 있습니다.


2. Variables

변수 는 데이터를 저장하기 위한 메모리 공간입니다.
변수를 만드는 행위 자체를 '선언한다'고 하고

int num;

변수에 값을 대입하거나 변경하는 것을 '초기화한다'고 합니다.

num = 10;

변수를 선언함과 동시에 값을 초기화할 수 있습니다.

int num = 10;
  • 변수의 이름은 의미있고 가독성이 좋도록 짓는 것이 좋습니다.
  • 변수가 사용할 공간의 크기와 특성에 따라 자료형을 사용해 변수를 선언합니다.

3. Data Type

보통의 숫자 데이터인 리터럴 값은 이미 어딘가에 값이 저장돼있고
변수에 대입할 때 그 값을 복사해 초기화합니다.
반면 문자는 아스키코드, 유니코드 등에 해당하는 정수값이 저장됩니다.

a) Encoding and Decoding

이렇게 문자에 따른 특정 숫자 코드 값으로 변형하는 것은 인코딩
반대로 코드 값을 원래의 문자로 변환하는 것을 디코딩 이라고 합니다.

위 코드에서 'char' 자료형 변수에 숫자를 대입하고 출력했을 때
문자로 출력되는 것을 볼 수 있습니다.

b) Floating point

실수를 표현할 때 기본적으로 'double' 자료형(8Byte)을 사용하는데,
만약 'float' 자료형(4Byte)을 사용하게 되면 에러가 나는 경우가 있습니다.
이때 값에 'F' 식별자를 붙여주면 해결됩니다.

c) Local Variable Type Inference

기본적으로 자바에서 변수를 선언 할 때에 변수가 사용할 메모리 크기와 타입을 구분하기 위해 자료형을 사용하는데,
자바 10버전부터 '지역 변수 자료형 추론'이라고 해서
자료형 자리에 'var'를 입력하면 변수에 대입되는 값을 컴파일러가 추측하는 기능이 생겼습니다.
물론 이름에서 알 수 있듯이 '지역 변수'에서만 사용할 수 있습니다.


4. Constants

상수는 변수와 달리 값이 변하지 않습니다. 즉, 다른 값을 대입 할 수 없습니다. 이 경우 에러가 납니다.

상수를 선언하는 방법은 변수를 선언하는 것과 같지만, 맨 앞에 'final' 키워드를 붙여줍니다.
그리고 관용적으로 상수 변수명은 대문자로 표기합니다.

final int MAX_NUM = 100;

5. Literal

리터럴 은 프로그램에서 사용하는 모든 수, 값, 논리 값을 말합니다.
이들은 특정 메모리 공간인 상수 풀(Constant Pool) 안에 이미 있습니다.
필요한 경우 상수 풀에서 복사해와서 사용합니다.
기본적으로 상수 풀에 정수는 'int', 실수는 'double'로 저장합니다.
'long', 'float' 등의 값으로 저장해야하는 경우 식별자(L,I,F)를 명시해야 합니다.

final float PI = 3.14F;

6. Type Conversion

자료형은 각각 사용하는 메모리 크기와 방식이 다릅니다.
서로 다른 자료형의 값이 대입되는 경우 형 변환 이 일어나게 되는데
ㄱ) 묵시적 형 변환 , ㄴ) 명시적 형 변환 이 있습니다.

ㄱ) Implicit Conversion

작은 수 > 큰 수, 덜 정밀한 수 > 더 정밀한 수로 대입되는 경우
특별한 표기 없이 자연스럽게 형 변환이 이루어집니다.

float num = 3;

ㄴ) Explicit Conversion

반대의 경우 변환되는 자료형을 꼭 명시해야합니다.
다만 이 경우 항상 원하는 값을 얻을 수는 없습니다.

double dNum = 3.14;
int num = (int)dNum;

아래 코드에서 'int'형이던 'iNum'을 'byte'로 형 변환시켜 출력해보니 값이 이상하게 나왔습니다.

'byte' 자료형은 메모리 공간이 1Byte이고 이는 256개의 데이터, 즉 -128~ +127 까지 표현할 수 있기 때문에,
값으로 들어온 '1000'이 원래 범위보다 큰 값이라 데이터가 유실되어 예상치 못한 값을 반환받은 것입니다.

아래의 코드에서는 두 값을 형 변환 시킨 다음 더하고(num1)
두 값을 더한 결과를 형 변환(num2) 시켜 그 차이를 출력해보았습니다.
전자의 경우 '3+0', 후자는 '(int)(3.14+0.9)'이기 때문에 각각 3, 4가 출력되었습니다.

profile
백엔드 포지션 공부 중입니다.

0개의 댓글