전체적인 FLOW
1. 연산자
-1.1 연산자와 피연산자
-1.2 식과 대입연산자
-1.3 연산자의 종류
-1.4 연산자의 우선순위와 결합규칙
-**1.5 산술 변환(usual arithmetic conversion)**
2. 단항 연산자
-2.1 증감 연산자 ++,--
-2.2 부호 연산자 +,-
3. 산술 연산자
-3.1 사칙연산자 +,-,*,/
-3.2 나머지 연산자 %
4. 비교 연산자
-4.1 대소비교 연산자 <,>,<=,>=
-4.2 등가비교 연산자 ==,!=
5. 논리 연산자
-5.1 논리 연산자 &&,||,!
-5.2 비트 연산자 &,|,^,~,<<,>>
6. 그 외의 연산자
-6.1 조건 연산자 ? 식1: 식2
-6.2 대입 연산자 =,op=
산술 변환의 규칙(단항,이항에서)
1. 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
long+int->long+long->long
float+int-> float+float->float
float+double->double+double->double
2. 피연산자의 타입이 int보다 작은 경우 int로 변환된다.
**생각해 볼 것이 산술 변환은 자동변환이며 2번 규칙도 자동으로 발생한다.
byte+short->int+int->int
char+short->int+int->int
int i=1,j=1;
i++
++j //결과는 모두 2이다 즉 단독으로 쓰이는 경우는 전위나 후위나 똑같음
int i=2,j=0;
j=i++;
System.out.println(i,j)//i=3,j=2
int i=2,j=0;
j=++i;
System.out.println(i,j)//i=3,j=3
public class OperatorEx6 {
public static void main(String[] args) {
byte a=10, b=20;
int c=a+b;// 산술규칙 2번 참고
byte d = (byte)(a+b);//혹은 명시적으로 형변환을 사용해야 한다
//byte e= a+b; Error발생
System.out.println("a+b="+c);
System.out.println("a+b="+d);}
}
public class 형변환_연습 {
public static void main(String[] args) {
double a,d,e;
int i=3, j=3;
a= i+j;//int+int->INT->doulbe
//여기에서 INT결과는 int 범위에 있어서 자동형변환시 문제가 발생하지 않음.
d=(i*100_000)*(j*100_000_000);//int+int->INT->doulbe
//그러나 여기에서 INT는 int의 범위를 벗어나서 double로 형변환시 문제가 발생함.
e= (i*100_000f)*(j*100_000);//float+int->float->double
System.out.println(a);//6.0
System.out.println(d);//-1.03968768E9
System.out.println(e);//8.9999998976E10
}
}
문자도 사칙연산이 가능하다
문자=부호가 없는 정수인 유니코드 로 저장됨.
아래 코드를 통해서 자세히 알아보자
public class OperationEx11 {
public static void main(String[] args)
{
char a='a';
char d='d';
char zero='0';
char two='2';
char ch=' ';//ch=''공백 없음을 오류이다. 문자 하나라도 있어야 한다.
char ch2=' ';
int i = a+1;
// 2장 자동형변환에 나와있다. char->int로 자동형변환이 일어날 수 있다.
// 이는 Error가 아니다.
ch=(char)(a+1);
//ch=a+1;이는 Error이다
// a+1=int+char=>int로 자동 형변환이 일어나는데
//이를 다시 역방향이 int를 char로 넣는 것이기 때문에
//따라서 지시자인 (char)(a+1)로 만들어야 한다.
ch2='a'+1;
//리터럴 자체로써는 미리 계산 가능
//따라서 형변환이 일어나지 않고 Error가 발생하지 않음
System.out.println(d-a);//3
System.out.println(two-zero);//2
System.out.println((int)(a));//97
System.out.println((int)(d));//100
System.out.println((int)(zero));//48
System.out.println((int)(two));//50
System.out.println(i);//98
System.out.println(ch);//b
System.out.println(ch2);//b
//a~z, A~Z, 0~9까지 연속된 값을 갖는다.
}
앞서 배웠던 String과 헷갈릴거 같아 가져와서 복습하고자 한다
문자열 + anytype->문자열+문자열
문자가 아니다! 문자열이다!
System.out.println(-10%8);
System.out.println(-10%-8);//위와 같은 결과
//나누는 수는 음수도 허용한다
//그러나 부호가 무시됨.
피연산자들의 타입이 서를 다를 경우 큰 쪽으로 자동 형변환
String str="abc";
String str1=new String ("abc");
System.out.println(str=="abc");//true
System.out.println(str1=="abc");//fasle
System.out.println(str1.equals("abc"))//true
//equals는 다른 객체여도 내용이 같으면 true
//문자열 비교할 때는 무조건 equals메소드 이용하기
논리 연산자의 순위
~ ! (단항)
<< >> (산술)
&
^
|
&&
||
x | y | x"or"y |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
x | y | x"and"y |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
위는 딱 굵은 글씨만 보고 판단의 결과가 나오기 때문에
||의 경우 true가 나올 것을 먼저
&&의 경우 false가 나올 것을 먼저 두면 더 빠른 연산 결과를 얻을 수 있다.
int a=5;
int b=0;
System.out.printf("a=%d, b= %d%n",a,b);
System.out.printf("a!=0 || ++b!=0 =%b%n",a!=0 || ++b!=0);
// ||의 경우 앞이 true면 결과값이 true이기 때문에 ++b까지 계산하지 않음
System.out.println("a=%d, b= %d%n",a,b);//a=5,b=0
System.out.println("a==0 && ++b!=0 = %b%n",a==0 && ++b!=0 );
// &&의 경우 앞이 false면 결과값이 false이기 때문에 ++b까지 계산하지 않음
System.out.println("a=%d, b= %d%n",a,b);//a=5,b=0
result=x>0?1:x==0?0.5:-1);
//x==0?0:-1 먼저 실행
// ? 식1: 식2 사이의 자동형변환 발생