자바의 정석

자바의 정석 3장

그zi운아이 2023. 6. 1. 21:12
 

이 글은 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