연산자의 종류
종류 | 연산자 | 설명 | |||
---|---|---|---|---|---|
산술 연산자 | + - * / & « » | 사칙연산과 나머지 연산 | |||
비교 연산자 | > < ≤ ≥ == ≠ | 크고 작음과 같고 다름을 비교 | |||
논리 연산자 | && | ! & | ^ ~ | 그리고와 또는으로 조건을 연결 | |
대입 연산자 | = | 우변의 값을 좌변에 저장 | |||
기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof 연산자 |
단항 연산자
증감연산자 ++ —
- 증감 연산자는 피연산자에 저장된 값을 1증가 또는 감소 시킨다.
증가 연산자(++) 피연산자의 값을 1 증가시킨다. 감소 연산자(—) 피연산자의 값을 1 감소시킨다.
피연산자의 왼쪽에 위치하면 전위형(prefix), 오른쪽에 위치하면 후위형(postfix)라고 한다.
타입 | 설명 | 사용예 |
---|---|---|
전위형 | 값이 참조되기 전에 증가시킨다. | j= ++i; |
후위형 | 값이 참조된 후에 증가시킨다. | j= i++; |
전위/후위 연산자의 예제
1
2
3
4
5
6
7
8
9
10
11
class OperatorEx1 {
public static void main(String args[]) {
int i=5;
i++; // i=i+1;과 같은 의미이다. ++i;로 바꿔 써도 결과는 같다.
System.out.println(i);
i=5; // 결과를 비교하기 위해 i값을 다시 5로 변경.
++i;
System.out.println(i);
}
}
- 식을 계산하기 위해서는 식에 포함된 변수의 값을 읽어 와야 하는데, 전위형은 변수의 값을 먼저 증가시킨 후에 변수의 값을 읽어오는 반면, 후위형은 변수의 값을 먼저 읽어온 후 증가시킨다.
증감 연산자를 사용하면 코드가 간결해지지만 지나치면 코드가 복잡해져 이해하기가 어렵다.
부호 연산자
- 부호 연산자 ‘-’는 피연삱의 부호를 반대로 변경한 결과를 반환한다.
비교 연산자
두 피연산자를 비교하는데 사용되는 연산자며, 연산결과는 오직 true
와 false
를 반환한다.
등가비교 연산자
- 두 피연산의 값이 같은지 또는 다른지를 비교하는 연산자(==, ≠)
- 기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의 주소값을 저장하기 때문에 두 개의 피연산자가 같은 객체를 가리키고 있는지를 알 수 있다.
- 기본형과 참조형은 서로 형변환이 불가능하므로 등가비교로 기본형과 참조형은 비교할 수 없다.
등가비교 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class OperatorEx22 {
public static void main(String args[]) {
float f = 0.1f;
double d = 0.1;
double d2 = (double)f;
System.out.printf("10.0==10.0f %b\n", 10.0==10.0f);
System.out.printf("0.1==0.1f %b\n", 0.1==0.1f);
System.out.printf("f =%19.17f\n", f);
System.out.printf("d =%19.17f\n", d);
System.out.printf("d2=%19.17f\n", d2);
System.out.printf("d==f %b\n", d==f);
System.out.printf("d==d2 %b\n", d==d2);
System.out.printf("d2==f %b\n", d2==f);
System.out.printf("(float)d==f %b\n", (float)d==f);
}
}
1
2
3
4
5
6
7
8
9
10
//실행결과
10.0==10.0f true
0.1==0.1f false
f =0.10000000149011612
d =0.10000000000000000
d2=0.10000000149011612
d==f false
d==d2 false
d2==f true
(float)d==f true
실행결과에서 d==f에서 false가 나온것을 볼 수 있다. 10.0 == 10.0f는 true로 나왔지만, 0.1 == 0.1f는 false가 나왔다. 이 이유는 정수형과 달리 실수향은 근사값으로 저장되기 때문에 오차가 발생했기 때문이다.
0.1f는 저장할때 2진수로 변환하는 과정에서 오차가 발생한다. 따라서 dobule형과 float형을 비교할때 false가 나온다.
따라서 float형과 double형을 비교할때는 double형을 float형으로 형변환 후 비교해야 한다.
문자열의 비교
두 문자열을 비교할 때는 비교 연산자==대신 equals()
라는 메서드를 사용해야 한다. 비교 연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐이므로, 문자열의 내용이 같은지 비교하기 위해서는 equals()
를 사용하는 것이다.
문자열 비교 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class OperatorEx23 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
System.out.printf("\"abc\"==\"abc\" ? %b%n", "abc"=="abc");
System.out.printf(" str1==\"abc\" ? %b%n", str1=="abc");
System.out.printf(" str2==\"abc\" ? %b%n", str2=="abc");
System.out.printf("str1.equals(\"abc\") ? %b%n", str1.equals("abc"));
System.out.printf("str2.equals(\"abc\") ? %b%n", str2.equals("abc"));
System.out.printf("str2.equals(\"ABC\") ? %b%n", str2.equals("ABC"));
System.out.printf("str2.equalsIgnoreCase(\"ABC\") ? %b%n", str2.equalsIgnoreCase("ABC"));
}
}
1
2
3
4
5
6
7
8
//실행결과
"abc"=="abc" ? true
str1=="abc" ? true
str2=="abc" ? false
str1.equals("abc") ? true
str2.equals("abc") ? true
str2.equals("ABC") ? false
str2.equalsIgnoreCase("ABC") ? true
str2와 “abc”의 내용이 같은데도 “==”로 비교하면, false를 결과로 얻는다. 내용은 같지만 서로 다른 객체라서 false를 반환한다. 그러나 equals()
는 객체가 달라도 내용이 같으면 true를 반환한다. 그래서 문자열을 비교할 때는 항상 equals()
를 사용해야 한다.
equalsIgnore()
는 대소문자를 구분하리 않고 구별할 때 사용한다.