연산
- 프로그램에서 데이터를 처리하여 결과를 산출하는 것
연산자
- 연산에 사용되는 표시나 기호
- 산술,증감,비교,논리,대입 등이 있다.
연산자 종류 | 연산자 | 피연산자 수 | 산출값 | 기능 |
산술 | +, -, *, /, % | 이항 | 숫자 | 사칙연산 및 나머지 계산 |
부호 | +, - | 단항 | 숫자 | 음수와 양수의 보호 |
문자열 | + | 이항 | 문자열 | 두 문자열을 연결 |
대입 | =, +=, -=, *=, /=, %= | 이항 | 다양 | 우변의 값을 좌변의 변수에 대입 |
비교 | ==, !=, >, <, >=, <=, instanceof | 이항 | boolean | 값의 비교 |
논리 | !, &, :, &&, :: | 단항 이항 |
boolean | 논리 부정, 논리곱, 논리합 |
증강 | ++, -- | 단항 | 숫자 | 1만큼 증,감 |
조건 | (조건식) ? A : B | 삼항 | 다양 | 조건식에 따라 A 또는 B중 선택 |
*피연산자 수 : 이항(두개)/ 단항(한개)
*산출값은 연산의 결과 : 비교랑 논리 연산자를 이용해 연산식을 만들면 결과는 boolean이 나온다
피연산자
- 연산자와 함께 연산되는 데이터 (값)
- 예를들어, 연산식 3 + x 에서 3과 변수 x가 피연산자이다.
연산식
- 연산자와 피연산자를 사용하여 연산 과정을 기술한 것
- 연산식은 반드시 하나의 값 산출
- 하나의 값이 오는 모든 자리에 연산식 사용 가능
- 대표적으로 변수에 연산식의 값을 저장 ex) int result = x + y ( x + y의 결과를 좌측 변수에 저장)
- 다른 연산식의 피연산자 위치에 연산식 대입 가능 / boolean result = (x + 5) < 5; (비교연산자 '<' 피연산자 위치에 연산식이 사용 됨)
복합적으로 구성된 연산식의 연산
- 우선순위에 따라 수행 :
단항 -> 이항 -> 삼항
산술 -> 비교 -> 논리 -> 대입
x > 0 && y < 0
//&&:논리연산자 >,<:비교연산자
//1 번째 수행 > 2번째 수행 < 3번째 수행 &&
- 우선순위 같은 연산자는 왼쪽에서 오른쪽 방향으로 수행
100 * 2 / 3 % 5
- 증감(++,--) 대입(=, +=, -=) 연산자는 우측에서 좌측으로 수행한다
- 괄호는 가장 우선순위가 높으므로, 먼저 연산하고 싶은 곳에 괄호를 잘 활용하면 연산자의 우선순위를 굳이 외울 필요x
연산자의 종류
- 피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분
- 단항 연산자: 부호, 증감 연산자 ( ++x; //피연산자의 수가 1개)
- 이항 연산자: 산술, 비교, 논리 연산자 ( x + y; //피연산자의 수가 2개)
- 삼항 연산자: 조건 연산자 ( sum > 90) ? "A" : "B"; //피연산자의 수가 3개)
단항연산자
- 부호 연산자 (+,-)
- boolean 타입과 char 타입을 제외한 기본 타입에 사용 (byte,short,int,long,float,double 타입의 변수가 피연산자로 옴)
연산식 | 설명 | ||
+ | 피연산자 | 피연산자의 부호 유지 | |
- | 피연산자 | 피연산자의 부호 변경 |
- 정수 및 실수 타입 변수 앞에 붙는 경우
int x = -100;
int result1 = +x; // 부호를 그대로 유지해서 result1에 저장해라
int result2 = -; // 부호를 바꿔서 result2에 저장해라
- 부호 연산자가 붙은 변수값에는 부호 바뀜
- 부호 연산의 결과는 int로 저장됨
- int 이하 정수의 부호 연산은 무조건 int로 연산해야 함. int로 하지 않을 시 컴파일 에러 발생
byte b = 100;
byte result = -b; //컴파일 에러 발생
int result = -b; //(o)
- 증감 연산자(++1씩 증가/--1씩 감소)
- boolean 타입 외 모든 기본 타입 피연산자에 사용 가능
num++;
num--;
++num;
--num;
연산식 (위치) | 설명 | |
++ | 피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴 |
-- | 피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴 |
피연산자 | ++ | 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴 |
피연산자 | -- | 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴 |
- 변수의 앞 뒤 어디에든 올 수 있음
++i; , i++; //모두 i=i+1;로 동일
--i; , i--; //모두 i=i-1;로 동일
- 다른 연산자와 함께 사용될 경우 증감 연산자의 위치에 따라 결과 달라질 수 있음
int x = 1;
int y = 1;
int result1 = ++x + 10; // 식에서 피 연산자 앞에 있을땐 먼저 증감 연산 부터 수행
int result2 = y++ + 10; // 식에서 피 연산자 뒤에 있을땐 먼저 전체 연산식 부터 수행 한뒤 증감연산 수행
- 논리 부정 연산자 (!)
- true를 false로, false를 true로 변경
- 토글(toggle) 기능(true를 false로, false를 true로 변경하는 기능)이나 조건문과 제어문에서 실행 흐름을 제어
- boolean 타입에만 사용할 수 있음
연산식 | 설명 | |
! | 피연산자 | 피연산자가 true이면 false값 산출 피연산자가 false이면 true값 산출 |
이항연산자
단항 연산자는 피연산자가 1개라면 이항 연산자는 피연산자가 2개인 연산자를 뜻함
- 산술 연산자
- - +, -, *, /, %
연산식 | 설명 | |||
피연산자 | + | 피연산자 | 덧셈 연산 | |
피연산자 | - | 피연산자 | 뺄셈 연산 | |
피연산자 | * | 피연산자 | 곱셈 연산 | |
피연산자 | / | 피연산자 | 왼쪽 피 연산자를 오른쪽 피 연산자에 나눗셈 연산 | |
피연산자 | % | 피연산자 | 왼쪽 피 연산자를 오른쪽 피 연산자에 나눈 나머지를 구하는 연산 |
package sec02.exam04;
public class ArithmeticOperatorExample {
public static void main(String[] args) {
int v1 = 5;
int v2 = 2;
int result1 = v1 + v2;
System.out.println("result1=" + result1);
int result2 = v1 - v2;
System.out.println("result2=" + result2);
int result3 = v1 * v2;
System.out.println("result3=" + result3);
int result4 = v1 / v2;
System.out.println("result4=" + result4);
int result5 = v1 % v2;
System.out.println("result5=" + result5);
double result6 = (double) v1 / v2;
System.out.println("result6=" + result6);
}
}
결과 값
- 피연산자 타입이 동일하지 않을 경우 아래 규칙에 따라 일치시켜 연산 수행
- 피연산자가 byte, short, char 타입일 경우(int이하 정수 타입일 경우)에 모두 int 타입으로 변환
- 피연산자 모두 정수 타입이고 long 타입 포함될 경우 모두 long 타입으로 변환
- 피연산자 중 실수 타입이 있을 경우 허용 범위 큰 실수 타입으로 변환
- char타입의 산술 연산
- 리터럴 ('A')와 플러스 연산을 하는 경우와 변수(c2)와 플러스 연산을 하는 경우 비교
c1과 같이 리터럴에 직접 연산을 하게 될 시 A의 값 65와 +1을 인식하여 66으로 컴파일이 된다.
하지만 c3와 같이 변수를 이용해 산술 연산을 하게 되면 변수를 사용하는 과정에 int타입으로 변환이 되기 때문에 컴파일 에러가 발생한다.
char타입보다 int타입의 허용범위가 더 크기 때문에 위와 같이 int타입으로 저장해주어야 한다.
(My Magazine 블로그 참고)
- 문자열 결합 연산자 (+)
- + 연산자의 피연산자 중 한 쪽이 문자열인 경우
String str1 = "JDK" + 6.0; // 6.0 -> 문자열로 전환
String str2 = str1 + " 특징"; // str2에 "JDK6.0 특징"이란 값이 저장됨
"JDK" + 3 + 3.0; // 첫번째가 문자열일 경우 나머지가 숫자라 하더라도 문자열의 결합이 일어남 "JDK33.0" 산출
3 + 3.0 + "JDK"; // 문자열이 뒤에 있으면 숫자를 문자열로 취급x "6.0JDK" 산출
- 비교 연산자
- 피연산자의 대소 비교하여 true/false 산출 : 조건문이나 반복문에서 실행 흐름 제어
- 값이 같은지 다른지를 비교하고 boolean값을 산출
- 동등 비교 연산자는 모든 타입에서 사용 가능
- 크기 비교 연산자는 boolean 외 모든 기본 타입에서 사용 가능 (boolean에만 못씀)
구분 | 연산식 | 설명 | ||
동등비교 | 피연산자1 | == | 피연산자2 | 두 피연산자의 값이 같은지를 검사 |
피연산자1 | != | 피연산자2 | 두 피연산자의 값이 다른지를 검사 | |
크기 비교 |
피연산자1 | > | 피연산자2 | 피연산자1이 큰지를 검사 |
피연산자1 | >= | 피연산자2 | 피연산자1이 크거나 같은지를 검사 | |
피연산자1 | < | 피연산자2 | 피연산자1이 작은지를 검사 | |
피연산자1 | <= | 피연산자2 | 피연산자1이 작거나 같은지를 검사 |
- char 형식에도 대소 비교 가능
-int로 선언한 1과 double로 선언한 1.0은 연산과정에서 int형이 double로 변환되기 때문에 같다고 출력
-double로 선언한 0.1과 float로 선언한 0.1은 false가 나온다.
-실수타입을 저장할 때 부동 수소점 방식을 사용하여 정확하게 0.1을 저장할 수 없기 때문
-float형식으로 통일하여 선언해주어 비교해주거나 (double타입으로 통일하면x)
-정수 형변환 후 비교
- 논리 연산자(&&, ||, &, |, ^, !)
- boolean 타입만 사용 가능
- 논리곱,논리합,논리부정을 수행하고 boolean 값을 산출
- 논리곱은 연산식이 true , true 일경우에만 결과가 true가 된다 (즉,false가 하나만 있어도 flase)
- 논리합은 연산식이 flase , flase일 경우에만 결과가 flase가 된다 (즉 ,true가 하나만 있어도 true)
구분 | 연산식 | 결과 | 설명 | ||
AND (논리곱) |
ture | && 또는 & |
ture | ture | 피연산자가 모두 ture 일 경우에만 연산 결과가 true |
ture | flase | flase | |||
flase | ture | flase | |||
flase | flase | flase | |||
OR (논리합) |
ture | || 또는 | |
ture | ture | 피연산자 중 하나만 true이면 연산 결과는 true |
ture | flase | ture | |||
flase | ture | ture | |||
flase | flase | flase | |||
XOR (배타적 논리합) |
ture | ^ | ture | flase | 피연산자가 하나는 true 이고 다른하나가 false일 경우에만 연산 결과가 true |
ture | flase | ture | |||
flase | ture | ture | |||
flase | flase | flase | |||
NOT (논리부정) |
! | ture | flase | 피연산자의 논리값을 바꿈 | |
flase | ture |
package sec02.exam09;
public class LogicalOperatorExample {
public static void main(String[] args) {
int charCode = 'A';
if( (charCode>=65) & (charCode<=90) ) { //&가 1개일 때는 앞의 값이 false여도 뒤에 값을 확인해봄
System.out.println("대문자 이군요");
}
if( (charCode>97) && (charCode<=122) ) { //&가 2개일 때는 앞의 값이 false이면 뒤에 값을 확인하지 않음(더 빠르게 결과값 산출)
System.out.println("대문자 이군요");
}
if( !(charCode<48) && !(charCode>57) ) { //두 항이 모두 false이지만 !연산자로 인해 true값 출력 !(not이 붙으면 true->false로 false는 true로 바뀜)
System.out.println("0~9 숫자 이군요");
}
int value = 6;
if( (value%2==0) | (value%3==3) ) {
System.out.println("2 또는 3의배수 이군요"); //|가 1개일 때에는 앞의 값이 true여도 뒤에 값을 확인해봄
}
if( (value%2==0) | (value%3==3) ) { //|가 2개일 때에는 앞에 값이 true면 뒤에 값을 확인하지 않음
System.out.println("2 또는 3의배수 이군요");
}
}
}
- 특별한 경우가 아니면 &&와 || 로 사용하는 것이 더 효율적
- 대입 연산자
- 오른쪽의 값을 왼쪽에 대입하거나 연산후 대입
- 단순 대입 연산자와 복합 대입연산자가 있음
구분 | 연산식 | 설명 | ||
단순 대입 연산자 | 변수 | = | 피연산자 | 오른쪽 피연산자의 값을 왼쪽 변수에 저장 |
복합 대입 연산자 | 변수 | += | 피연산자 | 변수 = 변수+피연산자와 동일 |
변수 | -= | 피연산자 | 변수 = 변수-피연산자와 동일 | |
변수 | *= | 피연산자 | 변수 = 변수*피연산자와 동일 | |
변수 | /= | 피연산자 | 변수 = 변수/피연산자와 동일 | |
변수 | %= | 피연산자 | 변수 = 변수%피연산자와 동일 | |
변수 | &= | 피연산자 | 변수 = 변수&피연산자와 동일 | |
변수 | |= | 피연산자 | 변수 = 변수|피연산자와 동일 | |
변수 | ^= | 피연산자 | 변수 = 변수^피연산자와 동일 |
삼항 연산자
- (조건식) ? A : B를 말하며 조건이 true 이면 A를 산출하고, false이면 B를 산출
- 3개의 피연산자를 필요로 하는 연산자
- ? 앞의 조건식에 따라 콜론 앞뒤의 피연산자 선택
- 조건식이 true면 앞의 값을, false면 뒤에 값을 결과 값으로 선택함
삼항 연산자가 2차례 사용된 식이다. 우선 score의 값을 비교해 A인지를 판단 후 후자의 조건으로 분기되어 한차례 더 삼항 연산자를 사용되었다.
'Java' 카테고리의 다른 글
[JAVA ] 참조 타입(참조타입과 참조변수) (0) | 2022.01.30 |
---|---|
[JAVA ] 조건문 (if문, switch문,for문, while문, do-while문, break, continue, label) (0) | 2022.01.26 |
[Java]변수와 시스템 입출력 (0) | 2022.01.23 |
[Java] 변수 타입 변환 (0) | 2022.01.23 |
[Java] 변수 타입 (0) | 2022.01.23 |