[자바의 정석]연산자

YJS·2023년 11월 14일
0
종류연산자설명
산술 연산자+ = * / % << >>사칙 연산과 나머지 연산
비교 연산자> < ≥ ≤ == ≠크고 작음과 같고 다름
논리 연산자&&
대입 연산자=우변의 값을 좌변에 저장
기타(type) ?: instance of형변환 연산자, 삼항 연산자, instanceof 연산자

1. 산술연산자


일반 산술 변환: 연산 수행 직전에 발생하는 피연산자의 자동 형변환.

→ 두 피연산자의 타입을 같게 일치 시킴. 이때 보다 큰 타입으로 일치. 단, 피연산자의 타입이 int 보다 작은 타입이면 int 로 변환. 연산결과의 타입 역시 피연산자의 타입과 일치

e.g. int 10 / 4.0f = 2.5f // float 형으로 자동형변환

int 10 / int 4 = 2 // 연산의 결과값이 int형이므로 소수점 이하는 버려짐

→ 사칙연산의 피연산자로 숫자뿐만 아니라 문자도 가능. (문자는 실제로 해당 문자의 유니코드로 저장되기 때문) 따라서 형변환을 해주지 않아도 컴파일 시 오류가 발생하지 않음. 상수 또는 리터럴 간의 연산은 실행 과정동안 값이 변하지 않기 때문에 컴파일러가 자동으로 계산 후 결과로 대체함.

→ %(나머지 연산자): 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환. 피연산자로 0 제외한 정수만 허용.

cf. 단항 연산자-증감연산자 ++ —

증가연산자: ++ 피연산자의 값을 1 증가

감소연산자: - - 피연산자의 값을 1 감소

→ 피연산자의 왼쪽에 위치하면 전위형, 오른쪽에 위치하면 후위형

-전위형: 값이 참조되기 전에 증가시킴.

    e.g.  j = ++i // i에 1을 증가시키고 j에 저장

-후위형: 값이 참조된 후에 증가시킴.

    e.g. j = i++ // i를 j에 저장시키고 i만 1 증가

2. 비트연산자


피연산자를 비트단위로 논리 연산. 피연산자를 이진수로 표현했을때의 각 자리를 연산하며 정수만(문자 포함) 허용.

xyxyx&y
11110
10101
01101
00000

^연산자: 배타적 XOR. 피연산자의 값이 서로 다른 경우, 즉 배타적인 경우에만 참.

| 연산자: 주로 특정 비트 값을 변경할때 사용

&연산자: 주로 특정 비트값을 뽑아낼때 사용

~연산자: 비트전환연산자. 부호가 반대로 전환. 1의 보수 연산자라고도함.

<<>> 연산자: 쉬프트 연산자. 피연산자의 각 자리를 이동함.

3. 관계연산자


두 피연산자를 비교하는데 사용되는 연산자. 주로 조건문과 반복문의 조건식에 사용. 결과는 오직 true와 false로 반환.

→이항 연산자로 피연산자의 타입이 다를 경우 자료형의 범위가 큰 쪾으로 자동 형변환 후 비교

-대소비교 연산자

비교연산자연산결과
>좌변 값이 크면 true, 아니면 false
<좌변 값이 작으면 true, 아니면 false
좌변 값이 크거나 같으면 true, 아니면 false
좌변 값이 작거나 같으면 true, 아니면 false

-등가 비교 연산자

비교연산자연산결과
==두 값이 같으면 true, 아니면 false
두 값이 다르면 true, 아니면 false

→ 모든 자료형에 사용 가능(참조형 포함). 기본형의 경우 변수에 저장되어 있는 값을 비교. 참조형의 경우 객체의 주소값을 저장하기 때문에 두개의 피연산자가 같은 객체를 가리키고 있는지 비교 가능.

→ 문자열을 비교할때는 사용 불가. equals 메서드 사용해야함. 비교 연산자는 두 문자열이 완전히 같은 것인지 비교할뿐 문자열의 내용은 비교 불가.

e.g. String str = new String("abc");

boolean result = str.equals("abc"); // result에 true 가 저장됨

4. 논리연산자


||(OR 결합): 피연산자 중 어느 한 쪽만 true이면 true

&&(AND결합): 피연산자 양쪽 모두 true 여야 true

xyx
truetruetruetrue
truefalsetruefalse
falsetruetruefalse
falsefalsefalsefalse

cf. && 연산자가 || 연산자보다 우선순위가 높음.

  • 효율적인 연산 가능

→ or 연산의 경우 두 피연산자 중 어느 한쪽만 참이어도 연산 결과가 참이므로 좌측 피연산자가 참일 경우 우측 값을 평가 하지 않음.

→and 연산의 경우도 마찬가지로 어느 한쪽만 거짓이어도 거짓이므로 좌측 피연산자가 거짓이면 우측 값은 평가 하지 않음.

논리부정 연산자 !

x!x
truefalse
falsetrue

→피연산자가 true이면 false를, false이면 true를 반환.

5. Instance of


참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instance of 연산자를 사용

주로 조건문에 사용되며, instance of의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치.

연산의 결과로 boolean값인 true, false 중의 하나를 반환. instance of를 이용한 연산결과가 true이면 참조변수가 검사한 타입으로 형변환이 가능.

값이 null인 참조변수에 대해 instance of 연산을 수행하면 false 반환.

class Test {
  ...
}

class Test2 extends Test{
  ...
}

class Operator{
    public static void main(String[] args) {
        Test obj1 = new Test();
        Test obj2 = new Test2();
        System.out.println(obj1 instanceof Test);    // true
        System.out.println(obj1 instanceof Test2);   // false
        System.out.println(obj2 instanceof Test);    // true, 상속 관계이기 때문?
        System.out.println(obj2 instanceof Test2);   // true
        System.out.println(null instanceof Object);  // false
    }
}

6. assignment(=) operator


대입연산자는 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용.

→ 오른쪽 피연산자(rvalue)의 값을 왼쪽 피연산자(lvalue)에 저장.

→rvalue는 변수, 식, 상수 모두 가능

→lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야함. 리터럴이나 상수는 불가

cf. 복합 대입연산자

op==
i += 3;i = i + 3;
i -= 3;i = i - 3;
i *= 3;i = i * 3;
i /= 3;i = i / 3;
i %= 3;i = i % 3;
i <<= 3;i = i << 3;
i >>= 3;i = i >> 3;
i &= 3;i = i & 3;
i ^= 3;i = i ^ 3;
i= 3;
i *= 10+j;i = i * (10+j);

7. 화살표(->) 연산자


자바에서 람다식을 사용할 때 -> 연산자를 사용.

8. 3항 연산자


조건 연산자는 조건식, 식1, 식2 모두 세개의 피연산자를 필요로 하는 삼항 연산자.

조건식 ? 식1 : 식2

→ 첫번째 피연산자인 조건식의 평가결과에 따라 true이면 식1이, false이면 식2가 반환.

→조건 연산자는 조건문인 if문으로 바꿔 쓸 수 있음.

9. 연산자 우선 순위


  1. 산술 > 비교 > 논리> 대입 연산자 순으로 수행
  2. 단항(1) > 이항(2) > 삼항(3) 순으로 수행.
  3. 단항 연산자와 대입연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽
profile
우당탕탕 개발 일기

0개의 댓글