하나의 값 또는 여러 개의 값을 피연산자로 하여 새로운 값을 만들어내는 기호를 의미한다.
산술 연산자는 사칙연산에 사용되는 연산자(+
, -
, *
, /
)와 나머지 연산자(%
)을 포함한다.
산술 연산자의 동작은 우리가 알고 있는 일반적인 수학 연산과 거의 동일하다.
연산자 | 기능 | 예시(int) | 결과값 |
---|---|---|---|
+ (덧셈 연산자) | 두 항의 값을 더한 값을 반환한다. | 7 + 3 | 10 |
- (뺄셈 연산자) | 좌항의 값에서 우항의 값을 뺀 값을 반환한다. | 7 - 3 | 4 |
* (곱셈연산자 | 두 항의 값을 곱한 값을 반환한다. | 7 * 3 | 21 |
/ (나눗셈 연산자) | 좌항을 우항으로 나눈 값을 반환한다. | 7 / 3 | 2 |
% (나머지 연산자) | 좌항의 값을 우항의 값으로 나눈 나머지를 반환한다. | 7 % 3 | 1 |
용례는 다음과 같다.
int num1 = 1;
int num2 = num1 + 2; // num2 -> 3
int num3 = num2 - 1; // num3 -> 2
int num4 = num3 * 3; // num4 -> 9
int num5 = num4 / 2; // num5 -> 4
int num6 = num5 % 3; // num6 -> 1
나눗셈 연산자와 너머지 연산자를 사용할 때에는 우항에 0이 위차할 수 없다. 즉 어떤 수를 0으로 나눌 수 없다.
int num1 = 9 / 0; // 에러
double num2 = 9.0 / 0; // Infinity
int num3 = 9 % 0; // 에러
double num4 = 9.0 % 0; // 에러
나눗셈 연산자를 사용할 때, 좌항과 우항이 모두 int
형이면 그 결과도 int
형이기 때문에 소수점 이하의 값은 버려지고, 오직 몫만 결과로 반환된다.
반면, 좌항이나 우항 중 하나라도 실수 타입의 값이 존재한다면, 실수 타입이 아닌 값도 실수 타입으로 자동으로 형변환되어 계산되며, 결과적으로 실수 간의 나눗셈 연산이 되어 소수점이 버려지지 않은 온전한 값이 결과값으로 반환된다.
double num1 = 9 / 2; // 4.0
int num2 = 9 / 2; // 4
double num3 = 9.0 / 2; // 4.5
변수의 값을 1씩 증가시키거나 감소시키는 연산자를 증감연산자라고 한다.
num1++; // num1 = num1 + 1;과 같다.
++num1; // num1 = num1 + 1;과 같다.
num2--; // num2 = num2 - 1;과 같다.
--num2; // num2 = num2 - 1;과 같다.
증감 연산자에는 두 가지 종류가 있다.
아래의 예제를 통해 이해할 수 있다.
int num1 = 1;
int prefix = ++num1;
int num2 = 1;
int postfix = num2++;
위의 코드가 실행되고 나면 num1
, num2
, prefix
, postfix
의 값으 어떻게 되어져 있을까?
num1
& prefix
: num1
에 전위형 증감연산자 ++
를 사용했으므로, num1
의 값이 1만큼 먼저 증가된 다음 그 결과값이 prefix
에 할당된다.num1
의 값은 2, prefix
의 값도 2가 된다.num2
& postfix
: num2
에 후위형 증감연산자 ++
를 사용했으므로, num2
의 값이 먼저 postfix
에 할당된 다음에 num2
의 값이 1 증가한다.num2
의 값은 2, postfix
의 값은 1이 된다.위의 증감연산자 처럼 1씩 말고 2나 3씩 증가시키거나 감소시키고 싶을 때 증감연산자를 사용할 수 없기에 복합 대입 연산자를 사용하면 된다.
num += 2;
num -= 2;
모든 사칙 연산자 및 나머지 연산자와 대입 연산자를 결합해서 복합 대입 연산자로 사용 가능하다.
// num1~5의 값을 모두 10이라고 한다면,
num1 += 3; // num1 -> 13
num2 -= 3; // num2 -> 7
num3 *= 3; // num3 -> 30
num4 /= 3; // num4 -> 3
num5 %= 3; // num5 -> 1
비교 연산자는 boolean
타입으로 평가될 수 있는 조건식에 사용되며, 크게 대소 비교(>
, <
, <=
, >=
)연산자와 등가 비교(==
, !=
) 연산자로 분류된다.
대소 비교 연산자는 boolean
을 제외한 너머지 기본 타입에 모두 사용할 수 있다.
대소 비교 연산자 | 결과 |
---|---|
5 > 3 | true |
5 <= 5 | true |
3 > 2 | true |
2 >= 3 | false |
등가 비교 연산자는 모든 타입에 사용할 수 있는 연산자로, 두 항의 값이 동등한지의 여부를 판단할 때 사용한다. 다만, 기본 타입과 참조 타입 간에는 등가 비교 연산자를 사용할 수 없다.
등가 비교 연산자는 값이 동등하면 true
, 그렇지 않으면 false
를 반환한다.
등가 비교 연산자 | 결과 |
---|---|
5 == 3 | false |
5 == 5 | true |
3 != 2 | true |
3 != 3 | false |
논리 연산자는 AND 연산자 &&
, OR 연산자 ||
, NOT 연산자 !
를 포함하며, 공통적으로 boolean
타입을 반환한다.
논리 연산자의 연산 결과는 다음과 같다.
&&
) : 피연산자 두 개가 모두 true
일 때 true
를 반환하며, 피연산자 두 개 중 하나라도 true
가 아니면 false
를 반환한다.||
) : 피연산자 두 개 중 단 하나라도 true
면 true
를 반환하며, 피연산자가 모두 false
인 경우에만 false
를 반환한다.x | y | x && y | x II y |
---|---|---|---|
false | false | false | false |
false | true | false | true |
true | false | false | true |
true | true | true | true |
NOT 연산자(!
)는 true
와 false
를 반대로 바꾸는 연산자이다.
// 아래의 비교 연산 결과는 모두 true이다.
!true == false
!false == true
!!true == true
프로그래밍을 하면서 변수에 담긴 값을 확인해야 할 필요가 있을 때, 콘솔에 출력할 수 있다. 콘솔에 값을 출력하기 위해서는 System.out.print()
, System.out.println()
, System.out.printf()
메서드를 활용한다.
데이터를 입력 받을 때에는 Scanner
클래스를 활용하면 된다.
데이터를 입력받는 코드는 아래와 같다.
import java.util.Scanner; // Scanner 클래스를 가져온다.
Scanner scanner = new Scanner(System.in); // Scanner 클래스의 인스턴스를 생성한다.
String inputValue = scanner.nextLine(); // 입력한 내용이 inputValue에 저장된다.
System.out.println(inputValue); // 입력한 문자열이 출력된다.
if
문의 소괄호 안에는 boolean
값으로 평가될 수 있는 조건식을 넣어주고, 중괄호 안의 실행 블록에는 조건식이 참일 때 실행하고자 하는 코드를 적어주면 된다.
if (조건식) {
//조건식이 참이라면 실행되는 블록이다.
}
중괄호를 이용해 여러 문장을 하나의 단위로 묶을 수 있는데 이것을 '블록(block)'이라고 한다.
if...else
문은 조건식의 결과에 따라 실행블록을 선택한다. if
문의 조건식이 true
이면 해당 블록이 실행되고, 조건식이 false
이면 다음으로 넘어가 else if
문의 조건식을 검사한다. else if
문의 모든 조건식이 false
라면, 나머지 경우를 의미하는 else
블록이 실행된다.
if(조건식1) {
//조건식1이 참이라면, 실행되는 블록이다.
}
else if (조건식2) {
//조건식1이 참이 아니면서 조건식2가 참일 때, 실행되는 블록이다.
}
else {
//조건식1과 2가 모두 참이 아닐 때, 실행되는 블록이다.
//else문은 생략 가능하다.
}
switch
문도 if
문과 마찬가지로 조건 제어문이다. 하지만 switch
문은 if
문처럼 조건식이 true
일 경우에 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.
package com.company;
import java.util.Scanner;
public class Main {
static Scanner myInput = new Scanner(System.in);
public static void main(String[] args) {
String dice = myInput.nextLine(); //주사위 번호 입력
switch (dice) {
case "1":
System.out.println("1번");
break; //다음 case를 실행하지 않고, switch문 탈출!
case "2":
System.out.println("2번");
break;
case "3":
System.out.println("3번");
break;
case "4":
System.out.println("4번");
break;
case "5":
System.out.println("5번");
break;
case "6":
System.out.println("6번");
break;
default: //switch문의 괄호 안 값과 같은 값이 없으면, 여기서 실행문 실행
System.out.println("없는 숫자! " + dice);
break;
}
}
}
switch
문은 괄호 안의 값과 동일한 값을 갖는 case
로 가서 실행문을 실행한다. 그러나 만약 괄호 안의 값과 동일한 값을 갖는 case
가 없으면 default
로 가서 실행문을 실행한다(default는 생략 가능하다).
위의 예시 코드에서는 num
의 값과 case
의 번호가 같으면 해당 case
안의 실행문을 실행하고 실행이 완료되면 break
를 통해서 switch
문을 탈출한다. 주의할 점은, break
문을 작성하지 않으면 switch
문을 탈출하지 않고 모든 case
문을 실행하게 되어 원하는 방식으로 동작하지 않는다는 것이다(이를 fall through라고 한다).