본문 바로가기

JAVA/자바 기본 프로그래밍

03. 자바의 데이터 타입

데이터 타입이란 자바에서 다룰 수 있는 데이터의 종류를 말한다. 자바 언어는 다음과 같이 총 9개 타입의 데이터를 다룰 수 있다.

- 기본타입 8개 : byte, short, int, long, float, double, char, boolean,

- 레퍼런스타입 1개 : 세가지 경우로 이용한다

1) 배열에 대한 레퍼런스

2) 클래스에 대한 레퍼런스

3) 인터페이스에 대한 레퍼런스

레퍼런스란 C/C++의 포인터와 비슷한 개념이다. 그러나 C/C++처럼 실제 주소 값을 가지는 것은 아니다. 배열에 대한 레퍼런스는 배열에 대한 주소 값, 클래스에 대한 레퍼런스는 객체에 대한 주소 값 정도로 생각하면 된다.

 

자바의 기본 타입

자바의 기본 타입과 메모리 공간, 데이터 값의 범위를 보자. 정수를 저장하는 타입은 byte, short, int, long 이고, 실수는 float, double 타입을 사용한다. 타입마다 크기가 다르기 때문에 다루는 값의 범위에 따라 적절한 타입을 선택해야 한다. 문자는 char 타입으로 저장하며, 크기는 2byte이다. char가 1byte인 C/C++과 다르게 자바의 char가 2byte인 이유는 자바에서는 문자를 유니코드 체계를 사용하기 때문이다. 한글, 영문을 가리지 않고 문자 하나당 2byte 코드가 사용되므로 영어와 한글이 섞인 경우 문자를 다루기가 C/C++보다는 편리하다.

boolean > 1bit , true or false

char > 2byte, Unicode

byte > 1byte(8bit), -128~127

short > 2byte , -32768 ~ 32767

int > 4byte , -2^31 ~ 2^31-1 : 정수 타입의 기본형

long > 8byte , -2^63 ~ 2^63-1

float > 4byte , -3.4E38 ~ 3.4E38

double > 8byte , -1.7E308 ~ 1.7E308

 

유니코드란 > 전 세계의 모든 문자를 표현하기 위해, 문자당 2byte의 산업 표준 코드 체계로 유니코드 협회가 제정한다. 유니코드에는 ISO10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자를 처리하기 위한 알고리즘 등이 포함되어 있다.

 

문자열

자바에서 문자열은 기본 타입에 속하지 않으며, JDK에서 제공하는 String 클래스를 이용한다. 

String toolName = "JDK";

그리고 자바에서는 문자열과 기본타입의 + 연산으로 문자열을 연결한 새로운 문자열을 생성한다.

toolName + 1.3  // "JDK 1.3"

"("+3+","+5+")" // "(3,5)"

System.out.println(toolName+"이 출시됨"); // "JDK 1.3이 출시됨" 출력

 

변수와 선언

변수는 데이터를 저장하는 공간이다. 따라서 변수를 선언하면 변수의 타입 크기에 맞는 메모리 공간이 할당된다. 동일한 타입의 변수를 여러 개 선언할 때 콤마로 분리하여 나열하고, 선언시에 초깃값을 지정할 수 있다.

int radius;

double weight = 75.56;

char c1,c2,c3 = 'a'; // 3개의 변수를 한번에 선언하고, c3만 'a'로 초기화

변수의 값은 프로그램 중 변경될 수 있고, null은 할당할 수 없다.

 

리터럴

리터럴(literal)이란 프로그램에 직접 표현한 값을 말한다. 정수, 실수, 문자, 논리, 문자열 타입 모두 리터럴이 있다.

예) 32, 42.195, '%', true, "hello"

 

정수 리터럴

정수 리터럴은 4가지 유형이 있으며 변수와 함께 사용하면 다음과 같다.

int n = 15 ; // 십진수 15

int m = 015; // 015는 8진수로서 십진수 13

int k = 0x15; // 0x15는 16진수로서 십진수 21

int l = 0b0101; // 0b0101은 2진수로서 십진수 5;

자바에서 정수 리터럴은 int타입으로 컴파일한다. 정수 리터럴을 long타입으로 지정하고자 하면 숫자뒤에 L또는 l을 붙이면 된다. long g = 24L; 

 

실수 리터럴

실수 리터럴은 소수점 형태나 지수(e)형태로 실수를 표현한 값이다.

12, 12.0, 12.141592, 1234E-4

실수 리터럴은 double 타입으로 자동 처리되며, 변수와 함께 사용하면 다음과 같다.

double d = 0.1234

double e = 1234E-4 // 1234E-4 = 1234* 10^-4

숫자뒤에 F또는 f를 붙이면 float 타입으로, d또는 D를 붙이면 double 타입으로 강제 변환할 수 있다.

float f = 0.1234f;

double w = .1234D;

 

문자 리터럴 

문자 리터럴은 단일 인용부호(' ')로 문자를 표현하거나 \u 다음에 문자의 유니코드 값을 사용하여 표현한다.

'a', 'W', '가', ' * ', ' 3 '

문자 리터럴을 변수와 함께 쓰면 다음과 같다

char a = 'W';

char b = '가';

char c = \uae00; // 유니코드 값 사용하기 ( 참고 사이트 : https://www.learnkoreantools.com/kr/korean-to-unicode )

특수문자 리터럴도 있다. 백슬래시 다음 특수기호를 붙여서 표현한다.

' \b ' : 백스페이스

' \t ' : 탭(tab)

' \n ' : 라인피드(line feed)

' \f ' : 폼피드

' \r ' : 캐리지 리턴

' \" ' : 이중 인용부호

' \' ' : 단일 인용 부호

' \\ ' : 백슬래시

 

논리 타입 리터럴과 boolean 타입

논리 타입 리터럴은 true, false 두 개 밖에 없고, boolean 타입의 변수에 직접 치환하거나 조건 문에 사용한다.

boolean a = true;

boolean b = 10 > 0;

boolean c = 1; // 타입 불일치 오류. 자바에서는 1, 0을 참, 거짓으로 사용할 수 없다.

while(true) {...} //무한루프

 

기본 타입 이외의 리터럴은 null리터럴과 문자열 리터럴이 있는데, 문자열 리터럴은 "Hello" 처럼 이중 인용부호로 묶어 표현하고, null은 기본 타입에 사용될 수 없고 객체 레퍼런스에 대입된다.

 

var 키워드로 타입을 생략하고 변수 선언

var 키워드를 사용하여 변수의 타입을 생략하고 간단히 변수를 선언할 수 있다. 컴파일러는 var 키워드로 선언된 문장을 추론하여 변수의 타입을 자동으로 결정한다.

var price = 200;

var name = "eun";

var pi = 3.141592;

var point = new Point(); // point는 Point 타입으로 결정

var v = new Vector<Integer>(); 

변수 선언문에 초깃값이 주어지지 않으면 오류가 발생하고, var 키워드는 지역 변수에만 한정된다.

 

상수

리터럴을 상수로 선언하면 변수처럼 표현 가능하다. 상수는 final 키워드를 사용하여 선언한다. 상수는 선언 시 값이 초기화 되면 더 이상 변경할 수 없고, static 키워드를 붙여서 선언하면 된다.

static final double PI = 3.141592;

 

타입 변환

타입 변환이란 변수나 상수 혹은 리터럴을 다른 타입으로 변환하는 것을 말한다.

-자동 타입 변환

다음과 같이 치환문이나 수식 내에서 타입이 일치하지 않으면, 컴파일러는 작은 타입을 큰 타입으로 자동 변환한다.

long m = 25; // 리터럴 25는 int 타입으로서 long 타입으로 자동 변환

double d = 3.14 * 10 ; // 실수 연산을 하기 위해 10이 10.0으로 자동 변환

-강제 타입 변환

int n = 300;

byte b = n; // 컴파일 오류 : int 타입은 byte 타입으로 자동 변환 안됨

n을 byte타입으로 자동 변환하게 되면 변수 b에 300이 저장되지 않고 300%256 =44가 저장되면서 손실이 발생한다. 그러므로 컴파일러는 큰 타입을 작은 타입으로 변환해야 할 때 자동 변환 대신 컴파일 오류를 발생시킨다. 손실이 발생한다는 사실을 알고도 변환하기를 원하면, ( )안에 타입을 강제로 지정해야 한다.

byte b = (byte) n;

double d = 1.9;

int n = (int) d ; // 강제 타입 변환으로 n = 1이 된다.

강재 타입 변환을 캐스팅이라고도 한다.

 

 

'JAVA > 자바 기본 프로그래밍' 카테고리의 다른 글

06. 조건문  (0) 2024.04.11
05. 연산자  (0) 2024.04.08
04. 자바의 키 입력  (0) 2024.04.08
02. 식별자  (0) 2024.04.07
01. 자바 프로그램의 구조  (1) 2024.04.07