본문 바로가기

개발자 이야기/JAVA

자바 연산자의 종류에 대해서 알아보자, 1편

주말이라는 핑계로 띵가띵가 놀다가 월요일이 되자마자 또 이렇게 책상 앞에 앉았다. 그래도 바쁜게 덜 하니 확실히 전에 비해서 공부할 여유가 생긴다. 칼퇴만 해도 이렇게 공부 열심히 할 수 있었던걸.. 왜 그 전에 한창 칼퇴하던 시절엔 공부를 안했을까 싶다. 머리가 나쁘면 몸이 고생한다는 말이 딱 그말인 것 같다. 얼른 이번 자바의 정석 3회독을 마쳐야 JSP도 좀 보고 스프링도 볼텐데 말이지. 과장님께서 주신 JSP 책.. 빨리 읽어야 하는데.. 해야할 공부가 산더미인데 큰일이다. 오늘도 후다닥 공부한 내용을 가볍게 정리하고 빠르게 사라져야지 총총...


변수 파트를 넘어가면 다음에 나오는 부분은 바로 연산자(operator)이다. 처음 프로그래밍을 공부하면서 이제 뭔가 눈에 보이는게 있군! 이라고 생각되었던게 바로 연산자 부분부터였던 것 같다. 물론 재미는 조건문, 반복문에서부터 급격하게 느끼게 되었지만, 어쨌든! 연산자도 없으면 안되는 아주 중요한 존재이기 때문에 연산자도 잘 알고 넘어가야 한다. 항상 기초가 부족하다고 느꼈기 때문에 아는 것이라고 해서 그냥 후다닥 넘어가지 않았다.


▶︎ 자바에서의 연산자


우선 프로그래밍을 공부하기전, 알고있던 연산자의 개념은 대부분 사칙연산에 쓰이는 기호들(+, -, *, /) 정도였을 것이다. 나 또한 그랬다. 자바에서의 연산자의 개념도 크게 다르지 않다. 물론 이 뿐만 아니라 여러 종류의 연산자들이 있는데 간략하게 표로 정리해보았다.



이렇게 정리해볼 수 있다. 그런데 사실 시프트연산자나 비트연산자는 거의 쓸일이 없는 것 같다. 그 외의 연산자들은 많이들 쓰인다. 그렇기 때문에 여기서 굳이 애써서 외우려고 하지 않아도 쓰다보면 자동으로 외워진다. 그럼 하나하나 정리해보자.



▶︎ 증감연산자


증감연산자는 표처럼 크게 ++, --로 나눌 수 있다. 말 그대로 증가시키고 감소시키는 역할이다. 이 증감연산자는 엄청 많이 보게 된다. 특히 반복문을 사용할 때, 기준이 되는 변수를 증감시키는 역할을 하기 때문이다. 증감연산자는 변수 앞에도 붙을 수 있고(전위형), 변수 뒤에도 붙을 수 있다(후위형). 변수의 앞에 붙는 경우와 뒤에 붙는 경우를 살펴보면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package test;
public class test {
    public static void main(String[] args) {
        System.out.println("====증감 연산자====");
         
        int i = 5;
        System.out.println(++i); //증가연산자 6
         
        System.out.println(i++); //6
        System.out.println(i); //7
         
        System.out.println("---------------");
         
        int j = 10;
        System.out.println(--j); //감소연산자 9
         
        System.out.println(j--); //9
        System.out.println(j); //8
    }
}
cs


코드 각각에 대한 설명이나 결과 값은 주석으로 달아놓았다. 증감연산자의 위치에 따라 증감이 먼저 이루어지고 출력이 되는지, 출력이 증감이 일어난 이후에 되는지 그 차이이다. 보통 후위형을 많이 쓰는 것 같다. 



▶︎ 산술연산자


그 다음은 산술연산자이다. 산술연산자는 쉽게 말해서 우리가 알고 있던 사칙연산이다. +, -, /, * 그리고 평소 잘 쓰지 않는 %(나머지) 까지. 사칙연산이기 때문에 크게 어려울 것 없다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package test;
 
public class test {
    public static void main(String[] args) {
        int a = 20;
        int b = 6;
         
        System.out.println(a + " + " + b + " = " + (a + b));
        System.out.println(a + " - " + b + " = " + (a - b));
        System.out.println(a + " * " + b + " = " + (a * b));
        System.out.println(a + " / " + b + " = " + (a / b));
        System.out.println(a + " % " + b + " = " + (a % b));
    }
}
cs


이렇게 입력하면 예상한 대로 결과값은

(출력)

a + b = 26

a - b = 14

a * b = 120

a / b = 3

a % b = 2


이런식으로 나온다. 아 물론 a / b가 3.333... 이 아닌 3으로만 나오는 이유는, 정수형(int)끼리 계산했기 때문에 그렇다. 그럼 어떻게 해야할까? 


int a = 10;

int b = 20;

int c = a + b;


double aa = 10.0;

double bb = 20.0;

double cc = 30.0;



계산은 이렇게 같은 자료형끼리 이루어져야 한다. 안 그러면 계산이 제대로 이루어지지 않는다. 하지만 이렇게 처리해주지 못할 경우가 있다. 한 가지 예를 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package test;
 
public class test {
    public static void main(String[] args) {
        int kor = 90//국어점수
        int eng = 80//영어점수
        int mat = 50//수학점수
         
        int total = kor + eng + mat; //총점
        float avg = total / 3//평균
          
        System.out.println(avg); //평균 출력
    }
}
cs


이렇게 평균을 구하다보면 어쩔 수 없이 소수점으로 나오게 되는 경우가 있다. 단순히 저렇게 계산했을 땐 어떻게 나올까. 위의 예처럼 정수 220과 정수 3을 나눴으니 73이 나와야겠지! 라고 생각했겠지만 사실은 그렇지 않다. 실행시키면 놀랍게도 73.0이라는 값이 출력된다. 처음엔 이해가 안됐었는데, 결국엔 그냥 결과값이 실수형으로 나타난 것 뿐이다. 결과값을 저장하는 avg가 float형이기 때문이다. 실제 값은 73.3333...이 나와야 하는데 0.3333...이 날라갔다. 그럼 이런 값 손실을 일으키지 않으려면 어떻게 해야할까? total이나 total을 나누는 3을 float형으로 바꿔주면 된다. 이를 형변환이라고 한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package test;
 
public class test {
    public static void main(String[] args) {
        int kor = 90//국어점수
        int eng = 80//영어점수
        int mat = 50//수학점수
         
        int total = kor + eng + mat; //총점
        float avg = total / (float)3//평균
          
        System.out.println(avg); //평균 출력
    }
}
cs


이렇게 3 앞에 (float)를 붙여서 실행시켜보았다. 이렇게 되면 3이 아니라 3.0으로 인식하게 된다. 이렇게 계산하면 아까 잃어버린 0.3333... 까지 제대로 나온다. 


그럼 여기서 또 이상한 느낌이 들어야 한다. 같은 자료형끼리 계산이 된다고 했는데 total은 정수형(int)이고, 3은 실수형(float)이다. 근데 어떻게 계산이 이루어진 것일까? 바로 산술변환 일어나 두 값이 자료형이 일치된 것이다. 그런데? 왜? 정수형(int)이 아닌 실수형(float)으로 산술변환이 일어난 것일까? 그 이유는 바로 더 큰 자료형으로 변환이 이루어지기 때문이다. 실수가 정수를 포함하기 때문에 더 큰 범위이다. 그렇기 때문에 int / float이 float/float으로 변하게 되었고, 그로 인해 값 손실이 일어나지 않게 된 것이다.



이렇게 해서 우선 자바 연산자를 둘로 나누어서 정리해야겠다 내용이 길어지니 둘로 나눠서 정리했다.