본문 바로가기

Java

[자바의 신] 연산자?

자바에는 여러가지 종류의 연산자가 있다.

  • 기본연산자
  • 복합 대입 연산자
  • 단항 연산자
  • 비교 연산자
  • 논리 연산자
  • 삼항 연산자
  • 비트 연산자(추후 업데이트)
  • instanceof(추후 업데이트)

1. 기본 연산자

 기본 연산자는 boolean을 제외한 기본 자료형을 더하거나 빼는 등의 계산을 위해 사용한다. 참조 자료형은 기본적으로 연산자를 사용할 수 없지만, 예외적으로 String클래스만 + 연산이 가능하다.

 

  • 대입 연산자(=)
    • int a = 3;
    • 왼쪽의 변수에 오른쪽의 값을 할당(대입)할때 사용.
  • 기본 연산자(+, -, *, /, %)
    • +, - : 양쪽의 값을 더하거나 뺀다. 
    • *, / : 양쪽의 값을 곱하거나 나눈다.
    • % : 왼쪽의 값을 오른쪽의 값으로 나눈 나머지 구한다.
public class BasicOperator {
    public static void main(String[] args) {
        int a = 3;
        int b = 2;
        
        System.out.println(a+b);	// 결과 : 5
        System.out.println(a-b);	// 결과 : 1
        System.out.println(a*b);	// 결과 : 6
        System.out.println(a/b);	// 결과 : 1(?)
        System.out.println(a%b);	// 결과 : 1
        
        // String +연산
        String name = "molt";
        String birth = "6월 5일";
        System.out.println(name+" "+birth);	// 결과 : molt 6월 5일
        
        // 나눗셈 연산은 실수형 타입(double, float로 처리해야 그나마 정상적으로 출력됨.)
        double a1 = 3;
        double b1 = 2;
        double result = a1/b1;
        System.out.println(result);	// 결과 : 1.5
    }

}

▷ String의 + 연산은 문자열을 '이어붙이는' 결과가 나타난다.

▷나눗셈의 경우 소수형태의 자료형(double, float)으로 계산해야 일반적으로 받아들일 수 있는 결과가 나온다.

   (자바에서 이자, 돈 등 중요한 숫자 계산은 BigInteger, BigDecimal 클래스를 사용해야 정확한 계산이 가능하다.) 

 

2. 복합 대입 연산자

 복합 대입 연산자(+=, -=, *=, /=, %=)는 자기 자신의 값에 특정 값을 더할 필요가 있는 경우에 사용한다. 이 연산자를 사용하면 계산을 간단하게 표현할 수 있다.

public class CompoundAssignmentOperator{
    public static void main(String[] args) {
        int a = 2;
        
        // 변수에 2를 더해라.
        // a = a+2;
        a += 2;
        System.out.println(a); // 2+2 = 4
        
        // 변수에 2를 빼라.
        // a = a - 2;
        a -= 2;
        System.out.println(a); // 4-2 = 2
        
        // 변수에 2를 곱해라.
        // a = a * 2;
        a *= 2;
        System.out.println(a); // 2*2 = 4
        
        // 변수를 2로 나눠라.
        // a = a / 2;
        a /= 2;
        System.out.println(a); // 4/2 = 2
        
        // 변수를 2로 나눈 나머지를 구해라.
        // a = a % 2;
        a %= 2;
        System.out.println(a); // 2/2 = 1 나머지 0
        
        String str = "문자열";
        str += "은 이렇게";
        System.out.println(str); // 문자열은 이렇게
    }
}

▷ 앞에서 String은 + 연산이 된다고 했는데, 복합 대입 연산자도 당연히 된다. 

 

3. 단항연산자

 앞서 배운 기본 연산자나 복합대입연산자는 연산자 앞뒤에 있는 두개의 피연산자를 사용한다. 하지만 여기서 볼 단항 연산자(+, -, ++, --, !)는 피연산자가 하나만 존재한다. 

public class UnaryOperator{
    public static void main(String[] args){
    	int value = 1;
        
        // +, -
        System.out.println(+value);	// 1
        System.out.println(-value); // -1
        
        // ++, --
        int value2 = 1;
        System.out.println(value2++); // 1
        System.out.println(value2);	  // 2
        System.out.println(++value2); // 3
        
        System.out.println(value2--); // 3
        System.out.println(value2);	  // 2
        System.out.println(--value2); // 1
        
        // !
        boolean bool = true;
        System.out.println(bool);	// true
        System.out.println(!bool);	// false
    }
}

+나 -는 기본연산자에 있는것과 같지만, 다른 역할을 수행한다. 

    → + 는 연산자 뒤의 숫자*1, -는 연산자 뒤의 숫자*-1을 의미한다.

++나 --는 1만큼 증가하거나, 감소할 경우 사용한다. 연산자가 붙는 위치에 따라서 의미가 다르다.

    연산자가 앞에 붙으면 참조하기 전에 증가, 감소시키고, 뒤에 붙으면 참조하고 나서 증가, 감소 시킨다.

! 연산자는 boolean에서만 사용 가능하다. 어떤 계산의 결과가 boolean 일때도 사용 가능. 값을 반대로 바꾼다.

 

4. 비교연산자

 비교연산자는 등가 비교 연산자와 대소비교 연산자가 있다. 모든 비교 연산자의 결과는 boolean 이다.

 

  • 등가비교연산자(==, !=)
    • 기본 자료형과 참조 자료형에서 사용 가능함.
    • 기본 자료형은 같은 종류끼리 비교가 가능하다. 자료형이 다른 숫자(long vs int)끼리도 비교가 가능하다. 하지만 boolean vs int 와 같은 형식으로 사용 할수 없다.
    • 참조 자료형은 그 주소값이 같은지 확인한다.
  • 대소비교연산자(>, >=, <, <=)
    • boolean이나 참조 자료형에는 사용할 수 없다.
public class CompareOperator {
	public static void main(String[] args) {
    	// 등가 비교 연산자 != , ==
        int a = 13;
        long b = 13L;
        if(a == b) {
            System.out.println("같다!"); // 타입은 다르지만 숫자끼리 비교 가능.
        } else {
            System.out.println("다르다!");
        }
		
        // 참조자료형(문자열 비교)
        String str1 = "문자열";
        String str2 = new String("문자열");

        System.out.println(str1); // 문자열
        System.out.println(str2); // 문자열

        if(str1 == str2) {
            System.out.println("같다!");
        } else {
            System.out.println("다르다!"); // 같지 않다는 결과?!
        }
    }
}

▷등가비교 연산자 ==, !=는 참조 자료형의 경우 그 주소값을 비교한다. str1과 str2는 그 값은 "문자열"로 같지만, 메모리상의 주소가 다르기 때문에 다르다는 결과가 나온다.(String Pool과 heap 영역)

 

5. 논리 연산자

  • 논리 연산자(&&, ||, &, |, ^)
    • && : 연산자 양쪽의 조건이 모두 true일때, true임. 왼쪽의 값이 false이면 오른쪽은 검사하지 않음.
    • || : 연산자 양쪽의 조건중 하나라도 true이면, true임. 왼쪽의 값이 true이면 오른쪽 값은 검사하지 않음.
    • &, |, ^ : 이 연산자들은 숫자에 쓰면 비트연산, boolean에 쓰면 논리연산을 수행.
    • & : 연산자 양쪽의 조건이 모두 true일때, true임. 왼쪽의 값이 false이더라도 오른쪽 조건을 검사함. 양쪽의 값을 비교하는 비트연산자 이기 떄문
    • | : 연산자 양쪽의 조건중 하나라도 true이면, true임. 왼쪽의 값이 true이더라도 오른쪽 조건을 검사함. 양쪽의 값을 비교하는 비트연산자 이기 때문
    • ^ : 두 조건이 서로 다를경우 true, 모두 true 이거나 false이면 false. 두 조건의 일치여부까지 검사.
public class LogicOperator {
    public static void main(String[] args) {
    	LogicOperator logicOperator = new LogicOperator();
        
        // &&
        if( logicOperator.isFirst(true) && logicOperator.isSecond(false) ){
            System.out.println("들어옴!");
        } else {
            System.out.println("안 들어옴!");
        }

        // ||
        if( logicOperator.isFirst(true) || logicOperator.isSecond(false) ){
            System.out.println("들어옴!");
        } else {
            System.out.println("안 들어옴!");
        }
        
        // &
        if( t.isFirst(true) & t.isSecond(true) ){
            System.out.println("들어옴!");
        } else {
            System.out.println("안 들어옴!");
        }

        // |
        if( t.isFirst(true) | t.isSecond(false) ){
            System.out.println("들어옴!");
        } else {
            System.out.println("안 들어옴!");
        }

        // ^
        if( t.isFirst(true) ^ t.isSecond(true) ){
            System.out.println("들어옴!");
        } else {
            System.out.println("안 들어옴!");
        }
        
    }
    
    public boolean isFirst (boolean result){
        System.out.println("isFirst called!");
        return result;
    }

    public boolean isSecond (boolean result){
        System.out.println("isSecond called!");
        return result;
    }
}

▷ 거의 대부분의 경우 &&, ||를 사용함.

 

 

6. 삼항 연산자

변수 = (조건식, boolean) ?  true 일때 : false 일때;

 변수에 값을 할당할 때 사용한다. = 뒤의 조건식은 반드시 boolean 값을 반환해야 한다. 조건식의 true, false 여부에 따라서 ? 우측의 블록을 선택적으로 실행한다. 삼항연산자를 사용하면 코드 한줄로, 특정 조건에 따라서 변수에 다른 값을 할당할 수 있다.

public class TernaryOperator{
    public static void main(String[] args) {
    	String cham = (true) ? "참!" : "거짓!";
        System.out.println(cham);    // 참!
        String geojit = (false) ? "참!" : "거짓!";
        System.out.println(geojit);  // 거짓!
    }
}

 

※ 자바의 계산 순서

 자바에는 연산자의 우선순위가 있다.

연산자 기호 우선순위
단항연산자 +, -, ++, --, !, ~ 1
산술연산자 *, /, % 2
+, - 3

 우선순위가 높은 순서로 먼저 계산되지만, 아무리 연산 우선순위가 있어도, 괄호보다 높지는 않다. 헷갈리면 괄호 치는 습관을 들이는게 좋다.

public class CalcOrder {
    public static void main(String[] args) {
    	System.out.println(1+2*3);    // 7
        System.out.println((1+2)*3);  // 9
    }
}