본문 바로가기

Java

[Java 강좌] 2장. 변수(2)


boolean (논리형)



boolean switch = true;


boolean 이라는 변수는 간단하다.

yes or no , on/off 같은 경우에 사용가능한 변수인데 true 와 false 중 하나를 저장할 수 있으며 기본값(default)는 false 이다.

두 가지 값만 표현하면 되기 때문에 기본형 중에서 가장 크기가 작은 1 byte이다. (1 bit 만으로도 충분하지만 최소단위가  1byte이기 때문에 1byte를 사용)




char (문자형)


char 형의 크기는 2 byte 이므로 16진수로 0000부터 ffff까지, 즉 65536개(2^16)의 코드를 사용할 수 있다. 


밑에 예제를 한번 살펴보도록 하자.


/ch2/CharToCode.java


package ch2;

public class CharToCode {

	
	public static void main(String[] args) {
		int code = 66;
		float flt = (float)code;
		char ch0 = 'B';
		char ch1 = '\u0042';
		char ch_int = (char)code;
		char ch_float = (char)flt;
		
		System.out.println(code);
		System.out.println(flt);
		System.out.println(ch0);
		System.out.println(ch1);
		System.out.println(ch_int);
		System.out.println(ch_float);
	}

}


결과

66

66.0

B

B

B

B



예제를 보면 알수 있듯이, 'B'의 유니코드값은 0042 이다. 그리고 십진수로 표현하면 66이 된다. 

실제로 변수 ch0 안에는 문자 'B'의 유니코드인 66이 저장된다. 그리고 우리가 보여질때는 'B'로 보여지게 된다. 

println()은 변수 값을 출력할때, 정수형이면 정수값을 그대로 출력하고, 실수형이면 실수형으로, 그리고 char형이면 정수값에 해당하는 문자를 찾아서 출력한다.

또, ch_int 와 ch_float 를 보면 알수있듯이 어떤 타입을 다른 타입으로 변환하는 것을 형변환(캐스팅,casting)이라고 한다.(추후 더 설명하겠다.)


특수문자를 알아보자.



 특수문자

설명

리터럴

 tab 

 탭 (기본 일정거리만큼 띄어짐)

 \t 

 backspace 

 백 스페이스 기능

 \b 

 form feed 

 프린트 출력시 현재 페이지마침

 \f 

 new line  

 새로운 줄로 바꿈

 \n 

 carriage return 

 행의 처음으로 커서 이동

 \r 

 역슬래쉬(\)

 

 \\

 작은따옴표

 

 \'

 큰따옴표

 

 \"

 유니코드(16진수) 문자

 

 \u유니코드 (예: char a='\u0046')


특수문자를 사용하는 간단한 예제를 살펴보자.


/ch2/SpecialChar.java


package ch2;

public class SpecialChar {

	public static void main(String[] args) {
		char chr ='\''; ⁄⁄ 이런식으로 해줘야 ' 입력가능
		String BigMark ="\"HelloWorld!\""; ⁄⁄ 이런식으로 " 입력가능
		String root = "c:\\";
		
		System.out.println(chr);
		System.out.println(BigMark);
		System.out.println(root);
	}

}


결과

'

"HelloWorld!"

c:\


이와 같이, \ 이를 이용하여 특수문자를 출력하는 방법에 대해 알아보았다



char형 변수는 단 하나의 문자 밖에 저장할 수 없다. 그래서 여러 문자를 저장하기 위해서는 String 변수를 사용한다.


밑에 예제를 통하여 차이점을 알아보자.


/ch2/Char.java



package ch2;

public class Char {

	public static void main(String[] args) {
		char ch = 'J'; // 오직 한 글자만 가능
		String str="Java"; // 여러글자 가능
		String sum_str= str + "Hello";
		
		System.out.println(ch);
		System.out.println(str);
		System.out.println(sum_str);
	}
}


결과


J

Java

JavaHello


ch 와 같은 'J' 한 글자로 이루어졌을때는 char 형 변수를 사용하면 된다.

하지만 Java 와 같은 여러 글자를 저장하고 싶을 때는 String 형 변수를 사용한다. 고로 우리들은 앞으로 char보다는 String 형 변수를 이용하여 문자를 저장할 것이다. (왜냐, 더 편하니까~)

만약, 'Java' 와 같이 작은따옴표를 이용하여 여러 문자를 묶여주어서 String 형에 저장하려 한다면 오류가 뜰 것이다.

무조건 String 형 변수에는  큰따옴표("")를 이용하여 저장를 해야한다는 것을 명심하자.


String str="Java"; // 여러글자 가능

String str1='Java'; // x 오류




byte, short, int, long (정수형)


이 정수형은 기본적인 지식으로 처음 언어를 배운사람이 아니라면 누구나 알고 있을 것이다.

그래서 간단히 요점만 집고 넘어가려고 한다.


byte b = 1;

short s = 2;

int integer = 10;

long big = 10000000L; // long 타임은 리터럴에는 접미사 L을 붙여야 한다.


long 타입에는 무조건 뒤에 L 자 혹은 l(소문자 L)자를 붙여야 한다. 그렇지 않으면 int 형으로 간주된다. 'l' 자는 1과 혼동될 수 있으니 L 자를 사용하도록 하자.


'리터럴' vs '상수'

사실 리터럴과 상수는 의미적으로 같다 하지만 프로그래밍에서 상수는 '값을 한번 저장하면 변경할 수 없는 저장공간' 으로 정의되어있어서 'A',"ABC",123 와 같은 리터럴과 구분해서 사용한다.



오버플로우란?


지정된 범위를 넘어서면, 마치 자동차의 주행표시기와 같이, 최소값부터 다시 반복되는 것을 말한다.


예를 들자면, 변수(1) 에서 설명했듯이, 자료형 byte 의 저장 가능한 값의 범위는 -128~127 이다. 만약 그 값을 넘어서면 쳇바퀴처럼 다시 -128부터 다시 시작된다.




/ch2/Overflow.java

package ch2; public class Overflow { public static void main(String[] args) { byte bt = 0; int i =0; ⁄⁄ 반복문을 이용하여 bt와 i 를 각각 1씩 증가 for(int x=0;x<=300;x++) { bt++; i++; System.out.println(bt + " ⁄ " + i); } } }



결과

126 / 126

127 / 127

-128 / 128

-127 / 129

...

44 / 300

45 / 301



/ 왼쪽의 결과가 byte 의 결과이고 / 오른쪽의 결과가 int 의 결과이다.

이렇게 127이 넣어가게 되면 -128부터 다시 더해지는 것을 볼 수 있다.

이와 같은 현상을 '오버플로우' 라고 하는데... 프로그래밍할 때 가장 조심해야할 부분이다. 그러니 항상 자료형의 저장범위를 잘 생각해두고 값을 정의해야 한다. 



float, double (실수형)



실수형은 float 와 double 이렇게 두 가지가 있다. float 와 double 은 각각 int 와 long의 크기(4,8 byte) 와 같지만 저장 방식이 달라서 휠씬 더 큰 범위의 값을 표현 가능하다.


실수는 정수와 달리 부동소수점 방식으로 저장된다. (자세한 사항은 인터넷을 참조하자)

float 는 S(부호) : 1 , E(지수) : 8 , M(가수) : 32 를 합하여 총 32bit 로 4 byte 를 가지고 부동소수점으로 표현이 가능하다.

double 또한 S(부호) : 1 , E(지수) : 11 , M(가수) : 52 를 합하여 총 64bit 로 8 byte 를 가지고 부동소수점으로 표현이 가능하다.


float pi = 3.14f;    // f 대신 F를 사용해도 된다.

double velocity = 3.0e5d;    // d 대신 D를, e 대신 E를 사용해도 된다.

double rate = 1.618;    // 접미사 d를 생략가능하다.

float pi = 3.14;    // 에러가 난다. float 형 변수에 double 형 리터럴을 저장할 수 없음


정수형에서는 int가 기본형인 것 처럼 실수형에서는 double 이 기본 자료형이다. 그래서 위와 같은 에러가 날 수 있다는 것을 명심하고 사용에 유의하자.




형변환


형변환이란, 변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것이다.


어떻게 보면 간단할 수 있지만, 항상 주의하여 사용하여야 한다.

기본형와 참조형 모두 형변환이 가능하지만, 기본형과 참조형 사이에 형변환은 성립되지 않는다. 기본형-기본형, 참조형-참조형일 경우만 가능하다.



변 환

수 식

결 과

int → char

(char) 65

'A'

char  int

(int) 'A'

65

float  int

(int) 1.6f

1

int  float

(float) 10

10.0f


bloolean를 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.

각 자료형 마다 표현할 수 있는 값의 범위가 다르기 때문에, 만약 큰 범위를 가진 자료형에서 작은 범위를 가진 자료형으로 형변환을 하였을때 (예를 들면, float  int ) 값의 손실이 발생할 수 있다. 


원칙적으로 모든 형변환에는 (int) 와 같이 캐스트연산자를 이용한 형변환을 해야 하지만, 만약 값의 손실이 없는 경우에는 캐스트연산자를 생략하여도 무방하다. 그렇다고 형변환이 이루어지지 않는 것이 아니고, 캐스트 연산자를 생략하더라도 JVM의 내부에서 자동적으로 형변환이 이루어진다.

만약, 값의 표현범위가 큰 자료형에서 작은범위를 가진 자료형으로 형변환할 때, 캐스트 연산자를 사용하지 않으면 컴파일시 에러가 발생한다.


기본형의 자동형변환이 가능한 방향







이 글은 "Java의 정석(남궁 성)" 책을 리뷰하고 다시 정리하는 글임을 알려드립니다.

자세한 내용은 책을 참고바랍니다


'Java' 카테고리의 다른 글

[Java 강좌] 2장. 변수(1)  (0) 2013.06.20
[Java 강좌] 1장. About Java  (1) 2013.06.17
[Java] Class 와 ArrayList 사용예제  (0) 2013.06.13