이것이 자바다 - Chapter 2

윤여준·2022년 5월 7일
0
post-thumbnail

변수란?

변수란 하나의 값을 저장할 수 있는 메모리 공간이다.

변수에는 하나의 값만 저장할 수 있다.
변수에는 한 가지 타입의 값만 저장할 수 있다.

변수의 선언

변수는 "타입 변수이름;" 과 같은 형식으로 선언해주면 된다.

int age; //정수 값을 저장할 수 있는 age 변수 선언
double value; //실수 값을 저장할 수 있는 value 변수 선언

다음과 같이 콤마를 이용해 한꺼번에 선언할 수도 있다.

int x,y,z;

변수 이름은 메모리 주소에 붙여진 이름이다.

변수 이름은 자바 언어에서 정한 명명 규칙(naming convention)을 따라야 한다. 변수 명명 규칙은 다음과 같다.

작성 규칙
첫 번째 글자는 문자이거나 '$','_'이어야 하고 숫자로 시작할 수 없다. (필수)가능: price, $_companyName
안됨: 1v, @speed,$#value
영어 대소문자가 구분된다. (필수)firstname과 firstName은 다른 변수
첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다.(관례)maxSpeed, firstName, carBodyColor
문자 수(길이)의 제한은 없다.
자바 예약어는 사용할 수 없다.(필수)

변수값 저장

변수에 값을 저장할 때는 대입 연산자(=)를 사용한다.

변수를 선언하고 처음 값을 저장할 경우, 이러한 값을 초기값이라고 한다. 그리고 변수에 초기값을 주는 행위를 변수의 초기화라고 한다.

변수 선언과 초기화는 따로 할 수도 있고 동시에 할 수도 있다.

int score1; // 변수 선언
score1 = 90; // 초기화

int score2 = 90; // 변수 선언과 초기화를 동시에

변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 직접 입력된 값을 리터럴(literal)이라고 부른다. 리터럴은 값의 종류에 따라 정수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴로 구분된다. 리터럴은 상수와 같은 의미지만, 상수를 "값을 한 번 저장하면 변경할 수 없는 변수"로 정의하기 때문에 이와 구분하기 위해 리터럴이라는 용어를 사용한다.

정수 리터럴

소수점이 없는 정수 리터럴은 10진수로 간주한다.

0, 75, -100

0으로 시작되는 리터럴은 8진수로 간주한다.

02, -04

0x 또는 0X로 시작하고 0~9 숫자나 A,B,C,D,E,F 또는 a,b,c,d,e,f로 구성된 리터럴은 16진수로 간주한다.

0x5, 0xA, 0xB3,0xAC08

정수 리터럴을 저장할 수 있는 타입은 byte, char, short, int, long이 있다.

실수 리터럴

소수점이 있는 리터럴은 10진수 실수로 간주한다.

0.25, -3.14

대문자 E 또는 소문자 e가 있는 리터럴은 10진수 지수와 가수로 간주한다.

5E7 (=5 x 10^7)
0.12E-5 (= 0.12 x 10^-5)

실수 리터럴을 저장할 수 있는 타입은 float, double이 있다.

문자 리터럴

작은 따옴표로 묶은 텍스트는 하나의 문자 리터럴로 간주한다.

'A', '한', '\t', '\n'

문자 리터럴을 저장할 수 있는 타입은 char 하나 뿐이다.

문자열 리터럴

큰따옴표로 묶은 텍스트는 문자열 리터럴로 간주한다. 큰따옴표 안에는 텍스트가 없어도 문자열 리터럴로 간주된다. 문자열 리터럴 내부에서도 이스케이프 문자를 사용할 수 있다.

"대한민국"
"탭 만큼 이동 \t 합니다."
"한 줄 내려 쓰기 \n 합니다."

문자열 리터럴을 저장할 수 있는 타입은 String 하나 뿐이다.

논리 리터럴

true와 false는 논리 리터럴로 간주한다.

true, false

논리 리터럴을 저장할 수 있는 타입은 boolean 하나 뿐이다.

변수 값 읽기

변수는 초기화가 되어야 읽을 수 있고, 초기화되지 않은 변수는 읽을 수 없다.

변수의 사용 범위

변수는 중괄호 블록 내에서 선언되고 사용된다. 중괄호 블록은 클래스, 생성자, 메소드에서 사용된다.

메소드 블록 내에서 선언된 변수는 로컬 변수(local variable)라고 부른다. 로컬 변수는 메소드 실행이 끝나면 메모리에서 자동으로 없어진다.

변수는 선언된 블록 내에서만 사용이 가능하다.

데이터 타입

모든 변수에는 타입이 있으며, 타입에 따라 저장할 수 있는 값의 종류와 범위가 달라진다.

기본(원시: primitive) 타입

기본 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다.

정수 타입

기본 타입메모리 사용 크기저장되는 값의 범위
byte1 byte = 8 bit-128 ~ 127
char2 byte = 16 bit0~65,535
short2 byte = 16 bit-32768~32767
int4 byte = 32 bit-2147483648~2147483647
long8 byte = 64 bit-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

실수 타입

기본 타입메모리 사용 크기저장되는 값의 범위
float4 byte = 32 bit1.4E-45 ~ 3.4028235E38
double8 byte = 64 bit4.9E-324 ~ 1.7976931348623157E308

논리 타입

기본 타입메모리 사용 크기저장되는 값의 범위
boolean1 byte = 8 bittrue, false

타입 변환

타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.

타입 변환에는 자동(묵시적) 타입 변환이 있고, 강제(명시적) 타입 변환이 있다.

자동 타입 변환

자동 타입 변환(Promotion)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다. 자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다. 큰 크기 타입과 작은 크기 타입의 구분은 사용하는 메모리 크기이다.

크기별로 타입을 정리하면 다음과 같다.

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

단 char는 2byte의 크기를 자지지만, char의 범위는 0~65535 이므로 음수가 저장될 수 없다. 따라서 음수가 저장될 수 있는 byte 타입을 char 타입으로 자동 변환시킬 수 없다.

강제 타입 변환

큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다.

대신 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것은 가능한데, 이것을 강제 타입 변환(캐스팅: Casting)이라고 한다. 강제 타입 변환은 캐스팅 연산자 ()를 사용하는데, 괄호 안에 들어가는 타입은 쪼개는 단위이다.

아래는 int타입 변수를 byte타입 변수로 강제 타입 변환을 시키는 코드이다.

int intValue = 103029770;
byte byteValue = (byte) intValue; // 강제 타입 변환 (캐스팅)

위의 코드에서 byteValue 변수에는 103029770이 아닌 10이 저장된다. 왜냐하면 intValue 변수의 값들 중 끝에 있는 1 byte만 byteValue 변수에 저장되었기 때문이다.

위의 경우처럼 강제 타입 변환을 할 땐 값이 손실되지 않도록 하는 것이 중요한데, 이를 위해 강제 타입 변환을 하기 전에 if 문을 통해 안전하게 값이 보존될 수 있는지 검사한 후에 강제 타입 변환을 하는 것이 좋다.

이를 위해 자바에서는 boolean과 char 타입을 제외한 모든 기본 타입의 최댓값과 최솟값을 다음과 같이 상수로 제공하고 있다.

기본 타입최댓값 상수최솟값 상수
byteByte.MAX_VALUEByte.MIN_VALUE
shortShort.MAX_VALUEShort.MIN_VALUE
intInteger.MAX_VALUEInteger.MIN_VALUE
longLong.MAX_VALUELong.MIN_VALUE
floatFloat.MAX_VALUEFloat.MIN_VALUE
doubleDouble.MAX_VALUEDouble.MIN_VALUE

또한 int 값을 float으로 변환하면 오류가 발생할 수 있다. 그래서 모든 int 값을 안전하게 실수 타입으로 변환하고 싶으면 double 타입을 사용하는 것이 좋다.

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

연산은 기본적으로 같은 타입의 피연산자(operand) 간에만 수행되기 때문에 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.

자바는 정수 연산일 경우 int 타입을 기본으로 한다. 그 이유는 피연산자를 4byte 단위로 저장힉 때문이다. 크기가 4byte보다 작은 타입(byte, char, short)은 4byte인 int 타입으로 변환된 후 연산이 수행된다. 따라서 연산의 결과도 int 타입이 된다.

profile
Junior Backend Engineer

0개의 댓글