자바/자바 입문

[자바 기초] 02. 연산자(Operator)

dev스카이 2024. 3. 19. 21:16

연산자 종류

  • 산술 연산자 +, -, *, /, % (나머지 연산자)
  • 증감(증가 및 감소) 연산자 : ++, --
  • 비교 연산자 : == , != , > , < , >= , <=
  • 논리 연산자 : && (AND), || (OR), ! (NOT)
  • 대입 연산자 : = , += , -= , *= , /= , %=
  • 삼항 연산자 : ? :

🔘 산술 연산자

산술 연산자는 주로 숫자를 계산하는 데 사용된다.

  • + : 더하기
  • - : 빼기
  • * :곱하기
  • / : 나누기
  • % : 나머지

Operator1

package operator;

public class Operator1 {
    public static void main(String[] args) {
        //변수 초기화
        int a = 5;
        int b = 2;
        //덧셈
        int sum = a + b;
        System.out.println("a + b = " + sum); 

        //뺄셈
        int diff = a - b;
        System.out.println("a - b = " + diff);

        //곱셈
        int multi = a * b;
        System.out.println("a * b = " + multi);

        //나눗셈
        int div = a / b;
        System.out.println("a / b = " + div);

        //나머지
        int mod = a % b;
        System.out.println("a % b = " + mod); 
    }
}​

 

실행 결과

a + b = 7
a - b = 3
a * b = 10
a / b = 2
a % b = 1
  • 나누기 연산자에서 5 / 2를 하면 원래는 2.5가 되어야 하지만 실행 결과 소수점이 제거된 2가 출력됐다.
    • 자바에서는 같은 int형끼리 계산하면 계산 결과도 같은 int형을 사용한다. int 형은 정수이기 때문에 소수점 이하를 포함할 수 없다. 

주의 - 10 / 0 과 같이 숫자는 0으로 나눌 수 없다. (수학에서 허용하지 않음) 

//0으로 나누게 되면?
        int zero = 10 / 0;
        System.out.println(zero);

 

 

실행하면 다음과 같은 예외가 발생한다. 그러니 주의해서 사용하도록 하자.

Exception in thread "main" java.lang.ArithmeticException: / by zero

🔘 문자열 더하기

자바는 특별하게 문자열에도 + 연산자를 사용할 수 있다. 문자열에 + 연산자를 사용하면 두 문자를 연결할 수 있다.

 

Operator2

package operator;

public class Operator2 {
    public static void main(String[] args) {
        //문자열과 문자열 더하기1
        String result1 = "hello" + "world";
        System.out.println(result1);

        //문자열과 문자열 더하기2
        String s1 = "string1";
        String s2 = "string2";
        String result2 = s1 + s2;
        System.out.println(result2);

        //문자열과 숫자 더하기1
        String result3 = "a + b = " + 10;
        System.out.println(result3);

        //문자열과 숫자 더하기2
        int num = 20;
        String str = "a + b = ";
        String result4 = str + num;
        System.out.println(result4);
    }
}

 

실행 결과

hello world
string1string2
a + b = 10
a + b = 20

 

문자와 숫자를 더하면 숫자를 문자열로 변환한 다음 서로 더한다. 변수에 담겨 있어도 문자와 숫자를 더하면 문자가 된다.

 

🌟 자바는 문자열인 String 타입에 다른 타입을 더하는 경우 대상 타입을 문자열로 변경한다. 쉽게 이야기해서 문자열에 더하는 것은 다 문자열이 된다.


🔘 연산자 우선순위

수학에도 +(더하기) 보다  x(곱하기)가 먼저 계산되듯이 프로그래밍에서도 우선순위가 있다.

 

순위(1번부터 높은 순, 괄호가 제일 높고, 대입 연산자가 가장 낮다.)

  1. 괄호 ()
  2. 단항 연산자 (예: ++ , -- , ! , ~ , new , (type) )
  3. 산술 연산자 ( * , / , % 우선, 그 다음에 + , - )
  4. Shift 연산자 ( << , >> , >>> )
  5. 비교 연산자 ( < , <= , > , >= , instanceof )
  6. 등식 연산자 ( == , != )
  7. 비트 연산자 ( & , ^ , | )
  8. 논리 연산자 ( && , || )
  9. 삼항 연산자 ( ? : )
  10. 대입 연산자 ( = , += , -= , *= , /= , %= 등등)

Operator3

package operator;

public class Operator3 {
    public static void main(String[] args) {
        int sum1 = 1 + 2 * 3; // 1 + (2 * 3)
        int sum2 = (1 + 2) * 3;
        System.out.println("sum1 = " + sum1);
        System.out.println("sum2 = " + sum2);
    }
}

 

실행 결과

sum1 = 7
sum2 = 9
  • 출력 결과를 보면 sum1 = 7 이 나왔다. 연산자 우선순위에 의해 곱셈이 먼저 계산된 것이다.
  • 연산자 우선순위를 변경하려면 수학과 마찬가지로 괄호 () 를 사용하면 된다. () 를 사용한 곳이 먼저 계산된다.
  • sum2 는 괄호를 사용해서 덧셈이 먼저 처리되도록 했다.

🌟 우선순위를 다 암기할 필요는 없다. 연산자 우선순위는 딱 2가지만 기억하면 된다.

 

1. 상식선에서 우선순위를 사용하자
우선순위는 상식선에서 생각하면 대부분 문제가 없다

 

2. 애매하면 괄호()를 사용하자
코드를 딱 보았을 때 연산자 우선순위를 고민해야 할 것 같으면, 그러니까 뭔가 복잡해보이면 나 뿐만 아니라 모든 사람
이 그렇게 느낀다. 이때는 다음과 같이 괄호를 사용해서 우선순위를 명시적으로 지정하면 된다.

 

개발에서 가장 중요한 것은 단순함 명확함이다! 애매하거나 복잡하면 안된다.


🔘 증감 연산자

증가 및 감소 연산자를 줄여서 증감 연산자라 한다.
증감 연산자는 ++ 와 -- 로 표현되며, 이들은 변수의 값을 1만큼 증가시키거나 감소시킨다.
프로그래밍에서는 값을 1씩 증가하거나 1씩 감소할 때가 아주 많기 때문에 이런 편의 기능을 제공한다.

 

OperatorAdd1

package operator;

public class OperatorAdd1 {
    public static void main(String[] args) {
        int a = 0;

        a = a + 1;
        System.out.println("a = " + a); //1
        a = a + 1;
        System.out.println("a = " + a); //2

        //증감 연산자
        ++a; //a = a + 1
        System.out.println("a = " + a); //3
        ++a; //a = a + 1
        System.out.println("a = " + a); //4
    }
}

 

실행 결과

a = 1
a = 2
a = 3
a = 4

OperatorAdd1에서 확인할 수 있듯이 a = a + 1++a와 같다. 감소도 마찬가지로 a =  a - 1--a와 같다.

 

전위, 후위 증감연산자

증감 연산자는 피연산자 앞에 두거나 뒤에 둘 수 있으며, 연산자의 위치에 따라 연산이 수행되는 시점이 달라진다.

  • ++a : 증감 연산자를 피연산자 앞에 둘 수 있다. 이것을 앞에 있다고 해서 전위(Prefix) 증감 연산자라 한다.
    • 증감 연산자가 변수 앞에 오는 경우를 전위 증감 연산자라고 하며, 증감 연산이 먼저 수행된 후 나머지 연산이 수행
  • a++ : 증감 연산자를 피연산자 뒤에 둘 수 있다. 이것을 뒤에 있다고 해서 후위(Postfix) 증감 연산자라 한다.
    • 증감 연산자가 변수 뒤에 오는 경우를 후위 증감 연산자라고 하며, 다른 연산이 먼저 수행된 후 증감 연산이 수행

OperatorAdd2

package operator;

public class OperatorAdd2 {
    public static void main(String[] args) {
        // 전위 증감 연산자 사용 예
        int a = 1;
        int b = 0;
        b = ++a; //a의 값을 먼저 증가시키고, 그 결과를 b에 대입
        System.out.println("a = " + a + ", b = " + b); //결과: a = 2, b = 2

        //후위 증감 연산자 사용 예
        a = 1; // a 값을 다시 1로 지정
        b = 0; // b 값을 다시 0으로 지정
        b = a++; // a의 현재 값을 b에 먼저 대입하고, 그 후 a 값을 증가시킴
        System.out.println("a = " + a + ", b = " + b); //결과: a = 2, b = 1
    }
}

 

실행 결과

a = 2, b = 2
a = 2, b = 1

전위 증감 연산자를 사용했을 때와 후위 증감 연산자를 사용했을 때의 결과값이 다른 걸 볼 수 있다.

 

증감 연산자를 단독으로 사용하는 경우에는 다른 연산이 없기 때문에, 본인의 값만 증가한다. 따라서 전위이든 후위이든 둘다 결과가 같다.
++a;
a++;

🔘 비교 연산자

비교 연산자는 두 값을 비교하는 데 사용한다. 비교 연산자는 주로 조건문과 함께 사용한다.

비교 연산자를 사용하면 참( true ) 또는 거짓( false )이라는 결과가 나온다. 참 거짓은 boolean 형을 사용한다.

 

종류

  • == : 동등성 (equal to)
  • != : 불일치 (not equal to)
  • > : 크다 (greater than)
  • < : 작다 (less than)
  • >= : 크거나 같다 (greater than or equal to)
  • <= : 작거나 같다 (less than or equal to)

Comp1

package operator;

public class Comp1 {
    public static void main(String[] args) {
        int a = 2;
        int b = 3;

        System.out.println(a == b); //false, a와 b는 같지 않다.
        System.out.println(a != b); //true, a와 b는 다르다.
        System.out.println(a > b);  // false, a는 b보다 크지 않다
        System.out.println(a < b);  // true, a는 b보다 작다
        System.out.println(a >= b); // false, a는 b보다 크거나 같지 않다
        System.out.println(a <= b); // false, a는 b보다 크거나 같지 않다

        //결과를 boolean 변수에 담을 수 있다.
        boolean result = a == b;
        System.out.println(result);  //false
    }
}

 

문자열 비교

문자열이 같은지 비교할 때는 == 이 아니라 .equals() 메서드를 사용해야 한다.

 

Comp2

package operator;

public class Comp2 {
    public static void main(String[] args) {
        String str1 = "문자열1";
        String str2 = "문자열2";

        boolean result1 = "hello".equals("hello"); //리터럴 비교
        boolean result2 = str1.equals("문자열1"); //문자열 변수, 리터럴 비교
        boolean result3 = str1.equals(str2); //문자열 변수 비교

        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
    }
}

 

실행 결과

result1 = true
result2 = true
result3 = false

문자열이 같으면 true, 다르면 false를 출력하는 걸 볼 수 있다.


🔘 논리 연산자

논리 연산자는 boolean 형인 true , false 를 비교하는데 사용한다.

 

종류

  • && (그리고) : 두 피연산자가 모두 참이면 참을 반환, 둘중 하나라도 거짓이면 거짓을 반환
  • || (또는) : 두 피연산자 중 하나라도 참이면 참을 반환, 둘다 거짓이면 거짓을 반환
  • ! (부정) : 피연산자의 논리적 부정을 반환. 즉, 참이면 거짓을, 거짓이면 참을 반환

Logical1

package operator;

public class Logical1 {
    public static void main(String[] args) {
        //AND 연산
        System.out.println(true && true); //true
        System.out.println(true && false); //false
        System.out.println(false && false);//false

        //OR 연산
        System.out.println(true || true); //true
        System.out.println(true || false); //true
        System.out.println(false || false); //false
		// !(NOT) 연산
        System.out.println("! 연산");
        System.out.println(!true); //false
        System.out.println(!false);  //true
    }
}

🔘 대입 연산자

대입 연산자

대입 연산자( = )는 값을 변수에 할당하는 연산자다. 이 연산자를 사용하면 변수에 값을 할당할 수 있다.

예를 들어, int a = 1 는 a 라는 변수에 1 이라는 값을 할당한다.

 

축약(복합) 대입 연산자

산술 연산자와 대입 연산자를 한번에 축약해서 사용할 수 있는데, 이것을 축약(복합) 대입 연산자라 한다.

  • 연산자 종류
    • +=
    • -=
    • *=
    • /=
    • %=

이 연산자는 연산과 대입을 한번에 축약해서 처리한다. 다음 왼쪽과 오른쪽의 결과는 같다.

  • i = i + 3 ➜ i += 3
  • i = i * 4 ➜ i *= 4

Assign1

package operator;

public class Assign1 {
    public static void main(String[] args) {
        int a = 5;
        a += 3; // 8 (5 + 3): a = a + 3
        a -= 2; // 6 (8 - 2): a = a - 2
        a *= 4; // 24 (6 * 4): a = a * 4
        a /= 3; // 8 (24 / 3): a = a / 3
        a %= 5; // 3 (8 % 5) : a = a % 5
        System.out.println(a);
    }
}

 

실행 결과

3

 

💡Tip

System.out.println(result) 에서 ';'(세미콜론)을 붙여야 문장이 완성된다.
만일, 커서(Cursor) 위치가 result사이에 있다고 하자. 문장을 완성하려면 방향키 아니면 마우스를 사용해 커서 위치를 옮긴 후에 적는 게 일반적이다. 그러나 코드가 많아지면 번거롭다.
<Ctrl + Shift + Enter>를 해주면 자동으로 문장 완성이 된다.