728x90

이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.

그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.

그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.


저번 시간에 자료형을 배웠다. 이제 그 자료형을 어떻게 사용하는지를 알기위해서는 여러분들은 여러 연산자를 알필요가 있다.

자바에서의 연산자는 현실의 연산자와 비슷한 맥락이라 생각하면된다.

이번시간에는 그 자료형들을 윤택하게 사용하기 위해서 연산자에 대해서 알아보록 하자.


여러분에게는 아래의 순서로 연산자를 사용하도록 하겠다.


부호연산자

산술연산자

비교연산자(관계연산자)

논리연산자

증감연산자

비트연산자

대입연산자

캐스트연산자

삼항연산자


부호 연산자 : +, -


부호 연산자는 특정 숫자의 부호를 +와 -로 변경해주는것이다.

아래는 그 사용 예시이다.


public class Main {
public static void main(String []args) {
int a = 10;
int b = -a;
System.out.println(a);
System.out.println(b);
}
}


산술 연산자 : -, +, *, /, %


산술 연산자는 수학에서의 사칙연산과 비슷하다.

같지는 않다는게 놀라울 것인데 이는 /부분이 작은 부분에서 틀린점이 있기 때문이다.

아래는 그 예시이다.


public class Main {
public static void main(String[] args) {
int a = 10;
int b = 3;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println(a / b);
System.out.println(a % b);
}
}


처음보는 연산자가 있을 것인데, 바로 %연산자 이다.

이 연산자는 흔히 수학에서 말하는 mod연산으로 나머지를 구해주는 연산이다.

10을 3으로 나누면 나머지가 1이되므로 %연산의 결과는 1이 나올것이다.


위의 예제를 실행해보면 모두 예상한 결과가 나오는데 하나가 다른 결과를 나오게 할 것이다.

바로 /인데 3.33333이 아닌 3이 나올것이다. 그 이유는 무엇일까?

똑똑한 여러분이라면 맞출수 있을것이다.


왜냐하면 정수와 정수의 계산은 반드시 정수로 나오기 때문이다.

우리는 정수와 정수를 계산한 것이므로 결과 역시 정수로 나오게된다.


public class Main {
public static void main(String[] args) {
int a = 10;
float b = 3;
System.out.println(a / b);
}
}


우리가 원하는 결과를 도출하기 위해서는 하나가 정수가 아니여야한다.

int와 int같이 정수,정수 연산은 정수로 나타나지만 실수,정수 연산은 실수로 난타내게 되므로 우리가 원하는 결과를 얻을 수 있다.

그러나 언제까지 이런방법을 사용할순 없다.

만약 정수,정수 결과를 실수로 내고 싶다면 배운범위 밖에서의 해결이지만 다른 방법이 존재한다.


public class Main {
public static void main(String[] args) {
int a = 10;
int b = 3;
System.out.println(a / (float) b);
}
}


바로 타입캐스팅이라는 것을 쓰는것이다. 정수,실수 계산이 실수라는 점에서 착안, 하나의 정수를 강제로 실수로 변경시켜 주는 것이다.

아직 범위 밖이지만 유용한 테크닉이므로 반드시 알아두자. 그리고 얼마 안 있어서 알게될것이다.


비교 연산자(관계 연산자) : ==, !=, <=, >=, <, >


비교 연산자는 두 상황을 비교하는 연산자이다. 아래의 예제를 보도록 하자.


public class Main {
public static void main(String[] args) {
int a = 10;
float b = 3;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a <= b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a > b);
}
}


여러분이 위의 예제를 확인해서 보면 알 수 있을 것이다.

비교연산자의 관계는 반드시 boolean값을 나오게된다. 즉 true와 false로 값을 나오게 된다는 것이다.


==는 양변이 같은지를 확인하고 같으면 true를 틀리면 false를 반환하게 된다.

흔히 동등 비교는 =로 알고있는 경우가 많은데 컴퓨터에서 =는 동등비교라는 의미를 가지지 않는다.

컴퓨터에서 a=b라는 의미는 b에 a를 대입하라는 의미이다.

따라서 비교는 ==로 한다.


그럼 a와 b가 다른지는 어떻게 아느냐? 바로 a!=b라는 꼴로 연산자를 사용하면된다.

이 연산자는 a와 b가 달라야 true가 나오게된다.


그외의 부등호 연산자들은 여려분이 생각하는 부등호 연산과 동일하다고 생각하면된다.


논리연산자 : &&, ||, !


논리 연산자는 여러분이 생각하는 and와 or, not과 같다. 각각 &&,||,!과 대응된다.

이 논리연산자의 결과역시 boolean값으로 출력된다.


public class Main {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = false;
System.out.println(b1 && b2);
System.out.println(b1 || b2);
System.out.println(!b1);
}
}


and와 or, not이 뭔지는 여러분들이 전부 알고 있을것이기 때문에 따로 설명을 하지 않겠다.

인터넷을 뒤져보면 나오므로 필자한테 묻지마라.


증감연산자 : ++(data), --(data), (data)++, (data)--


증감연산자는 조금 특이한 연산자이고 지원하지 않는 언어도 꽤 된다.

이게 있으면 되게 편하다. 그래서 존재하는거 같다.

++연산자는 현재 숫자에서 1을 더해주고 --연산자는 1을 깎는다.


그러나 ++를 변수 앞에 쓸 수도 있고 변수 뒤에 쓸 수 도 있다.

둘의 차이점은 ++의 결과가, 즉 1이 더한 결과가 바로 반영하느냐 아니면 다음 호출할떄 반영하냐의 차이이다.

이해를 못하겠으면 예제를 보자.


public class Main {
public static void main(String[] args) {
int a = 10;
int b = 10;
System.out.println(a++);
System.out.println(++b);
System.out.println(a);
System.out.println(b);
}
}


해당 결과를 확인해보면 알 수있다. a는 후위 연산으로 ++을 썼다.

따라서 a를 먼저 출력하고 +1을 했다.

반면 b는 전위 연산으로 ++을 했다. 따라서 먼저 다하고 출력을 한 것이다.


비트연산자 : &, |, ^, ~, <<, >>


이 부분은 당장은 안쓰므로 사실 모르고 넘어가도 상관없다.

그래도 혹시라도 여러분들이 사용하게 될지도 모르므로 일다 설명을 하고 넘어가긴 하겠다.

게다 경우에 따라서 ^는 꼼수로서 사용할 수도 있는데 왜냐하면 xor연산이 비트단위에서만 지원해주기 때문이다.

뭔말인지 모르겠거나 비트연산에 관심이 아예없다면 넘어가도 무방하다.

필요할때 찾아서 사용하면된다.


public class Main {
public static void main(String[] args) {
int a = 0b0101_0100;
int b = 0b1010_1101;
System.out.println(a);
System.out.println(b);
}
}


일단 비트연산을 하기 앞서서 각각의 값이 뭔지 확인해보자. a는 84이고 b는 173이다.

이를 비트로 나타내면 각각 위의 값과 같다는 것이다.

숫자는 참고로 _로 끊을 수 있다. 이는 무시해도 상관없다.

그냥 길어질때 보기 힘들기 때문에 _(언더스코어)로 끊는 것이다.


그러면 각각의 비트 연산자를적용 시켜 보아라.


public class Main {
public static void main(String[] args) {
int a = 0b0101_0100;
int b = 0b1010_1101;
System.out.println(Integer.toBinaryString(a & b));
System.out.println(Integer.toBinaryString(b | b));
System.out.println(Integer.toBinaryString(a ^ b));
System.out.println(Integer.toBinaryString(a >> 2));
System.out.println(Integer.toBinaryString(a << 2));
}
}

각각의 연산결과를 비트로 보기위해서 Integer.toBinaryString함수를 사용하였다.

한가지 연산을 안했는데 ~연산은 보수연산이다. 즉 not연산이다.


대입 연산자 : =, +=, -=, /=, *=, %=


대입연산자는 사실 위의 연산자들보다 조금 더 있다. 필자가 알기로는 대부부는 이항연산자들은 다 가지고 있는 것으로 알 고 있다.

자주쓰는건 위에 적어둔것 정도가 되겠다.

=는 다 알다시피 a=b라는 구문은 a에 b를 대입해라는 뜻이다.

그러면 나머지는 무엇을 의미할까?


public class Main {
public static void main(String[] args) {
int a = 10;
a += 3;
System.out.println(a);
a -= 4;
System.out.println(a);
a *= 5;
System.out.println(a);
a /= 2;
System.out.println(a);
a %= 7;
System.out.println(a);
}
}


바로 연산자와 =의 조합은 자기자신에 뒤에 숫자만큼의 연산을 해라는 뜻이다.

예를들어 a+=5라는 구문은 a=a+5와 기능상으로 완전하게 동일하다는 뜻이다.

또한 ++a이라는 구문은 a+=1, a=a+1과 기능상으로 완전하게 동일하다.


다른연산자 역시 마찬가지이다.


캐스트 연산자 : (char), (int), (byte), (bool) ...


위의 연산자는 전시간에서 사용했었다.

언제인지 기억하는가? 바로 정수를 실수로 바꿔주기위해서 사용을 했었다.

캐스트 연산자는 사용할 경우 해당 변수의 값을 바꾸지는 안되 해당 변수의 현태를 강제로 변환하여 준다.

사실 캐스팅에대해서 말하자면 정말 길다. 따라서 이번에는 이것 까지만 말을 하겠다.

타입캐스팅에 대한 자세한 설명은 훗날 하도록 하자.


삼항연산자 : ( a? b: c)


삼항연산자는 조금 신기한 연산자이다.

자바에서 존재하는 연산자중에서 유일하게 3항이 존재하는 연산자이다.


public class Main {
public static void main(String[] args) {
int a = 10;
int b = 10;
int c = 8;
System.out.println(a == b ? "good" : "bad");
System.out.println(a == c ? "good" : "bad");
}
}


삼항연산자는 (a?b:c)꼴로 사용하여 a라는 조건이 참이면 b를 거짓이면 c를 도출해 낸다.

즉 연산자 단위로 제공하는 조건문이라는 것이다.


연산자 우선순위


연산자를 사용할 때는 연산자 별로 우선순위가 존재하게 된다.

이것을 잘 알고 써야한다.

왜냐하면 아래와같은 구문이 있을 수 있기 때문이다.


public class Main {
public static void main(String[] args) {
int a = 6;
System.out.println(5 + 3 - 7 % 3 + a++);
}
}


해당 구문 같이 복잡하게 되어있는 경우 우선순위에 따라 적용된다.

다행히도 컴퓨터의 우선순위는 사람이 인식하는 우선순위와 비슷하게 동작하므로 큰 문제가 없을 확률도 있다.

그러나 애매한부분도 분명이 존재하고 필자도 모르는게 좀있다.

확실히 모르면 우선순위를 강제해주는()를 사용해서(수학이랑 똑같다.) 우선순위를 강제해 줄 수 있다.

이번에는 일반적인 우선순위를 보도록하자.


이항 연산자간의 우선순위 리스트


1 - *,/,%

2 - +,-

3 - 관계연산자(부등호)

4 - 관계연산자(부등호 없는 식)

5 - &&

6 - ||

7 - 할당 연산자


※리스트에 존재하는 우선순위가 없을 경우 일반적으로 왼쪽에서 오른쪽으로 우선순위가 정해진다.

일반적인 이항연산자들은 3번보다 우선순위가 높다.


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

[Java-06]switch(스위치)  (0) 2017.09.29
[Java-05]조건문  (0) 2017.09.29
[Java-03]자료형  (0) 2017.09.29
[Java-02]변수  (0) 2017.09.29
[Java-01]자바에서 콘솔에 출력  (0) 2017.09.29

+ Recent posts