새소식

JAVA

자바 기초 : 연산자와 연산자의 종류

  • -

핵심개념

  • 연산자(operation) : 연산에 사용되는 표시나 기호 ex) +,-,*,==
  • 피연산자(operand) : 연산자와 함꼐 연산되는 데이터 ex) x,y,z

  • 연산식 : 연산자와 피연산자를 사용하여 연산 과정을 기술한 것. 연산식은 반드시 하나의 앖을 산출한다. 보통 연산식의 값은 변수에 저장하는데, int A = x + y라고 했을때 x와 y 변수의 값을 더한 뒤 결과값을 A변수에 저장한다.
    연산해서 산출되는 값은 값의 타입에 따라  나뉘며 산술연산자는 숫자타입으로 결과값이 나오지만, 비교연산자(==,!=,<>, instance of)와 논리연산자(!,&,&&)는 논리타입(boolean)으로  결과값이 나온다.

  • 연산의 방향과 우선순위
  1. 단항,이항,삼항 연산자 순으로 우선순위를 가진다.
    단항연산자 : 피연산자가 하나인 것. 부호((양수,음수)+,-), 증감((변수값 1 증감)++,--), 논리부정(!)
                         ex) ++x;
    이항연산자 : 피연산자가 두개인 것. 산술(+,-,*,/,%), 비교(<,<=,>,>=,==,!=), 논리(&&,||,^,!), 대입(=,+=,=+,-=,*=,/=,%=)
                         ex) x + y;
    삼항연산자 : 피연산자가 세개인 것. 조건식((조건식)?A:B)에 따라 A 또는 B 중 하나를 선택
                         ex) (sum>90) ? "A" : "B"
  2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
  3. 단항, 부호, 대입연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.
    ex) a = b = c = 1 ;   -> c=1, b=1, a=1  ->  a,b,c의 값은 모두 1
  4. 복잡한 연산식에는 괄호()를 삽입해서 우선순위를 정한다.
  • 부호 연산자 : 양수와 음수를 표시하는 +,-
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등급입니다.

 

Contents

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

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