이 글은 Java의 정석 3rd Edition을 읽고 정리한 내용입니다.
Chapter 3

연산자
1.1 연산자와 피연산자
연산을 수행하기 연산의 대상(피연산자와) 연산을 수행하고 결과를 반환할 피연산 자로 나뉜다. 연산자는(+,-,/,*)와 같은 연산자를 의미하고 피연산자는(변수,상수,리터럴,수식)등을 의미한다.
컴퓨터 구조의 연산자와 피연산자를 생각하면 이해하기 쉬운 것 같다.
1.2 연산자의 종류
연산자는 크게 산술,비교,논리,대입,기타 연산자로 나눌수 있다.
산술 연산자: 기본적인 사친 연산과 나머지 연산을 담당한다(+,-,*,/,%,<<,>>)
비교 연산자:크고 작음 또는 같고 다름을 비교한다.(>, <, >=, <=, ==,!=)
논리 연산자:AND와 OR로 조건을 연결시킨다.(&&,||,!,&,|,~,^)
대입 연산자:우변의 값을 좌변에 저장하는데 이용된다.(=)
기타 연산자:instanceof연산자 등
1.3 연산자의 우선순위와 결합규칙
산술>비교>논리>대입 순의 우선순위를 가지고 있다.
단한 > 이항 > 삼항 순의 우선순위를 가지고 있다.
단항 연산자와 대입연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
1.4 산술변환
이항 연산자의 두 피연산자의 타입이 일치해야 연산이 가능하다.
두 연산자의 타입 중에 큰 타입으로 일치시킨다.(데이터 손실 우려)
short와 byte의 연산의 경우 int타입으로 형변환 된다.(자바의 기본 크기가 4byte)
쉬프트 연산자와,증감 연산자는 산술변환에서 제외된다.
2.1 증감 연산자
증감 연산자(++) 피연산자의 값을 1 증가시킨다.
감소 연산자(--) 피연산자의 값을 1 감소시킨다.
2.2 산술 연산자
int a = 1_000_000;
int b =,2_000_000;
long c = a * b;
System.out.printlb(c)
위 코드의 결과를 long 타입 c 가 받기 때문에 3000000000000이라고 생각 할 수 있다. 하지만 곱셈 연산의 과정에서 오버플로우가 발생하기 때문에 예상과 다른 결과값이 나온다.
원하는 결과값을 얻기 위해선 곱셉연산 전에 long타입 형변환 후 연산하면 된다. long c = (long)a * (long)b
char a = 'a';
char d = 'd';
char zero = '0';
char two = '2';
System.out.printf("'%c' - '%c' = %d%n,d,a,d-a);
System.out.printf("'%c' - '%c' = %d%n,two,zero,two-zero);
System.out.printf("'%c' = %d%n,,a,(int)a);
System.out.printf("'%c' = %d%n,d,(int)d);
System.out.printf("'%c' = %d%n,zero,(int)zero);
System.out.printf("'%c' = %d%n,two,(int)two);
결과
'd' - 'a' = 3
'2' - '0' = 2
'a' = 97
'd' = 100
'0' = 48
'2' = 50
문자 또한 유니코드로 바뀌어 저장되므로 문자 또한 사칙연산이 가능하다.
문자 '2'는 유니코드 50이고 문자 '0'은 유니코드 48임으로 2라는 결과를 얻을 수있다. 때문에 문자에서 '0'을 뺴는 연산으로 정수로 변환이 가능하다.
2.3 비교 연산자
두 피 연산자를 비교하는데 사용되는 연산자 이다.
판리녕 true를 거짓이면 false를 결과로 반환한다.
크케 대소비교 연산자와 등가비교 연산자로 나뉜다.
대소비교 연산자 : 두 피연산자의 값의 크기를 비교하는 연산자.
등가비교 연산자. 두 피연산자의 값이 같은지 또는 다른지 빅하는 연산자.
2.3.1문자열의 비교
문자열은 기본 변수가 아닌 참조변수의로 값이 아닌 주소를 가리키고 있다 따라서 등가비교 연산자로는 서로 같은지 다른지 비교 할 수 없다.
equals는 object 객체가 제공하는 메소드로 객체를 비교할때는 == 이 아닌 eqauls 메소드를 사용해야 한다.
최상위 객체인 object가 eqauls 함수를 제공한다. 하지만 문자열의 eqauls는 오버라이딩을 통한 정의로 인하여 기존 객체비교와는 다른 방식으로 진행된다.
String의 경우 같은 문자라도 주소가 다를 수 있지만 재정의로 인해 동일한 문자열의 확인이 가능하다.
2.4 논리 연산자
둘 이상의 조건을 연결하여 하나의 식으로 표현하게 해주는 연산자.
||(OR결합) : 피연산자중 어느 한 쪽만 true이면 true를 얻는다.
&&(AND결합) : 피연산자중 양쪽 모두 true이어야 true를 얻는다.
!(NOT연산자) 피연산자가 true이면 false로 flase이면 trur를 결과로 반환헌다.
2.5 비트 연산자
비트단위 논리 연산으로 피연산자를 이진수로 표현했을떄 값으로 연산하는 연산자.
|(OR연산자) : 피연산자중 한 쪽의 값이 1이면 1을 결과로 얻는다 그 이외는 0을 얻느다.
&(AND연산자) : 피연산자 양쪽 모두 1이여야 1을 결과로 얻는다.
^(XOR연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다.
~(비트 전환 연산자) : 2진수로 표현한 값에서 0을 1로 1을 0으로 바꾼다.
>>,<<(쉬프트 연산자) : 피연산자의 각 자리를 오른쪽 또는 왼쪽으로 이동하는 연산자(x * 2의 n승의 결과와 같다.)
2.6 삼항 연산자
세 개의 피연산자를 필요로하는 연산자 이며 조선 연산자에서 사용된다.
'자바의 정석' 카테고리의 다른 글
자바의 정석 6장 (0) | 2023.06.13 |
---|---|
자바의 정석 5장 (0) | 2023.06.06 |
JVM 메모리 구조 (0) | 2023.05.30 |
객체 지향 언어와 절차 지향 언어 (0) | 2023.05.30 |
자바의 정석 2장 (0) | 2023.05.27 |