자바의정석3(연산자)

min seung moon·2021년 3월 1일
1

자바의정석

목록 보기
3/8

01. 연산자 & 피연산자

  • 연산자 : 연산을 수행하는 기호(+, -, *, /, %)
  • 피연산자 : 연산자의 연산 수행 대상 (x + 3 = x, 3이 피 연산자)
  • 모든 연산자는 연산결과를 반환한다
int x = 5, y;
y = 4 * x + 3;
  = 4 * 5 + 3
  = 20 + 3
  = 23
Sytem.out.println(y); // 23
Sytem.out.println(4 * x + 3); // 23

1. 연산자의 종류

종류		연산자				설명
산술연산자	+, -, *, / , %, <<, >>		사칙 연산과 나머지 연산(%)
비교연산자	<, >, >=, <=, ==, !=		크고 작음과 같고 다름을 비교
논리연산자	&&, ||, !, &, |, ^, ~		'그리고(and)'와 '또는(or)'으로 조건을 연결
대입연산자	=				우변의 값을 좌변에 저장
기타		(type), ?:, instanceof		형변환 연산자, 삼항 연산자, instanceof연산자

2. 연산자의 우선순위

  • 하나의 식(expression)에 연산자가 둘 이상 있을때, 어떤 연산을 먼저 수행할지를 자동 결정(() 괄호로 묶어서 수동으로 정해줄 수 도 있다)

3. 연산자의 결합 규칙

  • 우선순위가 같은 연산자가 있을 때 어떤 것을 먼저?
    • 대입과 단항 연산자를 제외하면, 모두 왼쪽 -> 오른쪽

4. 연산자의 우선순위와 결합 법칙은 "세가지만 기억하자"

  • 산술 > 비교> 논리 > 대입, 대입은 제일 마지막에 수행
  • 단항(1) > 이항(2) > 삼항(3), 단항은 연산자의 우선순위가 이항 연산자보다 높다
  • 단항 연산자와 대입 연산자를 제외한 모든 연산자의 진행 방향은 왼쪽에서 오른쪽이다.

5. 증감 연산자

  • 증가 연산자(++) : 피연산자의 값을 1증가시킨다
  • 감소 연산자(--) : 피연산자의 값을 1감소시킨다
  • "증감 연산자가 독립적으로 사용된 경우, 전휘형과 후위형의 차이가 없다"
타입		설명				사용예
전위형		값이 참조되기 전에 증가시킨다	j = ++1;
후위형		값이 참조된 후에 증가시킨다		j = i++;
j = ++i; // 전위형, 식을 풀 때 위로
++i;
j = i;

j = i++; // 후위형, 식을 풀 때 아래로
j = i;
i++;

6. 부호 연산자

  • '-'는 피연산자의 부호를 반대로 변경
  • '+'는 아무런 일도 하지 않는다(실제 사용X)

7. 형변환

  • 변수 또는 상수의 타입을 다른 타입으로 변환하는 것(피연산자에게는 영향 없음)
  • 형변환을 하는 이유는 주로 서로 다른 두 타입을 일치시키기 위해서
  • 형변환을 생략하면 컴파일러가 알아서 자동저긍로 형변환을 한다
  • "기존의 값을 최대한 보존할 수 있는 타입으로 자동 형 변환된다"
  • 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환 된다

명시적 형변환

  • 상위 타입에서 하위의 타입으로 형 변환 할 때(data 손실이 일어날수 있음)
    • (타입)피연산자
      • double d = 85.4;
      • int score = (int)d; //85
변환		수식		결과
int -> char	(char)65	'A'(유니코드)
char -> int	(int)'A'	65
float -> int	(int)1.6f	1
int -> float	(float)10	10.0f

암묵적(자동) 형변환

  • 하위 타입에서 상위 타입으로 형 변환 할 때
  • float f= 1234;
    • float f = (float)1234;
  • int i = 3.14f; // ERROR, float은 int보다 범위가 넓기에 자동 형 변환이 안된다
    • int i = (int)3.14f;

8. 사칙 연산자(+, -, *, /, %)

  • 연산은 값은 타입끼리 연산이 된다
    • (int) / (int) -> (int) // 소수점 이하는 버려진다
      • 10 / 4 -> 2 // 소수점 이하는 버려진다
    • (int) / (float) -> (float) / (float) -> (float) // 상위 타입으로 자동 형변환
      • 10 / 4.0f -> 10.0f / 4.0f -> 2.5f // 상위 타입으로 자동 형변환

9. 산술 변환

  • 연산 전에 피연자의 타입을 일치시키는 것
  • 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치)
    • long + int -> long + long -> long
    • float + int -> float + float -> float
    • double + float -> double + double -> double
  • 피연산자의 타입이 int보다 작은 타입이면 int로 변환 된다
    • byte + short -> int + int -> int
    • char + short -> int + int -> int
  • 유니코드 변환
    • '2' - '0' -> 2 // 문자형 숫자를 정수형 숫자로 바꿀 때는 문자형 '0'으로 빼주어야 한다
    • '2'는 유니코드 상 50이며 '0'은 유니코드 상 48이기 때문이다

10. 반올림(Math.round())

  • 실수를 소수점 첫 째자리에서 반올림한 정수를 반환
  • long result = Math.round(4.52); // 5
    • 원하는 위치에 반올림을 하고 싶은 경우 자릿수의 10의 제곱을 곱해주고 그 만큼 나눠준다
    • 3.141592 -> 3.142
      • Math.round(3.141592 * 1000) / 1000.0;
      • double pi = 3.141592;
      • double shortPi = Math.round(pi * 1000) / 1000.0
        • Math.round(3.141592 * 1000) / 1000.0
        • Math.round(3.141.592) / 1000.0
        • 3142 / 1000.0
        • 3.142

11. 나머지 연산자(%)

  • 오른쪽 피연산자로 나누고 남은 나머지를 반환
  • 나누는 피연산자는 0이 아닌 정수만 허용(부호는 무시됨)
  • int x = 10, y = 8;
  • x / y -> 1 // 몫
  • x % y -> 2 // 나머지

12. 비교 연산자(>, <, >=, <=, ==, !=)

  • 두 연산자를 비교해서 true(참) 또는 false(거짓)을 반환
비교연산자		연산결과
>			좌변 값이 크면, true 아니면 false
<			좌변 값이 작으면, true 아니면 false
>=			좌변 값이 크거나 같으면, true 아니면 false
<=			좌변 값이 작거나 같으면, true 아니면 false
==			두 값이 같으면, true 아니면 false
!=			두 값이 다르면, true, 아니면 false

13. 문자열의 비교

  • 문자열 비교에는 ==대신 equals()를 사용해야 한다
  • String str1 = "abc";
  • String str2 = "abc";
    • str1 == str2 // true
    • str1.equals(str2) // true
  • String str1 = new String("abc");
  • String str2 = new String("abc");
    • str1 == str2 // false
    • str1.equals(str2) // true

14. 논리 연산자(&&, ||)

  • 조건식을 연결 할 때 사용하는 연산자
  • ||(OR결합) : 피연산자 중 어느 한쪽이 true이면 true를 결과로 얻는다
  • &&(AND결합) : 피연산자 양쪽 모두 true이면 true를 결과로 얻는다
x		y		x||y		x&&y
true		true		true		true
true		false		true		false
false		true		true		false
false		false		false		false
  • 유니코드 논리 연산
    • 문자 ch는 숫자('0' ~ '9')이다
      • '0' <= ch && ch <= '9'
    • 문자 ch는 대문자 또는 소문자이다
      • ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')

15. 논리 부정 연산자(!)

  • true를 false로, false를 true로 변환
x	!x
true	false
false	true
  • boolean b = true;
    • !!b -> !!true -> !false -> true
  • 문자 ch가 소문자가 아니다
    • ch < 'a' || ch > 'z'
    • !('0' <= ch && ch <= '9')

16. 조건 연산자(?:, Ternary operator)

  • 조건식의 결과에 따라 연산결과를 달리한다
  • result = (x>y) ? x : y; // 괄호 생략 가능
    • ()안의 조건이 참이면 x
    • ()안의 조건이 거짓이면 y
  • result = (5 > 3) ? 5 : 3;
    -> (true)
    -> 5

17. 대입 연산자

  • 오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반환
  • int x = 3; // x에 3이 저장된다
  • x = y = 3; // y에 3이 대입되고 x에 y가 대입 된다
  • lvalue : 대입 연산자의 왼쪽 피연산자(저장공간, 변수, 배열, 상수 ...)
  • rvaluue : 대입 연산자의 오른쪽 피연산자

18. 복합 대입 연산자

  • 대입 연산자와 다른 연산자를 하나로 축약
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 = i | 3;
i *= (10 + j);		i = i * (10 + j);
profile
아직까지는 코린이!

0개의 댓글