새소식

반응형
250x250
🔠 Computer language/☕ Java

[Java] 연산자

  • -
728x90
반응형

 

연산자

 

연산자 정의, 연산자 종류

 

연산이란 프로그램에서 데이터를 처리해 결과를 산출하는 것이다.

이러한 연산 과정에 사용되는 기호연산자,

연산되는 데이터피연산자라고 한다.

 

연산자의 종류는 표와 같은데, 피연산자 수에 따라 단항/이항/삼항 연산자라고도 부른다.

여기서 단항/이항/삼항이라는 것은 피연산자가 1개/2개/3개라는 뜻이다.

 

 

 

 

연산자의 연산 방향과 우선 순위

 

연산자의 연산 방향, 우선 순위

 

연산자의 연산 방향과 우선 순위는 위와 같다.

복합적인 연산식의 경우 소괄호()를 사용하면 괄호 안의 식이 최우선 순위로 인식되어 먼저 계산된다.

 대입 연산자가 가장 나중에 실행된다는 점 정도는 기억해 두면 좋다.

 

 

 

 

연산자 - 부호 연산자


부호 연산자

 

부호 연산자음수, 양수를 나타내는 연산자다.

왼쪽 예시와 같이 변수 앞에 +를 사용할 경우 부호가 유지, -를 사용할 경우 부호가 변경된다.

 

주의할 점은 부호 연산자의 디폴트 산출 타입은 int 타입이라는 것이다.

따라서 오른쪽 예시처럼 byte 타입에 부호 연산자를 사용할 경우 에러가 난다.

 

 

 

 

연산자 - 증감 연산자

증감 연산자

 

증감 연산자 ++,--숫자를 1씩 증가/감소시키는 연산자다.

연산자가 피연산자의 앞, 뒤 어디에 붙느냐에 따라 값이 달라지는데,

피연산자 앞에 붙으면 증가/감소가 먼저 수행되고,

피연산자 뒤에 붙으면 다른 연산이 먼저 수행된 후 증가/감소가 이루어진다.

따라서 위 예시를 보면 변수 x의 값 0에 똑같이 +1을 했을 때,

x++ +1은 다른 연산이 먼저 수행되어 1이 되고,

++x +1은 증가가 먼저 이루어져 2가 된다.

 

 

 

 

연산자 - 논리 연산

 

논리 연산자

 

논리 연산자조건의 참/거짓 여부를 판별해 그에 따른 boolean 값을 산출하는 연산자다.

주로 조건문, 반복문에서 이용된다.

(&&, &)과 (||,|)의 경우 (&, |)보다 (&&,||)이 더 효율적이라는 점 정도만 기억해 두면 된다.

 

 

 

 

연산자 - 비트 연산자

비트 연산자

 

비트 연산자정수(와 정수)의 이진수를 판별해 그에 따른 이진수 값을 산출하는 연산자다.

boolean 값을 산출하는 논리 연산자와 혼동하지 않도록 주의해야 한다.

 

 

 

 

비트 연산자 - 비트란

 

비트 연산자에서 비트란, 메모리의 최소 단위8비트가 1바이트가 된다.

비트는 십진수 정수를 이진수로 표현한다.

이때 이진수란, 십진수 정수를 2로 나눴을 때 나머지들을 역순으로 읽은 수다.

 

 

 

 

 

비트 연산자 예시

 

&의 경우 두 이진수에서 비트가 같은 경우만 1로 산출해 새로운 이진수를 만든다.

|의 경우 두 이진수에서 비트가 둘다 0일 때 빼고는 1로 산출해 새로운 이진수를 만든다.

 

 

 

 

비트 연산자 예시

 

^의 경우 두 이진수에서 비트가 서로 다른 경우만 1로 산출해 새로운 이진수를 만든다.

~의 경우 하나의 이진수에서 비트를 모두 반대로 바꿔 새로운 이진수를 만든다.

 

 

 

 

비트 연산자 주의점

 

비트 연산자에서 주의할 점은 비트 연산자의 디폴트 산출 타입이 int 타입이라는 것이다.

때문에 int 타입보다 작은 크기 타입에 비트 연산자를 사용하면 컴파일 에러가 난다.

 

 

 

 

 

연산자 - 산술 연산자


산술 연산자

 

산술 연산자숫자간 사칙연산 혹은 나머지를 계산해 산출하는 연산자다.

이때 나머지를 계산하는 연산자는 %인데, 숫자끼리 나눠서 나온 나머지가 결과값이 된다.

 

산술 연산자에서 주의할 점은 산술 연산자의 디폴트 산출 타입이 int 타입이라는 것이다.

오른쪽 예시에서, 자바는 리터럴 간의 연산은 타입 변환 없이 해당 타입으로 계산한다.

때문에 a는 char 타입으로 정상 출력된다.

하지만 char 타입이 저장된 변수에 int 타입과 연산을 할 경우,

변수 b가 int 타입으로 자동 변환되어 에러가 난다.

만약 char 타입 변수에 int 타입 연산 후 산출하고 싶다면, 다시 char 타입으로 강제 변환해야 한다.

(쉽게 말해 변수 초기화할 때 말해주면 알아먹지만 초기화 후 따로 연산하려면 못알아먹는단 소리)

 

 

 

 

산술 연산자 주의점2

 

두 번째 주의할 점은 실수가 연관되어 있는 연산을 하는 경우인데, 두 가지 경우로 나눌 수 있다.

1.정수끼리 연산해서 결과값이 실수인 경우

2.정수-실수/실수-실수 연산을 해서 결과값이 실수인 경우

 

먼저 1번의 경우, 왼쪽 예시를 보면 4/10의 값은 2.5이므로 출력값도 2.5가 나와야 정상이다.

하지만 결과값을 int 타입으로 출력하면 2가 나온다.

그럼 결과값을 실수형인 double 타입으로 출력하면? 마찬가지로 2.0이 나온다.

이유는 정수형인 int 타입끼리 연산을 하면,

결과값도 정수형인 int 타입으로 산출되므로 소수점 부분이 이미 짤린 상태기 때문이다.

해결 방법은 연산한 결과값을 double로 강제 타입 변환해 주면 된다.

 

2번의 경우, 오른쪽 예시에서 1 - 0.1*9의 값은 0.1이므로 출력값도 0.1이 나와야 정상이다.

하지만 결과값을 double 타입으로 출력하면 해괴망측한 숫자가 나온다.

이유는 자바에서 실수가 부동소수점 방식으로 저장되기 때문이다.

쉽게 말하면 자바는 0.12345란 숫자가 있으면 0.12345 고대로 저장하는 게 아니고,

특정한 계산 과정을 거쳐 0.12345를 '표현'하려 하고,

정확히 표현할 수 없다면 그 값에 최대한 가깝게 표현한 후 저장한다.

이 부동소수점 방식 때문에 float, double 타입은 0.1이라는 값을 정확히 표현할 수 없어 근사치로 처리한다.

 

이러한 사태를 방지하는 해결책은,

실수가 포함된 연산을 해야 한다면 실수를 정수로 바꿔 정수끼리 계산해준 다음

1번처럼 결과값을 실수형으로 다시 바꿔주는 것이다.

 

 

 

 

산술 연산자 주의점3

 

세 번째 주의할 점은 오버플로우다.

오버플로우란 연산 결과가 결과값 타입의 표현 범위를 넘었을 때,

해당 타입의 최솟값부터 다시 시작해 엉뚱한 쓰레기값이 나오는 경우를 말한다.

왼쪽 예시를 보면 백만*백만의 결과를 int 타입으로 출력했을 때,

결과값이 int 타입의 표현 범위를 넘어 엉뚱한 값이 나와버렸다.

해결책은 결과값이 타입의 범위 내에 있지 않을 것 같으면 더 큰 타입으로 강제 변환해 주면 된다.

 

마지막 주의할 점은 NaN(Not a Number)infinity다.

정수에다 실수형 0.0을 나누거나 나머지 계산 연산을 해버리면,

/를 했을 경우 infinity, %를 했을 경우 NaN이 나와버린다.

NaN과 infinity가 한번 나오면 어떤 연산을 해도 값이 달라질 수 없다.

 

 

 

 

 

연산자 - 문자열 연산자

 

문자열 연산자

 

문자열 연산자문자열을 연결한다.

피연산자 중 하나라도 문자열이면 +는 문자열 연결자로 사용된다.

왼쪽 예시를 보면 2023을 문자열 형식인 큰따옴표로 묶지 않아도 문자열로 인식해 합쳐진 걸 알 수 있다.

 

그렇다면 문자열과 여러 숫자가 혼합된 경우는 어떨까?

오른쪽 예시에서 변수 year의 출력값은 2023년이지만, year2의 출력값은 연도는 20203이다.

이를 통해 숫자 연산문자열 앞에 올 경우 정상 작동되지만,

문자열 뒤에 올 경우 문자열로 인식된다는 걸 알 수 있다.

만약 문자열 뒤에서 숫자 연산을 하고 싶은 경우,

괄호로 숫자 연산을 묶어 우선순위를 부여하면 된다.

 

 

 

 

연산자 - 쉬프트 연산자

 

쉬프트 연산자

 

쉬프트 연산자란 비트를 이동하는 연산자다.

무슨 소린지 표만 보면 전혀 감이 안 올 테니 예시를 살펴보자.

 

 

 

 

쉬프트 연산자 예시

 

<<의 경우 비트를 왼쪽으로 밀어낸다.

밀려진 비트는 버려지고, 밀어낸 자리의 비트는 0으로 채워 새로운 이진수를 만든다.

 

 

 

 

예시2

 

>>의 경우 비트를 오른쪽으로 밀어낸다.

밀려진 비트는 버려지고,

밀어낸 자리의 비트는 최상위 비트(양수면  0, 음수면 1)로 채워져 새로운 이진수를 만든다.

 

 

 

 

예시3

 

>>>의 경우 비트를 오른쪽으로 밀어낸다.

밀려진 비트는 버려지고, 밀어낸 자리의 비트는 0으로 채워져 새로운 이진수를 만든다.

 

 

 

 

연산자 - 비교 연산자

 

비교 연산자 설명

 

비교 연산자란 값끼리 비교하는 연산자다.

크기 비교 연산자는 우리가 흔히 아는 부등호이니 따로 외울 필요는 없고,

동등 비교 연산자를 기억하면 된다.

 

 

 

 

왼쪽 예시를 보면, char 타입과 숫자를 비교할 때,

char 타입의 값은 자동으로 유니코드 정수화되어 연산이 이루어진다.

 

다른 타입끼리 비교하는 경우, 자동 타입 변환 원칙에 따라 연산이 수행된다.

자동 타입 변환이란 작은 크기 타입이 큰 크기 타입으로 자동 변환되는 것을 말한다.

그러나 한 가지 예외가 있는데, float와 double 타입간 비교하는 경우다.

위에 언급했듯이 실수형은 부동소수점 방식으로 표현돼서 0.1을 정확히 표현할 수 없거니와,

두 타입은 바이트 크기차로 인해 표현할 수 있는 범위가 다르므로, 근사치도 달라진다.

해결 방법은 타입을 둘 중 하나로만 통일하고 비교하든지, 정수로 변환해서 비교하면 된다.

 

 

 

 

 

문자열 간 비교 연산자를 쓸 때 주의할 점이 있다.

자바는 동일한 문자열을 비교할 때 문자열 자체를 비교하는 것이 아니라,

문자열 객체가 참조하는 번지값을 비교한다는 점이다.

 

때문에 예시를 보면 변수 1,2의 객체 번지값은 같지만,

객체 생성 연산자인 new로 새로운 객체(문자열)를 만들면

변수 3의 문자열은 같을지라도 번지값은 1,2와 다르기 때문에 다르다고 인식한다.

 

따라서 문자열 자체만을 비교할 때는 equals() 메소드를 사용한다.

(오른쪽 예시 참고)

 

 

 

 

연산자 - 조건 연산자

 

조건 연산자는 조건을 만족하면 true에 설정한 값/연산식,

만족하지 않으면 false에 설정한 값/연산식을 산출하는 연산자다.

항이 3개 필요해서 삼항 연산자라고도 한다.

 

예시를 보면, 변수 num을 2로 나눴을 때 나머지가 0이면 짝수, 아니면 홀수라고 설정했다.

이때 조건식의 데이터 타입은 산출값의 데이터 타입에 맞춰줘야 한다.

 

 

 

 

 

산출값에 또다른 조건 연산자가 중첩되어 들어갈 수도 있다.

위 예시를 보면, 변수 num이 2의 배수가 아니라면 3의 배수인지 판별하라는 중첩 조건식을 설정했다.

 

 

 

 

연산자 - 대입 연산자

 

드디어 대단원의 막을 내릴 마지막, 대입 연산자다.

대입 연산자=을 기준으로 오른쪽의 값을 왼쪽에 저장하는 연산자다.

수학에서 같다는 뜻의 =과 혼동해서는 안 된다.

 

대입 연산자의 연산 순서는 오른쪽에서 왼쪽으로 이루어진다.

따라서 오른쪽 예시를 보면 변수 A에 B값이 먼저 저장되는 게 아니고,

변수 C에 5가 먼저 저장된다.

 

 

 

참고 도서 : 이것이 자바다(신용권 저)

 

마지막으로 이거 다 정리하느라 혹사당한 나자신에게 박수를... 짝짝짝

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.