LostCatBox

Java 배우기 CH03

Word count: 704Reading time: 4 min
2022/12/23 12 Share

연산자

연산자와 피연산자

  • 연산자: 연산을 수행하는 기호 >> 모든 연산자는 연산결과를 반환한다.
    ( 괄호는 연산자아님)
  • 피연산자: 연산자의 연산 수행 대상(x,3 …)

연산자의 종류

Untitled

(비트연산자는 무시하기)

  • (type): 형변환
  • ? 3형 연산자

연산자 우선순위

  • 연산자가 둘 이상있을때 어떤 연산을 먼저 수행할지 자동 결정하는것
  • 아래 우선 순위 외우기(!!!) == 상식적임

Untitled

  • 부호 연산자는 1항연산자이므로 2항 연산자보다 먼저 계산됨
  • 대입 연산자는 왼쪽에 있는 모든 계산를 끝나고 변수에 대입하는것으로 우선순위가 낮다
  • 대입과 단항 연산자를 제외하면, 모두 왼쪽 →오른쪽 연산됨!!!!
  • 모든 연산결과를 연산결과를 반환한다.
  1. 산술>비교>논리>대입로 우선순위를 가짐
  2. 단항(피연산자1개) > 이항(피연산자2개 > 삼항 (피연산자3개) 로 우선순위가짐
  3. 단항과 대입을 제외한 모든 연산의 진행방향은 왼쪽 → 오른쪽임

증감 연산자 & 부호 연산자

증감연산자 (단항연산자)

  • 증감 연산자 (++) 피연산자의 값을 1 증가시킨다
  • 감소 연산자(- -) 피연산자의 값을 1 감소시킨다

Untitled

  • 전위형 후위형 뜻
1
2
3
4
5
6
7
8
j = ++i; //전위형

++i ; //1 증가후
j = i; //대입

j = i++; // 후위형
j=i ;//대입
i++;

부호 연산자(단항연산자)

  • - 는 피연산자의 부호를 반대로 변경
    • 사용안함

형변환 연산자

형변환이란

  • 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
  • (타입) 피연산자
  • 기존 피연산자의 타입은 당연히 변하지않는다. 읽어온후 타입변경하여 반환
  • 아래 예시 특성 알아두기

Untitled

자동 형변환

  • 원래는 대입 연산자의 양쪽의 타입이 같이야함.
  • 틀린데, 범위가 더 크다면, 알아서 자동 형변환 해줌
  • 즉, 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다.
1
2
3
4
5
6
7
float f = 1234; // float 타입 변수에 int타입 리터릴 저장>> 형변환 생략

float f = (float)1234; // 원래는 이렇게 해야함. 형변환 생락됨.

int i = 3.14f ;// 값손실 예측됨에 따라 에러.> 범위가 작은 변수에 넣어서

int i = (int)3.14f ; // OK, 직접 값손실을 시키면 가능

Untitled

  • 자동 형변환 되는 볌위 관계도

Untitled

  • long보다 float가 가능한 이유는 float가 지수를 활용하는 기록방법으로
    10^19까지인 long 보다 10^38까지 표현가능한 float이 범위가 더 높다
  • 예외)로 int리터럴을 byte,short타입변수로 저장 할때는 당연히 범위포함된다면 들어감…이미 값손실 안일어나는것을 컴파일러가 알고있음..

Untitled

  • 리터럴이 아닌 int 변수로 넣게된다면 컴파일러가 int 변수에 대해byte타입변수는 값손실이 확실하므로 에러가남

사칙 연산자

  • 같은 타입만 계산 가능하고, 결과도 같은 타입으로 나온다
  • int 10 / int 4 ⇒ int 2 가 나옴…
  • 한쪽이라도 float으로 계산해야 나머지를 모두 범위큰 float로 자동 형변환후 계산함

산술 변환(!!!)

  • 연산 전에 피연산자의 타입을 일치시키는 것

  • 규칙

    1. 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치)

      Untitled

    2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
      (연산하기범위가너무 작아서 오버플로우 피하기위해 int로 해버림)

    Untitled

1
2
3
4
5
6
7
8
int a= 1_000_000;
int b= 2_000_000;

long c = a*b; // int타입 *int타입 => int타입이 나온후 long c 대입연산자, 오버플로우

System.out.println(c); // -1454759936 출력됨.. 오버플로우발생

long c = (long)a*b; //해결방법.. 하나라도 형변환하여 큰 범위! 자동형변환

Math.round()반올림, 나머지 연산자

Math.round()

  • 실수를 소수점 첫 째자리에서 반올림한 정수를 반환
  • 만약 둘째자리 이상을 반올림하고싶다면 10^N을 곱하여 함수대입후 10^N으로나눔

Untitled

  • Math.round()가 int반환하여 결국 int / int 는 int이므로 소수점 안나옴

  • 1000.0 double타입으로 나눠줘야 결과값나옴

  • 형변환 연산자로 값손실 이용하여 내림 만들기

1
2
3
4
5
double a = 3.141592; //3.141 만 얻으려면?


System.out.println(a);
System.out.println((int)(a*1000)/1000.0); //일부러 값손실이용

나머지 연산자 %

  • 오른쪽 피연산자로 나누고 남은 나머지를 반환
  • 피연산자는 정수만됨( 부호는 무시됨)
  • / 몫 반환, %나머지 반환

비교연산자

Untitled

문자열의 비교

  • 문자열 비교에는 == 대신 equals()를 사용해야한다
  • 의도하지 않은 false가 나올수도있으므로

Untitled

논리 연산자와 논리 부정 연산자

  • 조건식을 연결할 때 사용하는 연산자
  • || OR결합 : 어느 한쪽만 true면 true반환
  • && AND결합 : 둘다 true여야 true반환 (&&가 우선순위가 더 높아서… 괄호필요)
1
2
3
4
5
6
7
8
9
// 예시 
// i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다
(i%2==0 ||i%3==0)&&i%6!=0

// 문자 ch는 숫자('0'~'9')이다
'0'<=ch &&ch <='9'

// 문자 ch 는 대문자 또는 소문자이다
('a' <= ch &&ch<='z')||('A' <= ch &&ch<='Z')

논리 부정 연산자(단항연산자) ← 연산방향

  • ! : true를 false로 바꾸고 false를 true로 바꿈
  • !!true이라면, 안쪽 !처리후 밖에 !처리됨

조건연산자 & 대입연산자

조건연산자(3항 연산자)

  • ? : 조건식의 결과에 따라 연산 결과를 잘리 한다

Untitled

Untitled

Untitled

대입 연산자(왼←오 로 연산방향)

  • = : 오른쪽 피연산자를 왼쪽 피연산자에 저장후 저장된 값을 반환
1
2
int a;
System.out.println(a=3); //3이 출력됨!!!
  • = 기준으로 왼쪽은 lvalue , 오른쪽은 rvalue
  • 특히, 왼쪽은 저장공간(변수, 배열)이 와야함으로 이외의것은 에러

Untitled

복합 대입 연산자

  • 대입 연산자와 다른 연산자를 하나로 축약
  • 맨 마지막 외우기.(괄호가 생각됨을주의)

Untitled

CATALOG
  1. 1. 연산자
  2. 2. 연산자 우선순위
  3. 3. 증감 연산자 & 부호 연산자
  4. 4. 형변환 연산자
  5. 5. 사칙 연산자
  6. 6. Math.round()반올림, 나머지 연산자
  7. 7. 비교연산자
  8. 8. 논리 연산자와 논리 부정 연산자
  9. 9. 조건연산자 & 대입연산자