본문 바로가기
프로그래밍 기초/Java

[Java] 연산자 총정리 : 종류, 사용법, 특징, 우선순위까지!

by 제이투더문 2024. 6. 11.

 

 안녕하세요 작가 J 입니다. 오늘은 Java의 연산자 파트를 알아보도록 하겠습니다. 지금까지는 간단한 코드만 작성했지만, 연산자부터는 계산이 들어가기 때문에 예제와 문제가 조금 나옵니다. Java에서 연산자는 데이터를 처리하고 결과를 도출하는 데 중요한 역할을 합니다. 연산자는 크게 여러 가지로 나뉘며, 각각의 사용법과 특징, 그리고 우선순위를 잘 이해하는 것이 중요합니다. 여기서는 초보자도 쉽게 이해할 수 있도록 Java의 연산자들을 정리해 보겠습니다.

▤ 목차

     

     

    일단 연산자의 종류에 대해서 그림으로 알아보도록 하겠습니다.

    (출처) 스마트인재개발원

     

     항은 피연산자라고도 불리며, 연산이 이루어지는 데이터입니다. 예를 들어 A + B에서는 이항이며, A ++ 는 단항이 되겠습니다.

     

    1. 산술 연산자 (Arithmetic Operators)

     

     산술 연산자는 기본적인 수학 연산을 수행합니다. 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산이 포함됩니다. 이 연산자들은 수치 데이터를 다룰 때 필수적이며, 정수와 실수 모두에 사용될 수 있습니다. 산술 연산자는 프로그램 내에서 계산을 수행하고, 데이터를 조작하는 기본적인 도구입니다. 특히, 나눗셈 연산자와 나머지 연산자는 정수 나눗셈과 관련된 특별한 주의가 필요합니다.

    • 덧셈 ( + ): 두 피연산자를 더하는 연산자입니다. 주로 수치 데이터를 합산할 때 사용됩니다.
    • 뺄셈 ( - ): 첫 번째 피연산자에서 두 번째 피연산자를 빼는 연산자입니다. 차를 계산할 때 유용합니다.
    • 곱셈 ( * ): 두 피연산자를 곱하는 연산자입니다. 수학적 계산에서 빈번하게 사용됩니다.
    • 나눗셈 ( / ): 첫 번째 피연산자를 두 번째 피연산자로 나누는 연산자입니다. 정수형 변수 간의 나눗셈은 결과가 정수로 나오며, 나머지는 버려집니다.
    • 나머지 ( % ): 첫 번째 피연산자를 두 번째 피연산자로 나눈 나머지를 구하는 연산자입니다. 주로 특정 주기성을 확인하거나 홀수, 짝수를 구분할 때 사용됩니다.

    예제 :

    int a = 5 + 3;  // 결과: 8
    int b = 5 - 3;  // 결과: 2
    int c = 5 * 3;  // 결과: 15
    int d = 5 / 3;  // 결과: 1 (정수 나눗셈이므로)
    int e = 5 % 3;  // 결과: 2

     

     나눗셈은 분수의 형태가 뉘어져 있다고 생각하시면 될 것 같고, 나머지는 아마 처음 보시는 분들이 많을 겁니다. 산술 연산자에서 주의할 점은 큰 데이터(ex:실수)를 작은 데이터(ex:정수)로 연산했을 때 지난 시간에 배운 자동(묵시적) 형 변환이 일어난다는 것입니다.

     

    예제 :

    int a = 10;
    float b = 7.0f;
    System.out.println(a / b); // 결과 : 1.4285715

     

     또 한 가지, 그렇다면 문자 + 숫자는 어떻게 될까요?

     

    예제:

    String a = 10 + 7 + "1";
    String b = 8 + "1" + 2;
    String c = "1" + 5 + 2;
    System.out.println(a); // 결과 : 171 
    System.out.println(b); // 결과 : 812
    System.out.println(c); // 결과 : 152

     

     위와 같이 문자 자료형으로 변환된다고 볼 수 있습니다. a는 17에 문자열 1을 더해서 171이 되고, b는 8에 문자열 1 더해서 81인 문자열에 2를 더해서 812, c는 이미 1인 문자열에 5를 더하고 2를 더해서 152가 됩니다.

     

     그럼 간단한 실습 문제도 한번 풀어보겠습니다. 다만 실습을 진행하는 데 있어 자바의 Scanner 클래스가 필요하기 때문에 Scanner의 사용법은 정말 간단히 하고 넘어가겠습니다. 추후에 더 자세히 다루겠습니다.

     

    Scanner 사용법:

    Scanner sc = new Scanner(System.in); // Scanner 클래스 객체 생성
    System.out.print("정수 입력 : "); // 메시지 출력
    int num1 = sc.nextInt(); // int형 num이라는 변수에 Scanner로 입력받은 값 할당

     

    소스를 Ctrl + C, Ctrl + V로 붙여넣었을 때 Scanner에 빨간 줄이 들어올겁니다. 커서를 가져다 대면 위와 같이 뜹니다. 첫번째 항목을 클릭해줍시다.

     

    아니면 Scanner만 입력하고 Ctrl + Space를 누른다음에 젤 위에 것을 선택해주셔도 됩니다.

     

     Scanner 사용 준비가 끝나면 젤 위에 줄에  import java.util.Scanner; 가 입력됩니다. 확인해 주세요.

     

    (출처) 스마트인재개발원

     

     

     

    풀이 :

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in); // 숫자를 입력받기 위한 Scanner 생성
    		
    		System.out.print("첫번째 정수입력 : "); // 첫번째 숫자 입력받기
    		int num1 = sc.nextInt();
    		
    		System.out.print("두번째 정수입력 : "); // 두번째 숫자 입력받기
    		int num2 = sc.nextInt();
    		
    		System.out.println("더한 결과 값 : " + (num1 + num2)); // 결과 : 13
    		System.out.println("뺀 결과 값 : " + (num1 - num2)); // 결과 : 7
    		System.out.println("곱한 결과 값 : " + (num1 * num2)); // 결과 : 30
    		System.out.println("나눈 결과 값 : " +  ((double) num1 / num2)); // 결과 : 3.3333333333333335
    		
    	}
    
    }

     

     위 문제는 어렵지 않지만, 나눈 결과 값이 소수점 이하도 출력되게 하는 게 함정입니다. 게다가 자릿수가 많은 걸로 보아 float보다 큰 형태인 double을 사용하여야 합니다. 처음에 입력받은 숫자가 정수이니 나중에 double로 형 변환을 해주어야 합니다.

     

     

    (출처) 스마트인재개발원

     

     

     

    풀이 :

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in); // 숫자를 입력받기 위한 Scanner 생성
    		
    		System.out.print("정수입력 : "); // 변수 num 입력 받기
    		int num = sc.nextInt();
    		
    		System.out.println(((num / 100) * 100)); // num을 100으로 나눈 몫에 곱하기 100
    		System.out.println(num - (num % 100)); //num에서 num을 100으로 나눈 나머지 뺴주기
    	}
    
    }

     

      이 문제에 대해서 필자는 2가지 답을 생각해 볼 수 있다. 답은 같지만, 풀이 방법은 다양하다.

     

    (출처) 스마트인재개발원

     

     

    풀이 :

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in); // 숫자를 입력받기 위한 Scanner 생성
    		System.out.print("초 입력 : "); // 변수 초 입력 받기
    		int totalSecond = sc.nextInt();
    		
    		int hour = totalSecond / 3600; // 시간, 1시간은 3600초이므로
    		int minute = (totalSecond % 3600) / 60; // 분, 1시간을 나눈 나머지 숫자를 123을 60초로 나눠서 2분
    		int second = totalSecond % 60; //초, 60으로 나눈 나머지 3초. 시, 분은 결국 60으로 전부 나눠진다.
    		
    		System.out.println(hour + "시" + minute + "분" + second + "초");
    	}
    
    }

     

     

    2. 대입 연산자 (Assignment Operators)

     

     대입 연산자는 변수에 값을 할당하는 데 사용됩니다. 기본 대입 연산자 외에도 복합 대입 연산자가 있습니다. 복합 대입 연산자는 변수의 값을 갱신하는데 자주 사용되며, 코드의 간결성을 높이는 데 도움을 줍니다. 대입 연산자는 데이터 초기화 및 업데이트의 핵심 도구입니다

     

     예제 :

    // 대입 ( = ): 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당합니다.
    int a = 5;  // 변수 a에 5를 대입
    
    // 복합 대입 연산자
    // +=: 왼쪽 피연산자에 오른쪽 피연산자를 더하고 결과를 왼쪽 피연산자에 대입합니다.
    int a = 5;
    a += 3;  // a = a + 3; 결과: 8
    
    // -=: 왼쪽 피연산자에서 오른쪽 피연산자를 빼고 결과를 왼쪽 피연산자에 대입합니다.
    int a = 5;
    a -= 3;  // a = a - 3; 결과: 2
    
    // *=: 왼쪽 피연산자에 오른쪽 피연산자를 곱하고 결과를 왼쪽 피연산자에 대입합니다.
    int a = 5;
    a *= 3;  // a = a * 3; 결과: 15
    
    // /=: 왼쪽 피연산자를 오른쪽 피연산자로 나누고 결과를 왼쪽 피연산자에 대입합니다.
    int a = 5;
    a /= 3;  // a = a / 3; 결과: 1
    
    // %=: 왼쪽 피연산자를 오른쪽 피연산자로 나눈 나머지를 왼쪽 피연산자에 대입합니다
    int a = 5;
    a %= 3;  // a = a % 3; 결과: 2

     

     

    3. 증감 연산자 (Increment and Decrement Operators)

     

     증감 연산자는 변수의 값을 1씩 증가시키거나 감소시킵니다. 이 연산자는 반복문에서 자주 사용되며, 루프 카운터를 관리하는 데 유용합니다. 증감 연산자는 코드를 더 간결하고 읽기 쉽게 만듭니다.

     

    예제 :

    // 증가 ( ++ ): 변수의 값을 1 증가시킵니다.
    int a = 5;
    a++;  // a = a + 1; 결과: 6
    
    // 감소 ( -- ): 변수의 값을 1 감소시킵니다.
    int a = 5;
    a--;  // a = a - 1; 결과: 4

     

     증감 연산자에서 주의할 점은 예를 들어 출력한다고 했을 때, 변수 앞에 ++a가 붙으면 증가를 시킨 뒤에 출력합니다. 예를 들어 int a = 3; 일 때 3++를 출력하면 3이 출력되고 난 다음에 4로 증가하지만 ++3을 출력하면 증가한 뒤에 4로 출력됩니다.

     

    예제 :

    int opr = 0;
    opr += 3;
    		
    System.out.println(opr++); // 결과 : 3
    System.out.println(opr); // 결과 : 4
    System.out.println(++opr); //결과 : 5

     

    4. 비교 연산자(Comparison Operator)

     

     비교 연산자는 두 피연산자 간의 관계를 비교합니다. 이 연산자에는 크다, 작다, 크거나 같다, 작거나 같다, 같다, 다르다가 포함됩니다. 관계 연산자는 조건문과 반복문에서 중요한 역할을 합니다. 예를 들어, if 문이나 while 문에서 특정 조건이 참인지 거짓인지 평가할 때 사용됩니다. 관계 연산자는 프로그램의 흐름 제어를 위해 필수적입니다.

     

    예제 :

    // 크다 ( > ): 첫 번째 피연산자가 두 번째 피연산자보다 큰지 비교합니다.
    boolean result = 5 > 3;  // 결과: true
    
    // 작다 ( < ): 첫 번째 피연산자가 두 번째 피연산자보다 작은지 비교합니다.
    boolean result = 5 < 3;  // 결과: false
    
    // 크거나 같다 ( >= ): 첫 번째 피연산자가 두 번째 피연산자보다 크거나 같은지 비교합니다.
    boolean result = 5 >= 3;  // 결과: true
    
    // 작거나 같다 ( <= ): 첫 번째 피연산자가 두 번째 피연산자보다 작거나 같은지 비교합니다.
    boolean result = 5 <= 3;  // 결과: false
    
    // 같다 ( == ): 두 피연산자가 같은지 비교합니다.
    boolean result = 5 == 3;  // 결과: false
    
    // 다르다 ( != ): 두 피연산자가 다른지 비교합니다.
    boolean result = 5 != 3;  // 결과: true

     

     

    5. 논리 연산자 (Logical Operators)

     

     논리 연산자는 논리적인 조건을 결합하거나 부정합니다. AND, OR, NOT 연산자가 있으며, 복합 조건을 다룰 때 매우 유용합니다. 논리 연산자는 주로 조건문에서 사용되며, 복잡한 논리식을 단순화하는 데 도움을 줍니다. 이를 통해 코드의 가독성을 높이고, 논리적인 오류를 줄일 수 있습니다.

     

    예제 : 

    // AND ( && ): 두 조건이 모두 참일 때만 참입니다.
    boolean result = (5 > 3) && (3 > 1);  // 결과: true
    
    // OR ( || ): 두 조건 중 하나라도 참이면 참입니다.
    boolean result = (5 > 3) || (3 < 1);  // 결과: true
    
    // NOT ( ! ): 조건을 부정합니다.
    boolean result = !(5 > 3);  // 결과: false

     

     

    6. 삼항 연산자(Ternary Operator)

     

     삼항 연산자는 조건에 따라 다른 값을 반환합니다. 이 연산자는 if-else 문을 간단히 표현하는 데 유용합니다. 삼항 연산자(조건부 연산자)는 간결한 조건문 작성에 도움을 줍니다.

     

    예제 :

    // 삼항 연산자 ( ? : ): 조건이 참이면 첫 번째 값을, 거짓이면 두 번째 값을 반환합니다.
    
    int a = 5;
    int b = 3;
    int max = (a > b) ? a : b;  // a가 b보다 크면 a, 아니면 b 반환

     

     

     

     

    풀이 :

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in); // 숫자를 입력받기 위한 Scanner 생성
    		System.out.print("정수를 입력하세요 : "); // 정수 입력받기
    		int num = sc.nextInt();
    		
    		String str = (num % 2) == 0 ? "짝수" : "홀수"; // 2로 나누어 떨어지면 짝수, 아니면 홀수
    		System.out.println(num + "는(은)" + str + "입니다.");
    	}
    
    }

     삼항 연산자 안의 문자열 "짝수"와 "홀수"의 위치는 나머지의 값에 따라서 바뀔 수 있다.

     

     

     

    풀이 :

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in); // 숫자를 입력받기 위한 Scanner 생성
    		System.out.print("첫 번째 정수 입력 : "); // 첫번째 정수 입력받기
    		int num1 = sc.nextInt();
    		System.out.print("두 번째 정수 입력 : "); // 두번째 정수 입력받기
    		int num2 = sc.nextInt();
    		
    		int sum = num1 > num2 ? num1 - num2 : num2 - num1; // num1과 num2 중 어느 수가 큰지 비교해서 큰 수에서 작은 수 빼주기
    		System.out.println("두수의 차 : " + sum);
    	}
    
    }

     

     

     

     

     풀이 :

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in); // 숫자를 입력받기 위한 Scanner 생성
    		System.out.print("농구공의 개수를 입력하세요 : "); // 농구공의 개수 입력받기
    		int basketBall = sc.nextInt();
    		
    		int box = basketBall % 5 > 0 ? basketBall / 5 + 1 : basketBall / 5; 
    		// 농구공이 33이라고 가정해서 박스 5개로 나누면 3개가 남는다. 상자 1개가 더 필요하다는 뜻.
    		// 만약 20개면 5개로 나눠서 4박스가 나오고 더 이상 박스가 필요없다.
    		// 농구공에서 박스로 나눈 나머지가 있을 경우에만 1박스를 더 준비하자.
    		System.out.println("필요한 상자의 수 : " + box);
    	}
    
    }

     

     

    연산자의 우선순위

     

    (출처) 스마트인재개발원

     

    연산자의 우선순위는 복잡한 식을 평가할 때 중요한 역할을 합니다. 우선순위가 높은 연산자가 먼저 계산됩니다. 각 연산자의 우선순위를 잘 이해하고 적절히 괄호를 사용하면 복잡한 표현식을 보다 명확하게 작성할 수 있습니다.

     

     

    마무리

     

     어째서인지 갈수록 블로그 글이 더 길어지는 것 같습니다. 오늘은 이론 설명과 아울러 예제를 보고, 실습 문제도 풀어봐서 더욱더 글이 길게만 느껴집니다. 그만큼 Java의 연산자는 프로그래밍에서 기본적이면서도 매우 중요한 요소입니다. 다양한 연산자들을 이해하고 올바르게 사용하는 것은 효율적이고 오류 없는 코드를 작성하는 데 큰 도움이 됩니다.

     

     특히, 연산자의 우선순위를 잘 파악하고, 필요에 따라 괄호를 사용하여 명확한 코드를 작성하는 것이 중요합니다. 연산자들을 이해하고 나면, 복잡한 문제도 보다 쉽게 해결할 수 있을 것입니다.

     

     프로그래밍을 처음 접하는 초보자분들도 이번 글을 통해 Java 연산자에 대한 기본 개념을 확실히 잡으셨기를 바랍니다. 연산자들은 작은 요소일 수 있지만, 코드를 작성하는 데 있어 중요한 역할을 합니다. 꾸준한 연습과 학습을 통해 연산자 사용에 익숙해지고, 더 나아가 복잡한 알고리즘도 구현할 수 있기를 바랍니다.