JAVA
자바 기초 : 연산자와 연산자의 종류
- -
핵심개념
- 연산자(operation) : 연산에 사용되는 표시나 기호 ex) +,-,*,==
- 피연산자(operand) : 연산자와 함꼐 연산되는 데이터 ex) x,y,z
- 연산식 : 연산자와 피연산자를 사용하여 연산 과정을 기술한 것. 연산식은 반드시 하나의 앖을 산출한다. 보통 연산식의 값은 변수에 저장하는데, int A = x + y라고 했을때 x와 y 변수의 값을 더한 뒤 결과값을 A변수에 저장한다.
연산해서 산출되는 값은 값의 타입에 따라 나뉘며 산술연산자는 숫자타입으로 결과값이 나오지만, 비교연산자(==,!=,<>, instance of)와 논리연산자(!,&,&&)는 논리타입(boolean)으로 결과값이 나온다. - 연산의 방향과 우선순위
- 단항,이항,삼항 연산자 순으로 우선순위를 가진다.
단항연산자 : 피연산자가 하나인 것. 부호((양수,음수)+,-), 증감((변수값 1 증감)++,--), 논리부정(!)
ex) ++x;
이항연산자 : 피연산자가 두개인 것. 산술(+,-,*,/,%), 비교(<,<=,>,>=,==,!=), 논리(&&,||,^,!), 대입(=,+=,=+,-=,*=,/=,%=)
ex) x + y;
삼항연산자 : 피연산자가 세개인 것. 조건식((조건식)?A:B)에 따라 A 또는 B 중 하나를 선택
ex) (sum>90) ? "A" : "B" - 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
- 단항, 부호, 대입연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.
ex) a = b = c = 1 ; -> c=1, b=1, a=1 -> a,b,c의 값은 모두 1 - 복잡한 연산식에는 괄호()를 삽입해서 우선순위를 정한다.
- 부호 연산자 : 양수와 음수를 표시하는 +,-
public static void main(String[] args) {
int x = -100; int result1 = +x; //부호유지 int result2 = -x; //부호변경 System.out.println("result1 = " + result1); System.out.println("result2 = " + result2); byte b = 100; //byte result = -b; 부호연산의 결과는 int 타입이므로 byte타입에 저장하면 컴파일 에러 int result3 = -b; int result4 = +b; System.out.println("result3 = " + result3); System.out.println("result4 = " + result4); } 실행결과 : result1 = -100
result2 = 100 result3 = -100 result4 = 100 |
- 증감연산자 : 변수의 값이 1씩 증감하는 ++, --.
++a일 경우 증가 후 연산, a++일경우 연산 후 증가(결과값 달라지므로 주의)
ex) int x = 1;
int y = 1;
int result1 = ++x + 10; ->12 //x의 값이 1 증가되어 2가 된 후 10을 더해서 12가 됨
int result2 = y++ + 10; ->11 //y의 값인 1에 10이 더해져서 11이 되고, 그 이후에 y의 값이 1 증가되어 2가 됨
public static void main(String[] args) { int x = 10; int y = 10; int z; x++; //연산 후 증가 -> x에 10의 값을 넣은 후 x값 1 증가(11) System.out.println(x); //x=11; ++x; //증가 후 연산 -> x값을 먼저 1증가시킨 후(12) 후 x값 출력(12) System.out.println(x); //x=12; y--; //연산 후 감소 -> y에 먼저 10의 값을 넣은 후 y 값 1 감소(9) System.out.println(y); //y=9 --y; //감소 후 연산 -> y값을 먼저 1감소시킨 후(8) y값 출력(8) System.out.println(y); //y=8 z=x++; // 연산 후 증가 -> z에 먼저 x값(12) 대입 후 x 값 증가(13) System.out.println(z); //z=12, x=13 z=++x; //증가 후 연산 -> x의 값을 먼저 1증가시킨 후(14) y(14)에 대입 System.out.println(z); System.out.println("------------------------------------"); z= ++x + y++; //x값을 먼저 1 증가시킨 후(15), x+y(15+8)값을 y에 저장(23), 이후 y값 1증가(9) System.out.println("z=" +z); //z=23 System.out.println("x=" +x); //x=15 System.out.println("y=" +y); //y=9 } 실행결과 : x=11
x=12 y=9 y=8 z=12 z=14 ------------------------------------ z=23 x=15 y=9 |
- 논리부정연산자 : 피연산자가 true이면 false를 출력하고 피연산자가 false이면 true값을 산출한다. 따라서 boolean타입에만 사용할 수 있다.
public static void main(String[] args) { boolean play = true; System.out.println((play)); play = !play; System.out.println(play); play = !play; System.out.println(play); } 실행결과 : true
false true |
- 산술연산자 : 사칙연산자와 나머지를 구하는 %까지 총 5개. 산술연산자는 boolean타입을 제외한 모든 기본타입에서 사용이 가능하다. 산술연산자는 피연산자의 타입이 동일하지 않을 경우 아래의 규칙을 이용해서 피연산자들의 타입을 일치시킨 후 연산을 수행한다.
1. 피연산자들이 byte, short,char 타입일 경우 모두 int 타입으로 변환 후 연산 수행
2. 피연산자들이 모두 정수 타입이고 long 타입이 포함되어 있을 경우, 모두 long 타입으로 변환 후 연산 수행
3. 피연산자 중 실수 타입(float, double)이 있을 경우, 허용 범위가 큰 실수 타입으로 변환 된 후 연산 수행
public static void main(String[] args) {
//byte byte1 = 1; //byte byte2 = 1; //byte byte3 = byte1 + byte2; (x) -> 컴파일에러. int 타입으로 변환 후 연산 수행 //int result3 = byte1 + byte2; (o) 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); } 실행결과 : result1 : 7
result2 : 3 result3 : 10 result4 : 2 result5 : 1 result6 : 2.5 |
public static void main(String[] args) {
//char타입도 정수 타입이므로 산술 연산이 가능. 하지만 연산 시 int타입으로 변환 char c1 = 'A' + 1; System.out.println("c1 : " + c1); char c2 = 'A'; /*char c3 = c2 + 1; 컴파일 에러 -> char 변수가 int타입으로 변환되므로 연산결과는 int 타입이 됨*/ System.out.println("c2 : " + c2); } 실행결과 : c1 : B
c2 : A |
- 문자열 결합 연산자 : 피연산자 중 하나가 문자열이면 다른 피연산자도 문자열로 변환 후 연산을 수행. 왼쪽에서 오른쪽으로 연산이 진행되며 문자열 결합연산자 + 를 만나면 다른 피연산자를 문자열로 변환하고 서로 결합한다.
public static void main(String[] args) {
String str1 = "JDK" + 6.0; String str2 = str1 + " ui"; System.out.println(str2); String str3 = "JDK" + 3 + 3.0; System.out.println(str3); String str4 = 3 + 3.0 + "JDK"; System.out.println(str4); } 실행결과 : JDK6.0 ui
JDK33.0 6.0JDK |
- 비교연산자 : 피연산자의 대소 또는 동등을 비교해서 true 또는 false를 산출. 대소연산자는 boolean을 제외한 기본타입에서 사용할 수 있고, 동등 연산자는 모든 타입에서 사용 가능.
비교연산자에서도 연산을 수행하기 전에 피연산자의 타입을 일치시켜 연산을 수행한다. 하지만 float 타입의 경우 소수점 방식이 정확한 0.1 등을 표현하지 않기 때문에 0.1f == 0.1을 false값을 산출한다. 이때는 피연산자를 모두 float 타입으로 변환하거나 정수 타입으로 전환해서 비교해야한다.
public static void main(String[] args) {
int v2 = 1; double v3 = 1.0; System.out.println(v2==v3); //true. v2가 자동으로 double타입으로 자동변환됨 double v4 = 0.1; float v5 = 0.1f; System.out.println(v4==v5); //false. 0.1f는 0.1보다 큰 수 System.out.println((float)v4==v5); System.out.println((int)(v4*10)==(int)(v5*10)); } 실행결과 : true
false true true |
public static void main(String[] args) {
//문자열 비교연산은 equals 메소드를 이용하여 비교연산 String strVar1 = "김땡땡"; String strVar2 = "김땡땡"; System.out.println(strVar1.equals(strVar2)); System.out.println(!strVar1.equals(strVar2)); } 실행결과 : true
false |
- 논리연산자 : 논리곱(&&), 논리합(||), 배타적 논리합(^), 논리부정(!) 연산을 수행. 논리연산의 피연사는 boolean타입만 사용 가능.
논리곱(&&) : 피연산자 모두가 true이어야 연산 결과가 true -> AND
논리합(||) : 피연산자 중 하나라도 true이면 연산결과가 true -> OR
배타적 논리합 (^) : 피연산가 하나는 true 다른 하나는 false일 경우true. true와 true이면 false이다 (XOR)
논리부정(!) : 피연산자의 논리값을 바꾼다 (NOT)
public static void main(String[] args) { int charCode = 'A'; if((charCode>=65)&(charCode<=90)) {//'A'=65, 'Z'=90 System.out.println("대문자 이군요"); } if((charCode>=97)&&(charCode<=122)) {//'a'=97, 'Z'=122 System.out.println("소문자 이군요"); } if(!(charCode<48)&(charCode>57)) { System.out.println("0~9 숫자 이군요"); } int value = 6; if((value%2==0)|(value%3==0)) { System.out.println("2 또는 3의 배수 이군요"); } if((value%2==0)|!(value%3==0)) { System.out.println("2 또는 3의 배수 이군요"); } } 실행결과 : 대문자 이군요
0~9 숫자 이군요 2 또는 3의 배수 이군요 2 또는 3의 배수 이군요 |
- 대입연산자 : 오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장하거나(단순대입연산자) 연산 후에 결과를 변수에대입한다.(복합대입연산자) 대입연산자는 가장 마지막에 수행, 연산 진행방향은 오른쪽에서 왼쪽
복합대입연산자 : +=, -=, *=, /=, %=, &=, |=, ^= -> 변수 = 변수 (=앞의연산자) + 피연산자와 동일
ex) x +=2 -> x = x + 2
public static void main(String[] args) {
int result = 0; result += 10 ; //0+10 System.out.println("result=" + result); result -= 5 ; //10-5 System.out.println("result=" + result); result *= 3 ; //5*3 System.out.println("result=" + result); result /= 5 ; //15/5 System.out.println("result=" + result); result %= 3 ; //3%3 System.out.println("result=" + result); } 실행결과 : result=10
result=5 result=15 result=3 result=0 |
- 삼항연산자 ; 3개의 피연산자를 필요로 하는 연선자. ? 앞의 조건식에 따라 피연산자가 선택된다고해서 조건 연산식이라고도 한다.
-> 조건식(피연산자1) ? 값 또는 연산식(피연산자2) : 값 또는 연산식(피연산자3)
조건식을 연산하여 true가 나오면 삼항연산자의 결과는 피연산자2가 됨. 반면에 조건식을 연산하여 false가 나오면 삼항연산자의 결과는 피연산자3이 됨.
int score = 95; char grade = (score > 90) ? 'A' : 'B' 삼항연산자는 if문으로 변경해서 작성할 수도 있지만, 간단하게 작성하려면 삼항연산자를 사용하는 것이 더 효율적임. |
int score = 95; char grade; if (score > 90) { grade = 'A'; } else { grade = 'B' } |
public static void main(String[] args) {
int score = 85; char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C'); System.out.println(score + "점은 " + grade + "등급입니다."); } 실행결과 : 85점은 B등급입니다.
|
'JAVA' 카테고리의 다른 글
자바 기초 : 반복문 (for문, while문, do-while문) (0) | 2023.02.22 |
---|---|
자바 기초 : 조건문 (if문, switch문) (0) | 2023.02.21 |
자바 기초 : 변수와 시스템 입출력 (0) | 2023.02.20 |
자바 기초 : 타입 변환(자동 타입 변환과 강제 타입 변환) (0) | 2023.02.19 |
자바 기초 : 변수의 기본타입 (0) | 2023.02.19 |
Contents
소중한 공감 감사합니다