티스토리 뷰
3.Chapter03 : 연산자
3.1 연산자와 연산식
프로그램에서 데이터를 처리하여 결과를 산출하는 것은 연산(operations)이라고 한다. 연산에 사용되는 표시나 기호를 연산자(operator)라고 하고, 연산되는 데이터를 피연산자(operand)라고 한다. 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것을 연산식(expressions)라고 부른다.
ex) x+y (`+`는 연산자, 'x'와 'y'는 피연산자)
연산자는 필요로 하는 피연산자의 수에 따라 단항, 이항, 삼항 연산자로 구분된다.
단항 연산자 | ++x; |
이항 연산자 | x+y; |
삼항 연산자 | (sum >90) ? "A" : "B"; |
연산식은 다른 연산자의 피연산자 위치에도 올 수 있다.
ex) boolean result = (x+y) < 5;
3.2 연산의 방향과 우선순위
프로그램에서는 연산자의 연산 방향과 연산자 간의 우선순위가 정해져 있다. 우선 순위가 같은 연산자들끼리는 왼쪽 에서 오른쪽으로(->) 연산을 시작한다.
ex) 100 * 2 / 3 % 5
그러나 단항 연산자(++,--,~,!), 부호 연산자(+,-), 대입 연산자(=,+=,-=)는 오른쪽에서 왼쪽(<-)으로 연산된다.
ex) a = b = c = 5;
먼저 처리 될 연산식이 있다면 `괄호`를 사용하여 묶어주면 먼저 연산된다.
ex) int result = (10 + 20) * 3;
연산의 방향과 우선순위 정리
1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다. |
2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다. |
3. 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.(->) |
4. 복잡한 연산식에서는 `괄호`를 사용해서 우선순위를 정해준다. |
3.3 단항 연산자
단항 연산자는 피연산자가 단 하나뿐인 연산자를 말하며, 여기에는 부호 연산자(+,-), 증감 연산자(++,--), 논리 부정 연산자(!), 비트 반전 연산자(~)가 있다.
3.3.1 부호 연산자(+,-)
부호 연산자는 양수 및 음수를 표시하는 +,-를 말한다. boolean타입과 char 타입을 제외한 나머지 기본 타입에 사용할 수 있다.
ex) int i1 = +100; int i2 = -100;
양수 및 음수를 표현하지만, 변수 값의 부호를 유지하거나 바꾸기 위해서도 사용된다. + 연산자는 변수 값의 부호를 유지한다. - 연산자는 변수 값이ㅡ 부호를 양수는 음수로, 음수는 양수로 바꾼다.
int x = -100;
int result1 = +x; //-100
int result2 = -x; //100
부호 연산자를 사용할 때 주의할 점은 부호 연산자의 산출 타입은 int 타입이 된다는 것 이다.
short s = 100;
int result3 = -s;
3.3.2 증감 연산자(++,--)
증감 연산자는 변수의 값을 1 증가(++) 시키거나 1 감소(--) 시키는 연산자를 말한다. boolean 타입을 제외한 모든 기본 타입의 피연산자에 사용할 수 있다.
연산식 | 설명 | ex) | |
++ | 피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴 | ++i; (i=i+1; 과 같음) |
-- | 피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴 | --i; (i=i-1; 과 같음) |
피연산자 | ++ | 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴 | i++; (i=i+1; 과 같음) |
피연산자 | -- | 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴 | i--; (i=i-1; 과 같음) |
int x = 1;
int y = 1;
int result1 = ++x + 10;
int result2 = y++ + 10;
변수 result1에는 12가 저장된다. x의 값이 1 증가되어 2가 된 후 10과 합해져 12기 되기 떄문
변수 result2에는 11이 저장된다. y의 값인 1과 10이 합해져 11이 되고 그후에 y는 증가되어 2기 되기 때문
3.3.3 논리 부정 연산자(!)
논리 부정 연산자는 true를 false로, false를 true로 변경하기 때문에 boolean 타입에서만 사용 가능하다. 주로 제어문과 조건문에서 사용되어, 실행 흐름을 제어할 때 사용된다.
연산식 | 설명 | |
! | 피연산자 | 피연산자가 true면 false 값을 산출 (!true -> false) |
피연산자가 false면 true 값을 산출 (!false -> true) |
3.3.4 비트 반전 연산자(~)
** 거의 요즘은 사용하지 않음
정수 타입(byte, short, int, long)의 피연산자에만 사용되며, 피안산자를 2진수로 표현했을 때 비트값 인 0을 1로, 1은 0으로 반전한다. 연산 후, 부호 비트인 최상위 비트를 포함해서 모든 비트가 반전되기 때문에 부호가 반대인 새로운 값이 산출된다. 주의 사항은 산출타입은 int 타입이 된다는 것이다.
int v1 = 10; //10(십진수)
int v2 = ~v1; //-11(십진수)
int v3 = ~v1 + 1; //-10(십진수)
3.4 이항 연산자
피연산자가 두 개인 연산자를 말하며 산술연산자, 문자열 연산자, 대입 연산자 비교 연산자 논리 연산자, 비트 논리 연산자, 비트 이동 연산자 등이 있다.
3.4.1 산술 연산자
일반적으로 말하는 사칙연산인 더하기(+), 뺴기(-), 곱하기(*), 나누기(-)와 나머지를 구하기(%)를 포함하여 5개이다.
long을 제외한 정수 타입 연산은 int 타입으로 산출되고, 피연산자 중 하나라도 실수 타입이면 실수타입으로 산출 됨.
정확한 계산을 필요로 할때는 실수 타입을 사용하지 말고, 정수 타입으로 계산해야 한다. float과 double은 0.1을
정확히 표현할 수 없어 근사치로 계산하기 때문이다.
Nan과 Infinity 연산
- /또는 %연산자를 사용할 때 우측 피연산자를 0으로 사용하면 예외가 발생한다.
ex)
5 / 0, 5 % 0 -> ArithmeticException 발생
- /또는 %연산자를 사용할 떄 우측 피연산자를 0.0 또는 0.0f 로 나누면 예외 대신 Infinity, NaN 발생
ex)
5 / 0.0 -> Infinity(무한대)
5 % 0.0 -> NaN(Not a Number)
이와 같은 값이 나오면 어떤 수와 연산하더라도 Infinity와 NaN이 산출되어 데이터가 엉망이 된다.
Double.isInfinite() , Double.isNaN() 을 사용하여 값을 확인할 수 있다.
그렇기 떄문에 실수 타입을 입력 값으로 받을 떄는 NaN 검사를 꼭 해야한다.
3.4.2 문자열 연결 연산자(+)
문자열 연결 연산자인 `+`는 문자열을 서로 결합하는 연산자이다. +연산자는 산술 연산자, 부호 연산자인 동시에 문자열 연산자이기도 하다.
문자 + 문자 = 문자, 숫자 + 문자 = 문자, 숫자 + 숫자 = 숫자
3.4.3 비교 연산자 (<,<=,>=,==,!=)
비교 연산자는 대소 또는 동등을 비교해서 boolean 타입인 true/false를 산출한다. 주로 조건문, 반복문에서 실행 흐름을 제어할 때 사용된다.
ex) boolean result = (10 == 10) // true
0.1 == 01.f // false 가 나온다. 부동소수점 타입은 0.1을 정확히 표현할 수 없기에 0.1f는 0.1의 근사값으로 표현됨.
피연산자를 모두 float 타입으로 강제 타입 변환한 후 비교 하던지, 정수로 변환하여 비교하면 된다.
String 타입의 문자열 비교
String 타입은 문자열 비교시 대소 연산자(<,<=,>,>=)를 사용할 수 없고, 동등비교 연산자(==,!=)는 사용할 수 있으나
문자열이 같은지, 다른지를 비교하는 용도로는 사용되지 않는다.
기본 타입인 변수의 값을 비교할 때와 다르게, 참조 타입인 String 변수를 비교할 때는 equals를 사용한다.
ex) String str1 = "신용권";
String str2 = "신용권";
String str3 = new String("신용권");
자바는 문자열 리터럴이 동일하다면 동일한 String 객체를 참조하도록 되어 있다. 그래서 str1과 str2는 동일한
String 객체의 번지값을 가지고 잇다. 그러나 str3은 객체 생성 연산자인 new로 생성한 새로운 String 객체의 번지값을 갖고 있다.
이 경우 str1 == str2 //true str2 == str 3 //false 가 된다.
== 연산자는 변수에 저장된 값만 비교하기 때문에 이런 결과가 나온다.
그렇기에 동일한 String 객체이건, 다른 String 객체이건 상관없이 String 객체의 문자열만 비교하고 싶다면
equals() 메소드를 사용하면 된다. 원본 문자열과 매가 값으로 주어진 비교 문자열이 동일한지 비교후
true/ false 를 리턴한다.
ex) boolean result = str1.equals(str3) //true
즉 equals는 주소값 말고 그 안에 값이 같은지 비교하는 방법이다.
3.4.4 논리 연산자(&&, ||, &, |,^,!)
논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^), 논리부정(!) 연산을 수행한다. 피연산자는 boolean만 가능.
&& 또는 & | 피연사자 모두가 true일 경우에만 연산 결과는 true | if((result > 33) && (result <60)) |
|| 또는 | | 피연산자 중 하나만 true이면 연산 결과는 true | if((result > 33) || (result <60)) |
^ |
피연사자가 하나는 true이고 다른 하나가 false일 경우만 연산 결과가 true |
if((result > 33) ^ (result <60)) |
! | 피연산자의 논리값을 바꿈 | if(!result) |
&&와 &는 산출 결과는 같지만 연산 과정이 다르다. &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false라는 산출 결과를 낸다. 하나라도 false면 false이기에.. 그러나 &는 두 피연산자 모두를 평가해서 결과를 낸다. ||와 |도 마찬가지 이다.
3.4.5 비트 연산자(&,|,^,~,<<,>>,>>>)
많이 사용하지는 않는다. 비트 연산자는 데이터를 비트 단위로 연산한다. 즉 0과 1이 피연산자가 된다.
정수 타입만 가능하며 산출형은 int이다. 기능에 따라 비트 논리 연산자와 비트 이동 연산자로 구분한다.
비트 논리 연산자는 0과 1을 연산하며, 비트 이동 연산자는 비트를 좌측 또는 우측으로 이동하는 연산자이다.
3.4.6 대입 연산자(=,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>=,>>>=)
대입 연산자는 오른쪽 ㅣ연산자의 값을 좌측 피연산자인 변수에 저장한다. 오른쪽 피연산자는 리터럴 및 변수그리고 다른 연산식이 올 수 있다. 모든 연산자 중 가장 낮은 연산 순위를 가지고 있고 진행 방향은 오른쪽에서 왼쪽으로 진행 된다.
ex) result +=1 (result = result +1)
3.5 삼항 연산자
삼항 연산자(?:)는 세 개의 피연산자가 필요로 하는 연산자를 말한다. `?`앞의 조건식에 따라 `:` 앞뒤의 피연산자가 선택된다고 해서 조건 연산식이라고 부르기도 한다.
ex)
int score = 95;
char grade = (score >90) ? 'A' : 'B' // 결과는 A
-> score > 90의 결과가 true이면 A / false이면 B이다.
if문으로 변경해서 작성 가능하지만, 한줄에 간단하게 삽입할 경우 삼항연산자가 더 효율적이다.
if문으로 변환
int score = 95;
char grade;
if(score > 90){
grade = 'A';
}else{
grade = 'B';
}
'jvm언어관련 > java' 카테고리의 다른 글
Catch Timeout Exception (0) | 2019.05.16 |
---|---|
이것이 자바다 -chapter05 : 참조 타입 (0) | 2019.04.21 |
이것이 자바다 -chapter04 : 조건문과 반복문 (0) | 2019.03.30 |
이것이 자바다 -chapter02 : 변수와 타입 (0) | 2019.01.30 |
이것이 자바다 -chapter01 : 자바 시작하기 (0) | 2019.01.23 |
- Total
- Today
- Yesterday
- gradle
- multiple row update
- 몽고DB 완벽가이드
- update query multi row
- SpringBoot
- Slack
- 뱅크샐러드 유전자
- update query
- update query mutiple row
- 슬랙
- update query set multiple
- springboot https
- MSSQL
- 슬랙 /
- spring-boot-starter-data-redis
- 이펙티브자바
- java
- vue.js
- visual studio code
- update set multi
- 싱글턴
- 슬랙봇
- 그레이들
- 뱅크샐러드
- 뱅셀 유전자
- 다중 업데이트
- 이것이 자바다
- update set multiple
- 업데이트 쿼리
- effectivejava
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |