[Java] 02. 변수와 타입

JK·2024년 4월 5일
0

[Java]

목록 보기
2/11

변수 선언

컴퓨터 메모리(RAM)는 수많은 번지들로 구성된 데이터 저장 공간으로, 많은 데이터를 원활하게 관리하기 위해 변수(Variable)를 사용한다.

변수(Variable)

변수(Variable)는 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름이다. 변수를 사용하려면 변수 선언이 필요하다. 자바의 변수는 다양한 타입의 값을 저장할 수 없고, 변수 선언 시에 지정한 한가지 타입의 값만 저장할 수 있다.

변수 선언

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

[변수 타입] [변수 이름];

변수 이름은 첫번째 글자가 문자여야 하고, 중간부터는 문자, 숫자, $, _를 포함할 수 있다. 변수 이름은 가급적 의미있는 이름으로, 관례에 따라 짓는 것이 좋다. 첫 문자를 소문자로 시작하되 카멜 표기법(여러 단어를 혼합하여 명명하는 경우, 대소문자가 섞여 있도록 작성하는 스타일)을 사용하는 것이 관례이다.

변수 선언은 변수의 타입과 이름만 결정한 것이지 아직 메모리에 할당된 것은 아니다. 메모리에 변수를 할당하기 위해서는 변수 초기화 과정이 필요하다.

변수 초기화

변수 초기화는 변수에 최초로 값을 대입하는 것으로, 변수 선언과 동시에 수행할 수 있다.

[변수 타입] [변수 이름] = 초기값;

변수 초기화 과정을 거치고 나면 변수가 메모리에 할당되고 해당 메모리에 값이 저장된다. 초기화되지 않은 변수를 연산식에 사용할 경우 컴파일 에러(The local variable value may not have been initialized)가 발생한다.

자바에서 제공하는 기본 타입

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

정수 타입

타입메모리 크기저장되는 값의 허용 범위
byte1byte(8bit)-2^7 ~ 2^7-1
short2byte(16bit)-2^15 ~ 2^15-1
char2byte(16bit)0 ~ 2^16-1(유니코드)
int4byte(32bit)-2^31 ~ 2^31-1
long8byte(64bit)-2^63 ~ 2^63-1

메모리 크기가 n일 때, 최상위 bit는 부호를 판별하는 용도로 사용된다. 최상위 bit가 0일 경우는 양수, 1일 경우는 음수이다. 음수의 경우 최상위 bit를 제외하고 n-1개의 bit를 모두 1의 보수로 바꾸고 1을 더한 값에 해당하는 음수가 된다.

리터럴(literal)은 프로그래머가 직접 입력한 값으로, 변수에 대입할 정수 리터럴은 진수에 따라 작성 방법이 다르다.

  • 2진수 : 0b 또는 0B로 시작하고 0과 1로 작성한다.
  • 8진수 : 0으로 시작하고 0 ~ 7의 숫자로 작성한다.
  • 10진수 : 소수점이 없는 0 ~ 9의 숫자로 작성한다.
  • 16진수 : 0x 또는 0X로 시작하고 0 ~ 9의 숫자와 A, B, C, D, E, F 또는 a, b, c, d, e, f로 작성한다.

변수의 허용 범위를 초과한 값을 대입할 경우 컴파일 오류가 발생한다. 또한 기본적으로 컨트롤러는 정수 리터럴을 int 타입으로 간주하기 때문에 long 타입으로 저장할 경우 뒤에 L 또는 l을 붙여야 한다.

문자 타입

문자 리터럴은 하나의 문자를 작은 따옴표(')로 감싼 것으로, char 타입의 변수에 유니코드(세계 각국의 문자를 0 ~ 65535의 숫자로 매핑한 국제 표준 규약)로 변환되어 저장된다. char 타입은 정수 타입이므로 유니코드의 숫자를 직접 대입하는 것도 가능하다.

단, 문자 리터럴을 변수에 대입할 때 아무것도 없는 빈 문자('')를 대입하면 컴파일 에러가 발생한다. 이 경우에는 공백(' ', 유니코드 32) 하나를 포함하여 대입하면 에러가 발생하지 않는다.

실수 타입

타입메모리 크기저장되는 값의 허용 범위(양수 기준)유효 소수 이하 자리
float4byte(32bit)1.4 x 10^-45 ~ 3.4 x 10^387자리
double8byte(64bit)4.9 x 10^-324 ~ 1.8 x 10^30815자리

자바는 IEEE 754 표준에 근거하여 float 타입과 double 타입의 값을 부동 소수점(floating-point) 방식으로 메모리에 저장한다.

부동 소수점 방식은 실수를 근사하게 표현하기 위해, 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적어서 나타내는 방식을 말한다. 따라서 유효숫자를 나타내는 가수와, 소수점의 위치를 나타내는 지수로 나누어서 표현한다.

실수 타입은 이 가수와 지수를 저장하기 위해 전체 bit를 아래와 같이 나누어 사용한다.

  • float : 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit
  • double : 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit

실수 리터럴은 소수점을 포함한 10진수 리터럴로 작성하거나(ex. 11.345), e 또는 E가 포함된 10의 거듭제곱 리터럴(ex. 5e2 = 5x10^2, 0.12E-2 = 0.12x10^-2)로 작성한다. 또한 컴파일러는 실수 리터럴을 기본적으로 double 타입으로 인식하기 때문에 float 타입에 대입할 경우 명시적으로 실수 리터럴 뒤에 f 또는 F를 붙여야 한다.

논리 타입

논리 리터럴은 true, false 두 가지가 존재하며, boolean 타입의 변수에 저장한다. boolean 타입의 변수는 두 가지의 상태값을 저장할 필요가 있을 경우에 주로 사용하는데, 조건문과 제어문의 실행 흐름을 변경하는데 많이 사용된다.

문자열 타입

문자열은 큰 따옴표(")로 감싼 여러 개의 문자들을 의미한다. String 타입을 사용하여 저장하는데, 여기서 String 타입은 자바 기본 타입에 속하지 않는 참조 타입이다.

이스케이프 문자는 문자열 내부에 \가 붙은 문자를 사용하는 것으로 아래와 같이 사용한다.

이스케이프 문자
\"" 문자 포함
\'' 문자 포함
\\\ 문자 포함
\u16진수16진수 유니코드에 해당하는 문자 포함
\t출력 시 탭만큼 띄움
\n출력 시 줄바꿈(라인피드)
\r출력 시 캐리지 리턴(커서 위치를 같은 행 맨 앞의 위치로 복귀시키는 것)

자바 버전에 따라 제공되는 텍스트 블록 문법

  • Java 13 : 큰 따옴표(") 3개로 감싸면 이스케이프나 라인피드없이도 작성한 그대로 문자열로 저장된다.
  • Java 14 : 텍스트 블록 내에서 맨 끝에 \를 붙이면 줄바꿈을 무시한다.

타입 변환

자동 타입 변환

자동 타입 변환(promotion)은 자동으로 타입 변환이 일어하는 것을 말한다. 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다. 값의 허용 범위는 byte < short = char < int < long < float < double 순으로, 왼쪽 타입이 오른쪽 타입에 대입될 때 자동 타입 변환이 일어난다. 예외적으로 byte 타입은 char 타입으로 자동 변환될 수 없는데, char 타입에는 음수가 존재하지 않지만 byte 타입에는 음수가 존재하기 때문이다.

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

자바는 실행 성능 향상을 위해 컴파일 단계에서 연산을 수행하지만, 리터럴이 아닌 변수가 피연산자로 사용될 경우에는 실행 시에 연산을 수행한다. 이 때, 작은 타입의 피연산자는 큰 타입의 피연산자와 같은 변수로 자동 타입 변환이 일어난 후에 연산을 수행한다. 정수 연산의 결과값은 기본적으로 int 타입으로, int 타입보다 작은 타입의 변수끼리 연산을 수행해도 결과값은 int 타입으로 생성된다.

연산식에서 + 연산자는 두 가지 기능을 갖는다. 피연산자가 모두 숫자일 경우에는 덧셈 연산을 수행한다. 그러나 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 타입 변환되어 문자열 결합 연산을 수행한다.

강제 타입 변환

강제 타입 변환(casting)캐스팅이라고도 하는데, 큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것을 말한다. 캐스팅 연산자로 괄호()를 사용하여 괄호 안에 들어가는 타입으로 쪼개어서 저장한다. 캐스팅이 이루어질 경우, 기본적으로 줄어드는 byte 크기만큼 앞부분에 저장되어 있는 byte는 삭제되고 뒷부분에 저장되어 있는 byte만 보존된다.

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

문자열은 참조 타입으로, 기본 타입에 포함되지 않기 때문에 문자열을 기본 타입으로 변환할 때는 강제 타입 변환과 다른 방식으로 이루어진다.

변환 타입사용 예
String -> bytebyte value = Byte.parseByte(str);
String -> shortshort value = Short.parseShort(str);
String -> intint value = Integer.parseInt(str);
String -> longlong value = Long.parseLong(str);
String -> floatfloat value = Float.parseFloat(str);
String -> doubledouble value = Double.parseDouble(str);
String -> booleanboolean value = Boolean.parseBoolean(str);

반대로 기본 타입의 값을 문자열로 변경하는 경우에는 String.valueOf() 메소드를 이용한다.


변수값 입력 및 출력

변수값 출력

표준 출력 장치인 모니터(명령 프롬프트, 터미널, 콘솔)에 값을 출력하기 위해 System.out.print() 메소드를 사용한다.

메소드의미
println(내용);괄호 안의 내용을 출력하고 행을 바꿔라.
print(내용);괄호 안의 내용을 출력하고 행은 바꾸지 말아라.
printf("형식문자열", 값1, 값2, ...);형식 문자열에 맞추어 뒤의 값을 출력해라.

형식문자열은 아래와 같은 형태를 갖는 문자열을 말한다.

%[argument_index$][flags][width][.precision]conversion
  • % : 형식문자열의 시작을 의미하며, 필수로 작성해야 한다.
  • argument_index$ : 값의 순번을 의미하며, 생략 가능하다.
  • flags : 생략 시 왼쪽이 공백으로 채워지고, -가 오면 오른쪽이 공백, 0이 오면 0으로 공백을 채운다.
  • width : 소수점을 포함한 전체 자릿수를 의미하고 생략이 가능하다.
  • .precision : 소수점 이하의 자릿수를 의미하고 생략이 가능하다.
  • conversion : 변환 문자로 필수로 작성해야 한다.

변환 문자의 종류와 형식문자열의 사용 예시는 아래와 같다.

형식화된 문자열설명출력형태
정수%d정수123
%6d6자리 정수. 왼쪽 빈자리 공백___123
%-6d6자리 정수. 오른쪽 빈자리 공백123___
%06d6자리 정수. 왼쪽 빈자리 0으로 채움000123
실수%10.2f정수 7자리 + 소수점 + 소수 2자리. 왼쪽 빈자리 공백____123.45
%-10.2f정수 7자리 + 소수점 + 소수 2자리. 오른쪽 빈자리 공백123.45____
%010.2f정수 7자리 + 소수점 + 소수 2자리. 왼쪽 빈자리 0으로 채움000123.45
문자열%s문자열abc
%6s6자리 문자열. 왼쪽 빈자리 공백___abc
%-6s6자리 문자열. 오른쪽 빈자리 공백abc___
특수문자\t탭(tab)
\n줄바꿈
%%%%

키보드 입력 데이터를 변수에 저장

Scanner를 사용하여 키보드 입력 데이터를 변수에 저장할 수 있다.

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);
String inputData = scanner.nextLine();

nextLine() 메소드는 Enter 키가 입력되기 전까지 블로킹(대기) 상태로 있다가, Enter 키가 입력되면 그동안 입력한 모든 내용을 문자열로 읽어온다.


"한빛 미디어 출판 도서, 이것이 자바다"를 읽고 학습한 내용을 토대로 작성되었습니다.

0개의 댓글