본문 바로가기
IT/김영한의JAVA입문_inFlearn

3. 연산자 - 산술 연산자 / 문자열 더하기 / 연산자 우선순위 / 증감 연산자 / 비교 연산자 / 논리 연산자 / 대입 연산자

by for-learn 2024. 12. 19.

연산자: 계산을 수행하는 기호

 

연산자의 종류

산술 연산자: + , - , * , / , % (나머지 연산자)

증감(증가 및 감소) 연산자: ++ , --

비교 연산자: == , != , > , < , >= , <=

논리 연산자: && (AND), || (OR), ! (NOT)

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

삼항 연산자: ? : => 안 다룸

 

연산자 전체를 강의하지 않고 실무에서 사용하는 연산자만 다룰 예정

3 + 4
a - b

 

연산자(operator): ex) +, -

피연산자(operand): ex) 3, 4, a, b

 

3-1. 산술연산자

Operator1.java

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); // a + b = 7

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

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

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

        // 나머지
        int mod = a % b;
        System.out.println("a % b = " + mod); // a % b = 1
        
        // 0으로 숫자 나누기
        // Exception in thread "main" java.lang.ArithmeticException: / by zero at operator.Operator1.main
        // int z = 10 / 0;
    }
}
  • 나머지 연산자는 실무와 알고리즘 모두에 종종 사용됨
  • 10/2와 같이 숫자는 0으로 나눌 수 없다(수학에서 허용 안함) => 프로그램 오류가 난다. 
  • 예외가 발생하면 해당 시점 이후의 결과가 출력되지 않고 프로그램이 종료된다. 

 

3-2. 문자열 더하기

Operator2.java

package operator;

public class Operator2 {

    public static void main(String[] args) {

        // 문자열과 문자열 더하기1
        String result1 = "hello " + "world";
        System.out.println(result1);

        // 문자열과 문자열 더하기1
        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);
    }
}
  • 문자와 숫자를 더하면 숫자를 문자열로 변경한 다음에 서로 더한다. (변수에 담겨 있어도 동일)

 

3-3. 연산자 우선순위

Operator3.java

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); // sum1 = 7
        System.out.println("sum2 = " + sum2); // sum2 = 9    
    }
}
  • 덧셈과 곱셈이 있을 때, 곱셈이 먼저 계산된다. 
  • 우선순위 변경은 괄호 ()를 통해 가능하다.

Operator4.java

package operator;

public class Operator4 {
    public static void main(String[] args) {
        int sum3 = 2 * 2 + 3 * 3; // (2 * 2) + (3 * 3)
        int sum4 = (2 * 2) + (3 * 3); // sum3과 같다.
        System.out.println("sum3 = " + sum3); // sum3 = 13
        System.out.println("sum4 = " + sum4); // sum4 = 13
    }
}
  • 식이 복잡한 경우, 괄호를 명시적으로 사용하는 것이 더 명확하고 이해하기 쉽다.
  • 코드를 더 쓰더라도 명확하고 단순한 것이 유지보수에 좋음

 

연산자 우선순위 암기법

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

 

  • 괄호()가 제일 높, 대입 연산자(=)가 제일 낮
  • 대부분의 실무 개발자들은 우선순위를 외우지 않고 상식선으로 생각해서 사용한다. 
  • 애매하면 괄호() 사용

 

3-4. 증감 연산자

++, --로 변수의 값을 1만큼 증가/감소 시킨다. 

OperatorAdd1.java

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 : 연산자가 앞에 있다고 해서 전위(Prefix) 증감 연산자라 한다.
a++ : 연산자가 뒤에 있다고 해서 후위(Postfix) 증감 연산자라 한다

 

OperatorAdd2.java

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
    }
}
  • 전위(Prefix) 증감 연산자는 증감 연산이 먼저 수행된 후 나머지 연산이 수행
  • 후위(Postfix) 연산자는 다른 연산이 먼저 수행된 후 증감 연산이 수행(대입 연산이 먼저 수행)

 

3-5. 비교 연산자

두 값을 비교한다. 주로 조건문과 함께 사용한다. 

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

결과는 참 true 또는 거짓 false 로 나온다. 

Comp1.java

package operator;

public class Comp1 {
    public static void main(String[] args) {
        int a = 2;
        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);
        System.out.println(a <= b);

        // 결과를 boolean 변수에 담음
        boolean result = a == b;
        System.out.println("result = " + result);
    }
}

 

문자열 비교

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

== 로 문자열을 비교했을 때 성공할 때도 있고 실패할 때도 있다. 

Comp2.java

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 = " + result1);
        System.out.println("result2 = " + result2);
        System.out.println("result3 = " + result3);

        System.out.println("hello" == "hello");
        System.out.println("hello" == "hell");
    }
}

 

3-6. 논리 연산자

boolean형인 true, false를 비교하는데 사용

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

Logical1.java

package operator;

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

        System.out.println("||: OR 연산");
        System.out.println(true || true); // true
        System.out.println(true || false);// true
        System.out.println(false || false);// false

        System.out.println("! 연산");
        System.out.println(!true); // false
        System.out.println(!false); // true

        System.out.println("변수 활용");
        boolean a = true;
        boolean b = false;
        System.out.println(a && b); // false
        System.out.println(a || b); // true
        System.out.println(!a); // false
        System.out.println(!b); // true
    }
}

Logical2.java  논리연산자활용

package operator;

public class Logical2 {
    public static void main(String[] args) {
        int a = 15;
        // a는 10보다 크고 20보다 작다
        boolean result = a > 10 && a < 20; // (a > 10) && (a < 20)
        System.out.println("result = " + result); // true
    }
}

 

3-6. 대입 연산자

값을 변수에 할당하는 연산자

 

축약(복합) 대입 연산자

산술 연산자와 대입 연산자를 한번에 축약해서 사용

연산자 종류: += , -= , *= , /= , %=

Assign1.java

package operator;

public class Assign1 {
    public static void main(String[] args) {
        int a = 5; // 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-7. 문제와 풀이

OperationEx1.java

package operator.ex;

public class OperationEx1 {
    public static void main(String[] args) {
        /*
        1. num1 , num2 , num3 라는 이름의 세 개의 int 변수를 선언하고, 각각 10, 20, 30으로 초기화하세요.
        2. 세 변수의 합을 계산하고, 그 결과를 sum 이라는 이름의 int 변수에 저장하세요.
        3. 세 변수의 평균을 계산하고, 그 결과를 average 라는 이름의 int 변수에 저장하세요. 평균 계산 시 소수점 이
        하의 결과는 버림하세요.
        4. sum 과 average 변수의 값을 출력하세요.
        */
        int num1 = 10;
        int num2 = 20;
        int num3 = 30;

        int sum = num1 + num2 + num3;
        int average = sum/3;

        System.out.println("sum = "+sum+", average = "+average);
    }
}

OperationEx2.java

package operator.ex;

public class OperationEx2 {
    public static void main(String[] args) {
        // 다음 double 변수들을 선언하고 그 합과 평균을 출력하는 프로그램을 작성하세요.
        double val1 = 1.5;
        double val2 = 2.5;
        double val3 = 3.5;

        double sum = val1 + val2 + val3;
        double average = sum/3;

        System.out.println("sum = "+sum+", average = "+average);
        }
}

OperationEx3.java

package operator.ex;

public class OperationEx3 {
    public static void main(String[] args) {
        /*
        int 형 변수 score 를 선언하세요.
        score 가 80점 이상이고, 100점 이하이면 true 를 출력하고, 아니면 false 를 출력하세요.
         */

        int score = 50;
        boolean result = score >= 80 && score <= 100;
        System.out.println("score = " + result);
    }
}