연산자는 '연산을 수행하는 기호'를 말한다.
EX) X + 3 을 보면 (+,-,*,/) 이것을 우리는 연산자라고 부르며
보기에 X 와 3 은 피연산자라고 부른다.
종류 | 연산자 | 설 명 |
---|---|---|
산술 연산자 | + , - , * , / , % , << ,>> | 사칙 연산과 나머지 연산(%) |
비교 연산자 | > , < , >= , <= , == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && ,\\ , ! , & , \ ,^ , ~ | '그리고(AND)와 '또는(OR)'으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ? : instanceof | 형변환 연산자, 삼향 연산자, instanceof연산자 |
위에 표는 기본적으로 알아야하는 연산자이며
피연산자의 개수로 연사자를 분류하기도 한다, 피연산자의 개수가 하나면
👌'단항 연산자' 👌두개면 '이항 연산자 ' , 👌세 개면 '삼항 연산자'라고 부른다.
대부분의 연산자는 '이항 연산자'이다.
식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산순서가 결정된다. 곱셈과 나눗셈(* , /)은 덧셈과 뺄셈(+,-) 보다 우선순위가 높다는 것은
우리가 이미 수학에서 알고있는 부분이다
식 | 설명 |
---|---|
-x + 3 | 단항 연산자가 이항 연산자보다 우선순위가 높습니다. 그래서 x의 부호를 바꾼 다음 덧셈이 수행 됩니다. 여기서 '-'는 뺄셈 연산자가 아니라 부호 연산자 입니다. |
x + 3 * y | 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다. 그래서 '3 * y' 가 먼저 계산된다. |
x + 3 > y - 2 | 비교 연산자 (>) 보다 산술 연산자 '+'와 '-'가 먼저 수행된다. 그래서 'x + 3'과 'y -2 '가 먼저 계산된다. 그리고 다음에 '>'가 수행된다. |
x > 3 && x < 5 | 논리 &&(연산자)보다 비교 연산자가 먼저 수행된다. |
result = x + y * 3; | 대입 연산자는 연산자 중에서 제일 우선순위가 낮다. |
우선순위가 같다고 해서 아무거나 먼저 처리하는 것은 아니고 나름대로의 규칙을 가지고 있다. 그 규칙에대해서 알아보자
3 + 4 - 5 라는 식이 있다고 생각해보자
이런 수식의 결합방향은 왼쪽에서 오른쪽으로 진행된다.
x = y = 3
대입 연산자는 연산자의 결합규칙이 오른쪽에서 왼쪽이므로
오른쪽 부터 왼쪽으로 시작된다.
이걸 정리하면
- 산술>비교>논리>대입 대입은 제일 마지막에 수행된다.
- 단항(1) > 이항(2) > 삼항(3) 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
class Ex3_1 {
public static void main(String[] args) {
int x, y;
x = y = 3;
System.out.println("x="+ x);
System.out.println("y="+ y);
}
}
증감 연산자는 피연산자에 저장된 값을 1증가 또는 감소시킨다. 증감 연산자의 피연산자로 정수와 실수 모두 가능하지만, 상수는 값을 변경할 수 없으므로 불가능하다.
public class Ex3_2 {
public static void main(String[] args) {
int i = 5 , j = 0;
j = i++; //후위형
System.out.println("j=i++ 실행후, i ="+ i +",j ="+j);
i=5;
j=0;
j = ++i; //전위형
System.out.println("j=++i; 실행후 ,i="+i+",j="+j);
}
}
부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환한다.
부호 연산자 +는 하는 일이 없으며, 쓰이는 경우도 거의 없다.
부호 연사자는 boolean형과 char형을 제외한 기본형에만 사용 할 수 있다.
public class Ex3_4 {
public static void main(String[] args) {
int i = -10;
i = +i;
System.out.println(i);
i = -10;
i = -i;
System.out.println(i);
}
}
형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말한다.
여기서 사용되는 괄호()는 '캐스트 연산자' or '형변환 연산자라고 부른다
예를들어 다음과 같은 코드가 있을 때
double a = 89.4
int score = (int)a;
- int score -> (int)a; -> int score = (int)89.4; -> int score = 89;
이런식으로 변환한다고 생각하면 된다.
변환 수식 결과 int -> char (char)65 'A' char -> int (int)'A' 65 float -> int (int)1.6f 1 int -> float (float)10 10.0f
public class Ex3_5 {
public static void main(String[] args) {
double d = 85.4;
int score = (int) d;
System.out.println("score=" + score);
System.out.println("d=" + d);
}
}
서로 다른 타입 간의 대입이나 연산을 할 때, 먼저 형변환으로 타입을 일치시키는 것이
원칙이다 but, 경우에 따라 편의상의 이유로 형변환을 생략할 수 있다.
그렇다고 안하는 것은 아니고, 컴파일러가 생략된 형변환을 자동적으로 추가해준다.
flaot f = 1234; // float f = (float)1234;에서 (float)가 생략되었다.
* 위의 문장에서 우변은 int 타입의 상수이고, 이 값을 저장하려는 변수의 타입은
float 이다 , 서로 타입이 달라서 형변환이 필요하지만 편의상 생략 하였다.
float 타입의 변수는 1234라는 값을 저장하는데 아무런 문제가 없기 때문이다.
그러나 , 다음과 같이 변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하려는
경우에는 형변환을 생략하면 에러가 발생한다.
byte b =1000; // 에러이다. 그 이유는 byte타입의 범위는 (-128~127)이다.
위처럼 "기존의 값을 최대한 보존 할 수 있는 타입으로 자동 형변환된다."
byte (1byte) -> | short , char (2byte) -> | int (4byte) -> | long (8byte) -> | float (4byte) -> | double (8byte) |
---|
7개의 기본형을 왼쪽부터 오른쪽으로 표현할 수 있는 값의 범위가 작은 것부터 큰 것의 순서로 나열한 것이다.
사칙 연산자 , 아마도 프로그래밍에서 가장 많이 사용되는 연산자들 일 것이다.
우리가 흔히 알고있는 사칙연산을 가르키며 곱셈(*), 나눗셈(/), 나머지(%) ,덧셈(+) , 뺼셈(-) 연산자보다 우선순위가 높으므로 먼저 처리된다.
public class Ex3_6 {
public static void main(String[] args) {
int a = 10;
int b = 4;
System.out.printf("%d + %d = %d%n", a , b , a+b);
System.out.printf("%d - %d = %d%n", a , b , a-b);
System.out.printf("%d * %d = %d%n", a , b , a*b);
System.out.printf("%d / %d = %d%n", a , b , a/b);
System.out.printf("%d / %f = %f%n", a ,(float)b , a/(float)b);
}
}
위처럼 사칙 연산자를 이용하여 다양한 결과 값을 얻을 수 있다
일반적으로는 타입이 같은 경우 같은 결과 값도 같은 타입을 얻으며
만약 int/float를 한다고 가정했을 때 좀 더 범위가 큰 float형으로
일치시키고 연산을 수행한다. 잘 알아두자.