LostCatBox

Java 배우기 CH03

Word count: 704Reading time: 4 min
2022/12/23 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. 연산자
    1. 1.1. 연산자와 피연산자
    2. 1.2. 연산자의 종류
  2. 2. 연산자 우선순위
  3. 3. 증감 연산자 & 부호 연산자
    1. 3.1. 증감연산자 (단항연산자)
    2. 3.2. 부호 연산자(단항연산자)
  4. 4. 형변환 연산자
    1. 4.1. 형변환이란
    2. 4.2. 자동 형변환
  5. 5. 사칙 연산자
    1. 5.1. 산술 변환(!!!)
  6. 6. Math.round()반올림, 나머지 연산자
    1. 6.1. Math.round()
    2. 6.2. 나머지 연산자 %
  7. 7. 비교연산자
    1. 7.1. 문자열의 비교
  8. 8. 논리 연산자와 논리 부정 연산자
    1. 8.1. 논리 부정 연산자(단항연산자) ← 연산방향
  9. 9. 조건연산자 & 대입연산자
    1. 9.1. 조건연산자(3항 연산자)
    2. 9.2. 대입 연산자(왼←오 로 연산방향)
    3. 9.3. 복합 대입 연산자