2-2. 변수의 타입

Hyun Jun·2022년 1월 22일
0

자바의 정석

목록 보기
5/52
post-thumbnail
post-custom-banner

변수의 타입

자료형 (data type)

값(data)의 종류(type)에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것.

 

1. 기본형 (primitive type)

실제 값(data)를 저장한다.

  • 문자형 (char)
  • 정수형 (byte, short, int, long)
  • 실수형 (float, double)
  • 논리형 (boolean)

 

기본형 타입의 메모리 크기는 다음과 같다.

1 byte2 byte4 byte8 byte
논리형boolean
문자형char
정수형byteshortintlong
실수형floatdouble

정수형에서는 int를, 실수형에서는 double을 기본으로 사용한다.

 

2. 참조형 (reference type)

어떤 값이 저장되어 있는 메모리 주소를 값으로 갖는다.

참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용
(참조형 변수의 타입 == 클래스의 이름)

따라서 새로운 클래스를 작성하는 것은 새로운 참조형을 추가하는 것과 같다.

 

String sentence = "I love Java!";

변수 sentence는 문자가 아닌 문자열을 값으로 갖는다. 문자열은 참조형 변수의 일종이고 String이라는 타입이다.

 

상수와 리터럴

1. 상수

상수 또한 값을 저장할 수 있는 메모리 공간을 지칭하지만, 변수와 달리 한번 값을 정하면 변경할 수 없다. 변수의 타입 앞에 final이라는 수식어를 붙여 선언한다.

final int MAX_SPEED = 10;

 

2. 리터럴

"상수가 갖고 있는 값 자체"를 리터럴이라고 부른다.
위의 예시로 치면 10 을 리터럴이라고 지칭할 수 있다.

 

1) 리터럴 접미사

변수나 상수처럼 리터럴에도 타입이 있다.

 

정수형이나 실수형은 타입이 여러 종류이기 때문에 접미사를 붙여 구분한다.

정수형:

  • long 타입 리터럴: 접미사 l 또는 L (L 권장)
long bigNum = 1_000_000_000L;
  • 그 외: 접미사가 없는 리터럴은 int 취급

실수형:

  • float 타입 리터럴: 접미사 f 또는 F
float height = 182.5f;
  • double 타입 리터럴: 접미사 d 또는 D
double price = 1.4208d;
  • 그 외: 접미사가 없는 리터럴은 double 취급 (따라서 d, D는 생략 가능)

 

일반적으로는 변수의 타입과 리터럴의 타입이 일치하지만, 불일치하더라도 변수의 타입 범위가 더 넓다면 저장이 가능하다.

int intChar = 'A'; // char인 'A'의 유니코드값인 65가 int 범위 안에 들어가므로 OK
long longInt = 123; // long이 int보다 큰 범위이므로 OK
double doubleFloat = 182.58f; // double이 float보다 큰 범위이므로 OK

반대의 경우에는 컴파일 에러가 발생한다.

 

2) 문자 리터럴과 문자열 리터럴

문자(char) 리터럴에는 단 하나의 문자만 저장 가능하고, 문자열(String) 리터럴에는 0개 이상의 글자들을 저장 가능하다.

char singleLetter = 'H'; // 홑따옴표 사용
String zeroOrMoreLetters = "Hyun"; // 쌍따옴표 사용

String은 ""과 같이 0개의 문자 할당이 가능(empty string)하지만 char는 무조건 1개의 문자를 할당해야만 한다.

 

3) 형식화된 출력: printf()

println()은 변수의 값을 그대로 출력하기 때문에 사용이 불편할 때가 많다. 반면, printf()는 원하는대로 변수를 가공하여 출력할 수 있어 용이하다.

String name = "Hyun Jun";
System.out.printf("My name is %s", name);

//출력 값: My name is Hyun Jun

%s와 같은 표현을 지시자(specifier)라고 하며, 문자열 내에 들어간 개수 만큼 그 지시자에 들어갈 값(혹은 변수명)을 나열해주면 된다.

String currentMonth = "January";
int currentYear = 2022;
System.out.printf("This month is %s of %d", currentMonth, currentYear);

//출력 값: This month is January of 2022
지시자의미
%b진위값(boolean) 출력
%d10진 정수(decimal) 출력
%o8진 정수(octal) 출력
%x, %X16진 정수(hexa-decimal) 출력
%f부동소수점(float) 출력
%e, %E지수(exponent) 출력
%c문자(char) 출력
%s문자열(string) 출력

%f는 소수점 아래 6자리까지 출력 (7번째 자리에서 반올림)

 

정수형 지시자의 알파벳 앞에 숫자를 붙이면 출력될 총 자리수를 명시할 수 있다.

System.out.printf("[%10d]", 77);
// 출력 값: [        77]
// 77 앞에 10칸의 자리수를 맞추기 위한 공백 8자리가 있다

부동소수형 지시자도 앞에 숫자를 붙여 총 자리수와 소수점 자리수를 명시할 수 있다.

System.out.printf("[%8.4d]", 82.58);
// 출력 값: [ 82.5800]
// 소수점 4자리를 맞추기 위해 없는 자리는 0으로 채워졌고, 나머지 4자리를 정수부로 맞추기 위해 앞자리에 빈칸이 1개 생겼다.

지시자 앞에 붙는 숫자에 음의 부호(-)가 있으면 좌측 정렬된다.

profile
Back-end Engineer 👨‍💻
post-custom-banner

0개의 댓글