본문 바로가기

프로그래밍언어/JAVA

[JAVA] 변수의 타입

반응형

우리가 주로 사용하는 값, data의 종류는 크게 문자와 숫자로 나눌 수 있다. 그리고 숫자는 정수와 실수로 나눌 수 있다.

이러한 값의 타입에 따라 저장될 공간의 크기와 저장 형식을 정의한 것이 자료형, data type 이다. 자료형에는 문자형(char), 정수형 (byte, short, int, long), 실수형 (float, double) 등이 있으며, 변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면 된다.

 

- 기본형과 참조형

 

자료형은 크게 실제 값을 저장하는 기본형과 값을 저장하고 있는 메모리 공간의 주소를 저장하는 참조형으로 나뉜다.

자바에서는 메모리의 주소값을 연산할 수 있는 C언어와는 다르게 참조형 변수 간의 연상르 허용하지 않으므로 실제 연산에 사용되는 타입은 모두 기본형 변수이다.

 

- 기본형 (primitice type)

  • 논리형, 정수형, 실수형 등 계산을 위한 실제 값을 저장한다.
  • 총 8개의 타입이 존재한다.

- 참조형 (reference type)

  • 객체의 주소를 저장한다.
  • 8개의 기본형을 제외한 나머지 타입.

참조형 변수를 선언할 때는 변수의 타입으로 int나 char 같은 기본형이 아닌 타입이 되는 클래스 이름을 사용하여 선언한다. 그렇기 때문에 새로운 클래스를 작성하는 것은 새로운 참조형을 추가하는 것이다

 

참조형 변수를 선언하는 방법은 다음과 같다.

 

// (클래스이름) (변수이름);
// 변수타입으로 클래스를 사용하는 변수들은 모두 참조변수이다.

Date today = new Data();
// Data 객체를 생성해서 그 주소를 변수 today에 저장하였다.

 

참조 변수는 null 값 또는 객체의 주소를 값으로 가진다. 위의 예제에서는 Data 타입의 변수 today를 선언하고 이를 Date 객체로 초기화 해주었다.

 

new 키워드를 통해서 나온 결과물은 객체의 주소이다. 위에서는 Date 객체의 주소가 그 결과물이다.

 

1. 기본형 (primitive type)

 

- 논리형: boolean

true와 false 중에 하나를 값으로 가지며 조건식과 논리적 계산에 사용된다.

 

- 문자형: char

문자를 저장하는데 사용되며 변수 당 하나의 문자만 저장할 수 있다.

 

- 정수형: byte, short, int, long

정수 값을 저장하는데 사용된다. 주로 사용되는 것은 int와 long이다.

byte는 이진 데이터를 다루는데 주로 사용되며, short는 C언어와 호환을 위해서 추가되었다.

 

- 실수형: float, double

실수를 저장하는데 사용되며 주로 double이 사용된다.

문자형 char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 유사하며 정수형, 실수형과 연산이 가능하다. 반면에 boolean은 다른 기본형과 연산이 불가능하다. 즉 boolean은 제외한 나머지 7개 기본형은 서로 연산과 변환이 가능하다.

 

각 타입에 따라 메모리를 할당받는 크기가 다른데 해당 타입의 변수가 저장되는데 필요한 byte의 수는 다음과 같다.

 

  1byte 2byte 4byte 8byte
논리형 boolean      
문자형   char    
정수형 byte short int long
실수형     float double

 

각 타입의 변수가 저장할 수 있는 값의 범위는 다음과 같다.

 

자료형 저장 가능한 값의 범위 bit byte
boolean false, true 8 1
char '\u0000' ~ '\uffff' (0 ~ 65535) 16 2
byte -128 ~ 127 8 1
short -32768 ~ 32767 16 2
int -2147483648 ~ 2147483647 32 4
long -9223372036854775808 ~ 9223372036854775807 64 8
float 1.4E-45 ~ 3.4E38 32 4
double 4.9E-324 ~ 1.8E308 64 8

 

정수형의 경우 1byte는 8bit이기 때문에 표현할 수 있는 값의 범위도 -2^(8*N) ~ 2^(8*N) - 1 이 된다. (양에서 -1이 되는 이유는 0 떄문이다.)

 

실수형의 경우 정수형과 저장방식이 다르기 때문에 같은 크기라도 훨씬 큰 값을 표현할 수 있으나 오차가 발생한다는 단점이 있다. 이때문에 실수형에는 정밀도가 존재한다.

 

 

2. 상수와 리터럴 (constant & literal)

 

- 상수, constant

 

상수, constant는 변수와 마찬가지로 값을 저장할 수 있는 공간이지만 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다.

상수를 선언하는 방법은 변수와 동일하며 변수 타입 앞에 final 키워드를 붙여주기만 하면된다.

 

final int MAX_SPEED = 10;
// 상수 MAX_SPEED 선언 및 초기화

 

상수는 선언과 동시에 바로 초기화해야하며 이후부터 상수의 값을 변경하는 것은 허용되지 않는다. 만약 상수의 값을 변경하는 경우 에러가 발생한다.

 

- 리터럴, literal

 

리터럴은 우리가 사용하는 값 그 자체를 의미한다. 원래 12, 14, 'A' 와 같은 값들이 상수인데 앞서 말한 상수, constant와 구분을 위해 리터럴이라는 용어를 사용한다.

 

  • variable: 하나의 값을 저장하기 위한 공간
  • constant: 값을 한번만 저장할 수 있는 공간, 자바에서 final로 선언된 공간
  • liteeral: 그 자체로 값을 의미하는 것

 

- 상수가 필요한 이유

 

그렇다면 상수가 필요한 이유는 무엇일까?

그 이유는 프로그래밍에서 반복적으로 사용되는 리터럴들을 대체하기 위함이다.

계속해서 동일한 리터럴이 같은 용도로 사용되는 경우 이를 하나의 변수로 두어 관리/사용할 수 있다. 하지만 일반 변수로 사용하는 경우 값이 변경될 수 있기 때문에 상수로 두어 값이 변경되지 않도록 하여 사용한다.

 

- 리터럴 타입과 접미사

 

변수의 타입이 있는 것처럼 리터럴에도 타입이 있다. 변수의 타입은 저장될 값 (리터럴)의 타입에 의해 결정되므로 변수의 타입과 리터럴의 타입을 일치해야한다.

 

리터럴에서는 타입을 표현하는 방법으로 접미사를 사용한다.

 

  • 논리형 - 없음
  • 정수형 - L (long)
  • 실수형 - f (float), d (double)
  • 문자형 - 없음
  • 문자열 - 없음

 

정수형의 경우 10진수 외에도 2, 8, 16진수로 표현된 리터럴을 변수에 저장할 수 있다. 이때 16진수의 경우 '0x' 또는 '0X'를, 8진수의 경우에는 '0'을 접두사로 사용하여 표현한다.

또한 jdk1.7 부터는 '_'를 리터럴 사이에 구분자로 넣을 수 있게 되었다.

리터럴에 소수점이나 10의 제곱을 나타내는 기호 E, e 그리고 접미사 f, F, d, D 등이 포함되어 있으면 실수형 리터럴로 간주된다.

 

- 타입의 불일치

 

리터럴의 타입은 저장될 변수 타입과 일치하도록 하는 것이 보통이지만 변수의 타입이 리터럴의 타입보다 큰 경우에는 일치하지 않아도 된다.

이외에 타입이 일치하지 않는 경우에는 컴파일 에러가 발생한다.

 

- 문자 리터럴과 문자열 리터럴

 

하나의 문자로 이루어진 리터럴을 문자 리터럴, 두개 이상의 문자로 이루어진 리터럴을 문자열 리터럴이라고 한다. 문자 리터럴을 하나의 따옴표로 감싸져 있으며, 문자열 리터럴의 경우는 쌍따옴표로 묶여져있다.

 

문자 리터럴을 char 타입, 문자열 리터럴의 경우는 String 타입을 사용해야 한다.

 

char ch = 'A';
String name1 = "Java";
String name2 = new String("Java");

 

문자열 리터럴은 기본형이 아닌 참조형 타임으로 null 값을 허용하며 또한 ""와 같이 비어있는 값도 허용한다.이를 빈 문자열이라고 한다. 반면 문자 리터럴은 무조건 하나의 문자가 존재해야 한다.

 

String은 '+' 연산자를 통해서 문자열 들을 결합할 수 있다. 만약 문자열과 문자열이 아닌 다른 변수와 결합을 진행하는 경우에 다른 변수 타입을 문자열로 변환하여서 하나의 문자열로 연산한다.

 

또한 예시에서 name2와 같이 new 키워드를 사용하여서 초기화 할 수 있다.

 

 

3. printf()

 

화면에 값을 출력하는 방법중에 하나로 printf() 가 있다. printf 는 변수의 값을 그대로 출력하지 않고 다른 형식으로 출력할 수 있다.

 

printf는 지시자 (specifier)를 통해서 변수의 값을 여러 형식으로 변환하여 출력하는 기능을 가지고 있다. 지시자는 값을 어떻게 출력할 것인지를 지정해주는 역할을 한다. 예를 들어 정수형 변수를 10진수 정수로 출력할 때는 지시자 '%d'를 사용할 수 있다. 다음의 예제를 확인해보자.

 

int age = 14;
System.out.printf("age: %d", age);
// age: 14

System.out.printf("age: %d", 14);
// age: 14

 

위의 예제와 같이 지시자는 뒤이어 나오는 변수를 해당 자리에 위치시켜 지시자로 지시한 형식에 맞춰 출력하도록 한다. 만약 여러개의 값을 출력하고자 한다면 지시자를 또한 여러개를 사용해야 하며 이때 문장 뒤에 나오는 값들의 순서를 일치하도록 하여 값을 나열하여야 한다.

 

자바의 지시자는 다음과 같은 종류가 있다.

  • %b: boolean
  • %d: decimal integer
  • %o: octal integer
  • %x, %X: hexadecimal integer
  • %f: decimal float
  • %e, %E: exponent
  • %c: character
  • %s: string

 

정수형을 출력할 때는 보통 %d를 사용하는데 이때 숫자와 '-'을 사용하여서 출력 형식을 정할 수 있다.

 

int val = 10;
System.out.printf("[%5d]", val);
// [   10]

System.out.printf("[%-5d]", val);
// [10   ]

System.out.printf("[%05d]", val);
// [00010]

 

5는 출력 형식이 차지할 자리의 수를 '-'는 값의 위치를 의미한다. 그리고 0이 존재하는 경우 자릿수의 나머지 부분을 0으로 채운다. 이 기능을 통해서 여러 줄을 출력시에 간격을 맞춰 출력할 수 있다.

 

%x와 %o에 #을 사용하면 접두사 '0x'와 '0'이 각각 붙는다. 

 

long hex = 0xFFFF_FFFF_FFFF_FFFFL;
System.out.printf("%x", hex);
// ffffffffffffffff

System.out.printf("%#x", hex);
// 0xffffffffffffffff

System.out.printf("%#X", hex);
// 0XFFFFFFFFFFFFFFFF

 

정수를 2진 문자열로 출력하기 위해서는 Integer의 toBinaryString(int i)를 사용하면 된다. 이 함수를 사용하면 i의 값을 이진법 문자열로 반환한다.

 

실수형의 값 출력에는 %f, %g, %e 중 %f를 주로 사용하고, %e는 지수형태, %g는 값을 간략하게 표현할 때 사용한다. %f는 소수점 이하 6자리까지만 출력하기 때문에 소수점 이하 7자리에서 반올림한다. 또한 %f는 숫자와 dot을 사용하여서 전체 자리수 형식을 정할 수있다.

 

%{전체자리}.{소수점이하자리}f

 

 

4. Scanner

 

화면에 출력하는 것이 아니라 화면에 입력받는 방법으로는 Scanner가 있다. Scanner 클래스를 이용하여 Scanner 객체를 생성하고 이를 통해 입력을 받는다.

 

import java.util.*; // Scanner 클래스를 사용하기 위해 추가한다.

Scanner scanner = new Scanner(System.in); // Scanner 객체 생성

String input = scanner.nextLine(); // 입력받은 내용을 input에 저장. 값을 입력하고 enter 키를 누르면 값이 입력된다.
int num = Integer.parseInt(input); // 입력받은 내용을 int 형식으로 변환

 

반응형