5. Java 강좌, 연산자 2
비트전환 연산자
비트전환 연산자 "~"가 하는 일은 값을 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번에 해당하는 내용만 알아보고 넘어가겠습니다.
{
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 |
4. Java 강좌 연산자 1 (2) | 2015.02.02 |
3. Java 강좌, 변수(Variable) 2 (0) | 2015.01.29 |
2. Java 강좌, 변수(Variable) 1 (6) | 2015.01.26 |