5. Java 강좌, 연산자 2

2015.02.08 17:38
저자 : Tailer

비트전환 연산자


비트전환 연산자 "~"가 하는 일은 값을 2진수로 표현했을때 0을 1로, 1을 0으로 바꿔주는 것입니다.

비트전환 연산자는 정수형과 char형에서만 사용할 수 있으며 정수형 중 byte, short, char형은 int 형으로 변환 후 연산하게 됩니다.


설명만으로는 어려우니 비트전환 연산자를 사용해 보겠습니다.

 


class Noname1

{

public static void main(String[] args)

{

int a = 216;

System.out.print(a + "\t" + ~a);

}

 

위의 연산에서 물결 표시(~)가 비트전환 연산자인데요,

자세히 알아보자면 아래와 같습니다.



프로그래밍에서는 수를 2진수로 표현할 때 제일 앞 자리를 부호비트로 사용합니다.

0일 때는 양수를 표현하고, 1일 때는 음수를 표현하는데요,

2진수로 표현했을 때 부호비트를 바꾸는 것 만으로는 같은 수를 음수 혹은 양수로 변환 할 수 없습니다.


만약 124를 2진수로 표현할 경우 01111100 인데요,

여기에 비트전환 연산자를 사용하게 되면 10000011으로 바뀌게 됩니다.

보시면 정 반대의 숫자로 바뀐걸 알 수 있죠?


그런데 여기서는 124에 부호비트 연산자를 사용했는데 -124가 아닌 -125가 나온 것을 알 수 있습니다.

그 이유는 전에 말했듯이 정수형 타입은 부호가 존재할 때 양수보다 음수 값이 1 더 크기 때문이죠.


예를 들어서 byte 타입은 -128 ~ 127의 범위를 갖습니다.

결국 124에서 -124를 출력하고 싶다면 부호비트 연산자를 사용한 뒤 +1을 해주면 됩니다.

반대로 -124에서 124를 출력하고 싶을 때도 -124를 부호비트 연산자를 사용한 다음 +1을 해주시면 됩니다.


비트전환 연산자에서 byte, short, char형은 int형으로 변환 후 연산된다고 했는데요.

아래 내용을 살펴봅시다.

 

 


class Noname1

{

public static void main(String[] args)

{

byte a = 10;

//         byte b = ~a;   (btye로 형변환을 시켜주지않으면 에러가 발생합니다)

byte b = (byte)~a;

System.out.print(a + "\t" + b);

}

}

 

위의 코드중 주석을 지우고 코드를 실행하게 되면 컴파일 시 에러가 발생하게 됩니다.

그 이유는 byte 였던 a가 비트전환연산(~a)을 할때 int로 변환되기 때문에 int를 byte안에 넣을수 없어서 에러가 발생하게 됩니다.


논리부정 연산자

 

논리부정 연산자 "!"는 true는 false로 false는 true로 변경해주며, boolean형에서만 사용할 수 있습니다.

이 연산자는 조건문과 반복문의 조건식에 사용됩니다.

 

 

class Noname1

{

public static void main(String[] args)

{

boolean sw = false;

sw = !sw;

System.out.print("sw = " + sw );

}

}

 

false가 true로 바뀐것을 확인할 수 있습니다.

간단하죠?


산술 연산자


산술 연산자인 사칙 연산자(+, -, *, /)와 나머지 연산자(%), 쉬프트 연산자(<<, >>, >>>)는 모두 이항연산자 입니다.

이항 연산자의 특징은 피연산자의 변수 타입이 int보다 작은 경우 모두 int 형으로 변환 후 연산을 수행하며,

피연산자가 서로 다른 변수타입인 경우 두 변수 타입 중 더 큰 변수 타입으로 변환 후 연산을 수행합니다.


변수타입은 int < long < float < double 순입니다. (byte, short, char는 모두 int로 형변환 후 연산합니다.)


사칙연산자(+, -, *, /)


흔히 사용하는 사칙연산자는 사용 할 때 주의할 점이 몇 가지 있습니다.

위에서 말씀드린 점도 있지만 자세히 알아보자면 아래와 같습니다.

 

1. int 형보다 크기가 작은 자료형은 int 형으로 형 변환 후 연산한다.

byte + short = int


2. 피연산자가 서로 다른 변수 타입인 경우 더 큰 변수 타입으로 변환된다.

int + float = float


3. 정수형 간의 나눗셈에서 0으로 나누는 것은 금지되어 있다.

a = 10 / 0; 수행후 출력시 실행오류(ArithmeticException) 발생 (하지만 컴파일은 가능하다.)


1번에 해당하는 내용만 알아보고 넘어가겠습니다.


class Noname1

{

public static void main(String[] args)

{

byte a = 10;

byte b = 10;

byte c = a + b;

System.out.print(c);

}

 

a + b 는 위의 연산 규칙에 따라 int형으로 변환되었기 때문에 컴파일할 때 에러가 발생합니다.

 

이 연산을 하기위해서는 변수c의 변수타입을 int로 하거나,

byte c = (byte)(a+b) 이렇게 바꿔주시면 됩니다.

'Programming > Java' 카테고리의 다른 글

7. Java 강좌, 연산자 4  (0) 2015.02.12
6. Java 강좌, 연산자 3  (0) 2015.02.10
5. Java 강좌, 연산자 2  (2) 2015.02.08
4. Java 강좌 연산자 1  (2) 2015.02.02
3. Java 강좌, 변수(Variable) 2  (0) 2015.01.29
2. Java 강좌, 변수(Variable) 1  (6) 2015.01.26