JAVA

연산자

mukom 2022. 8. 18. 19:47

1. 산술 연산자

연산자   설명
+ 단항 부호 연산자 int a = +10 양수를 표현하며 부호를 유지할 때 사용한다.
변수에 적용하기 위해서는 대입 연산자(=)와 함께 쓰여야 한다.
이항 더하기 연산자 10 + 20 두 개의 피연산자(숫자)의 값을 합한다.
문자열 연결 "ab" + "cd" 두 개의 피연산자(문자열)을 연결하여 새로운 문자열을 만든다.
- 단항 부호 연산자 int b = -10 음수를 표현하며 부호를 바꿀 때 사용할 수 있다.
+ 연산자와 마찬가지로 대입 연산자와 함께 쓰여야 한다.
이항 빼기 연산자 10 - 20 두 개의 피연산자(숫자)의 값을 뺀다.
* 이항 곱하기 연산자 10 * 20 두 개의 피연산자(숫자)의 값을 곱한다.
/ 이항 나누기 연산자 10 / 20 두 개의 피연산자(숫자)를 나눈 값의 몫을 나타낸다.
% 이항 나머지 연산자 10 % 20 두 개의 피연산자(숫자)를 나누고 남은 값을 반환한다.

     ✍️ Infinity과 NaN(not a number)

           정수형 타입의 피연산자 중 '0'이 분모로 들어가 연산하게 되면 ArithmeticException이 발생한다. 

           이러한 경우는 try - catch 로 예외처리를 하게 되면 해결할 수 있다.

           하지만 실수형 연산의 경우는 Exception이 발생하지 않고 다른 결과가 나타난다.

           '0.0'으로 나누게 될 결우에는 Infinity, '0.0'으로 나머지를 구할 경우에는 NaN가 출력된다.

           이 값은 연산에서 사용할 수 없기 때문에 실수형 연산은 Double.inInfinite 또는 Double.isNaN 메서드로 유효값을 확인해야 한다.

 

     ✍️ 산술 연산에서의 형변환

            🔹 int 타입보다 작은 타입 간의 연산 시 int 타입으로 자동 변환되어 결과가 int 타입으로 반환된다.

                  👉 byte + byte = (int)byte + (int)byte = int

                  👉 byte + short = (int)byte + (int)short = int

                  👉 short + short = (int)short + (int)short  = int

 

            🔹 int 타입 이상의 타입과 연산 시 큰 타입으로 자동 변환되어 연산 결과가 반환된다. 

                  👉 char + int = (int)char + int = int

                         🖍 char 타입으로 다시 결과를 받고 싶다면 결과값에 임의로 (char)int 형변환을 해야 한다. 

                  👉 char + char = (int)char + (int)char = int

                  👉 byte + long = (long)btye + long = long

                  👉 long + float = (float)long + float = float

 

             🔹 이항 나누기 연산 시에 소수점까지 출력하려면 최소 하나의 피연산자를 실수형으로 변환하면 된다.

                   👉 10 / 3 : int / int = int (소수점 출력 안 됨)

                   👉 10 / 3f : int / float = float (실수형 리터럴 접미사 f)

                   👉 10 / (float)3 : int / float = float (형변환)

                   👉 10 / 3.0 : int / double = double (소수점)

 


2. 비트 연산자

연산자   설명
& and 연산자 두 개의 피연산자를 이진수로 변환하였을 때 1이 대응하면 1을 반환하고, 아닌 경우 0을 반환한다.
| or 연산자 1이 한 쪽이라도 있으면 1을 반환하고, 아닌 경우 0을 반환한다.
^ xor 연산자 서로 다르면 1을 반환하고, 같은 경우 0을 반환한다.
~ not 연산자,
1의 보수
각 자리의 비트가 1이면 0을, 0이면 1을 반환한다.
<< left shift  N << M : N의 이진수를 M만큼 왼쪽으로 밀고 난 공간에 0을 채워 넣는다.
>> right shift N >> M : N의 이진수를 M만큼 오른쪽으로 밀고 난 공간에 0을 채워 넣는다.
다만, N이 음수인 경우는 부호 비트 자리에 1을 채워 넣는다.
>>>   양수만 고려한 right shift 연산으로, 0만 채워 넣는다.

 


3. 관계 연산자

연산자
  설명
> N > M N이 M보다 크면 참(true), 아니면 거짓(false)을 반환한다.
< N < M N이 M보다 작으면 참(true), 아니면 거짓(false)을 반환한다.
>= N >= M N이 M보다 크거나 같으면 참(true), 아니면 거짓(false)을 반환한다.
<= N <= M N이 M보다 작거나 같으면 참(true), 아니면 거짓(false)을 반환한다.
== N == M N과 M의 값이 같으면 참(true), 아니면 거짓(false)을 반환한다.
!= N != M N과 M의 값이 다르면 참(true), 아니면 거짓(false)을 반환한다.

     🖍 결과는 모두 boolean 타입의 값으로 true 또는 false로 반환된다.

           👉 boolean result = a > b; 이런 식으로 연산의 결과를 boolean 타입 변수에 저장할 수도 있다.

 

     ✍️ 다양한 타입 간의 관계 연산

           🔹char 타입 간의 관계 연산의 경우에는 유니코드로 변경하여 연산이 수행된다.

                👉 'A' > 'B'   // 65 > 66 = false

            

           🔹int 타입 이하의 타입 간의 연산 시 int 타입으로 자동 형변환 되어 연산한다.

                👉 (int)'A' == 65    //  65 == 65

    

           🔹두 피연산자 중 큰 타입의 피연산자로 자동 형변환 된다.

                👉 (double)3 == 3.0   // 3.0 == 3.0

 

           🔹실수 타입 간의 관계 연산에서는 정확도의 문제가 발생한다. 

                👉 0.1 == 0.1f // false

                👉 피연산자를 정수 타입으로 변환하여 연산을 수행하면 해결된다.

 

 

     ✍️ == 연산자와 equals()

           == 연산자는 주소값을 비교하는 연산자이고, equals()는 실제 저장된 값을 비교하는 메서드이다. 

// 기본형 타입 변수
int a = 10;
int b = 10;
int c = 20;

System.out.println(a==b);    //true
System.out.println(a==c);    //false
// 참조형 타입 변수
String a = "str";
String b = a;
String c = new String("str");
String d = new String("str");

System.out.println(a == b);            //true
System.out.println(a.equals(b));    //true
System.out.println(c == d);            //false
System.out.println(c.equals(d));    //true

           String literal로 생성된 a와 b 객체는 String constant pool의 중복된 객체를 바라보고 있기 때문에,

           == 연산에서의 주소값이 같기 때문에 true가 반환되고, equals()에서의 저장된 값도 같기 때문에 true가 반환되는 것이다.

           하지만 c와 d는 new 연산자를 통해 생성된 객체로 힙 영역에 개별적으로 존재하는 객체이기 때문에,

           == 연산에서 주소값이 다르기에 false를 반환하게 되는 것이다. 

           하지만 equals()를 통해서는 실제 저장된 값을 비교할 수 있기 때문에 true로 반환된다.

 


4. 논리 연산자

연산자 설명
&& and 연산자 피연산자의 결과가 모두 true인 경우에만 true를 반환한다.
|| or 연산자 피연산자 중 한 쪽만 true이면 true를 반환한다.
^ xor 연산자 피연산자의 결과가 서로 달라야 true를 반환한다.
! 부정 연산자 피연산자의 결과를 반대하는 값을 반환한다.

 

 

     🖍 || 연산자는 피연산자 중 어느 한 쪽이 true를 반환하기만 하면 조건이 충족되기 때문에

           이러한 특징으로 인하여 좌변의 피연산자가 true를 반환하면 우변의 피연산자는 실행되지 않는 경우가 있다.

 


5. 대입 연산자

    

   5-1. 대입 연산자 

          = 연산자는 우변의 리터럴을 좌변에 저장하는 역할을 한다.

          모든 연산자 중에서 우선순위가 가장 낮다.

 

   5-2. 복합 대입 연산자

           대입 연산자는 산술 연산자와 함께 쓰일 수 있다. 

           복합 대입 연산자를 사용하면 연산 과정에서 자동 형변환이 일어나지 않는다는 특징이 있다.

// 10을 a에 저장
int a = 10; 

// a의 저장된 값(10)을 b에 저장
int b = a; 

// a + b 의 결과를 a 에 저장
a += b; // a = a + b; 와 동일

// a - b 의 결과를 a 에 저장
a -= b; // a = a - b; 와 동일

// a * b 의 결과를 a 에 저장
a *= b; // a = a * b; 와 동일

// a / b 의 결과를 a 에 저장
a /= b; // a = a / b; 와 동일
      
// a % b 의 결과를 a 에 저장
a %= b; // a = a % b; 와 동일

 

           ✍️ 복합 대입 연산자의 자동 형변환

                 char a = 'A' 라는 연산식이 있고, 이 a라는 변수에 +2를 더하여 대입하는 연산식을 수행해보자.

                 🔹 대입 연산자를 사용하는 경우

                       👉 a = (char)(a + 2); // C

                       👉 다시 char 타입에 대입하기 위해서는 int 타입으로 자동 형변환 된 값을 명시적으로 형변환 해야 한다.

 

                 🔹복합 대입 연산자를 사용하는 경우

                      👉 a += 2; // C

                      👉 int 타입으로 자동 형변환 되지 않기 때문에 형변환 연산자를 사용하지 않아도 된다.