chapter03 연산자

byeol·2022년 7월 2일
0

Java의 정석

목록 보기
5/9
전체적인 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. 연산자

  • 1.1 연산자와 피연산자
  • 1.2 식과 대입연산자
  • 1.3 연산자의 종류
  • 1.4 연산자의 우선순위와 결합규칙
    단항(~bit,!false)>산술>비교>논리(&,^,|,&&,||)>삼항>대입
    단항>이항>삼항
    단항과 대입만 오른쪽부터 나머지는 왼쪽부터 계산한다.
  • 1.5 산술 변환(usual arithmetic conversion)
    <<다소 헷갈림>>
    앞에서 배운 자동변환이 등장한다
    이항연산자는 두 피연산자의 타입이 일치해야 연산이 가능
    다르면 연산 전에 일치시켜야 하며
    예를 들어 int와 float의 경우 float으로 일치시키는 자동변환이 된다.
    => 이를 우리는 산술변환 혹은 연산산술변환이라고 한다.

    산술 변환의 규칙(단항,이항에서)
    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

2. 단항 연산자

  • 2.1 증감 연산자 ++,--
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
  • 2.2 부호 연산자 +,-

3. 산술 연산자

  • 3.1 사칙연산자 +,-,*,/
    몇 가지의 예시로 살펴볼 부분들이 있다.
    코드를 통해서 개념을 정리해보자
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->문자열+문자열
문자가 아니다! 문자열이다!

  • 3.2 나머지 연산자 %
System.out.println(-10%8);
System.out.println(-10%-8);//위와 같은 결과
//나누는 수는 음수도 허용한다
//그러나 부호가 무시됨.

4. 비교 연산자

피연산자들의 타입이 서를 다를 경우 큰 쪽으로 자동 형변환

  • 4.1 대소비교 연산자 <,>,<=,>=
  • 4.2 등가비교 연산자 ==,!=
    1.0==1.0f 는 true
    10.0 == 10.0f true
    0.1==0.1f false
    WHY??
    정수형은 그대로 저장되지만
    실수형은 오차값이 저장됨 서로 정밀도가 다름
    double d=0.1//0.1000000000000001
    float f=0.1f//0.10000000149011612
    만약 0.1f가 double로 형변환이 일어난다면..
    0.10000000149011612이 상태에서 가수 부분의 나머지 자릿수를 0으로 채우기 때문에 서로 다른 값으로 인식이 된다.
    --문자열의 비교 : ==(Not):문자열이 같은지, equals(YES) : 내용이 같은지
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메소드 이용하기

5. 논리 연산자 (!,~논리&&단항연산자로 우선순위1)

논리 연산자의 순위
~ ! (단항)
<< >> (산술)
&
^
|
&&
||

  • 5.1 논리 연산자 &&,||,!
xyx"or"y
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse
xyx"and"y
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

위는 딱 굵은 글씨만 보고 판단의 결과가 나오기 때문에
||의 경우 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
  • 5.2 비트 연산자 &,|,^,~,<<,>>
    ^ 같으면 0, 다르면 1
    -8>>2: 왼쪽에 1이 채워짐

6. 그 외의 연산자

  • 6.1 조건 연산자 ? 식1: 식2
    결합규칙이 오른쪽에서 왼쪽
result=x>0?1:x==0?0.5:-1);
//x==0?0:-1 먼저 실행
// ? 식1: 식2 사이의 자동형변환 발생
  • 6.2 대입 연산자 =,op=
    i*=10+j;
    i=i x (10+j);
profile
꾸준하게 Ready, Set, Go!

0개의 댓글