본문 바로가기
java

연산자

by doni73 2025. 3. 28.

w1d5 - ch3 

 

연산자와 피연산자

연산자

연산을 수행하는 기호(+ , - , / , * )등 

 

피연산자

연산자 작업 대상 (변수, 상수, 리터럴, 수식)

 

연산자 종류

  • 산술 변환자
    - 연산자 : + , - , * , / , % , << , >>
    - 사칙 연산과 나머지 연산(%)
  • 비교 연산자
    - 연산자 : > , < , >= , <= , == , !=
    - 크고 작음과 같음을 비교
  • 논리 연산자
    - 연산자 : && , || , ! , & , | , ^ , ~
    - '그리고'와 '또는' 으로 조건을 연결
  • 대입 연산자 
    - 연산자 : =
    - 우변 값을 좌변에 저장
  • 기타
    - 연산자 : (type) , ?: , instanceof
    - 형변환 연산자 , 삼항 연산자, instanceof 연산자

 

대입(연산자)  / 대입문 ? - > 2가지 역할 (문장역할 ?)

 

연산자 우선순위

수학과 동일

 

연산자 결합규칙

- 보통 왼 -> 오 방향 

- 단항이나 대입일 경우 오-> 왼

 

 

산술변환

1. 두 피연산자의 타입을 같게 일치 (큰 타입으로 일치해서 연산)

2. 피연산자의 타입이 int보다 작으면 int로 변환

byte a = 10;
byte b = 20;
//byte c = a + b; => 연산은 int로 변환되기 때문에 오류, byte
byte c = (byte)(a + b);

System.out.println(c); // 30

 

 


 

단항연산자

 

1. 증감 연산자

- 종류 : ++ (피연산자 값을 1씩 증가)  , -- (피연산자 값을 1씩 감소)
- 피연산자의 타입 변경 x

- 덧셈 / 뺄셈 역할 + W(쓰기) 역할 ?

==> 대입연산자랑 증감 연산자/산술 ? 만 w(쓰기) 역할 
- 전위형 , 후위형

  • 전위형
    값이 참조되기 전에 증가/감소시킴. (j = ++i;)
  • 후위형
    값이 참조된 후에 증가/감소시킴. (j = i++;)
int i = 1;
i++;
System.out.println(i); //2

int j = 1;
++j;
System.out.println(j); //2

==> 독립적으로 쓰일 땐 값이 같게 나옴  

int i = 5;
int j = i++;
System.out.println("j : " + j + ", i : " + i); //j : 5, i : 6

i = 5;
j = ++i;
System.out.println("j : " + j + ", i : " + i); //j : 6, i : 6

==> 위는 변수를 읽어오고 난 후에 증가시키고 , 아래는 증가시킨 후에 변수를 읽어와서 값이 다름

 

 

2. 부호 연산자

피연산자의 부호를 반대로 변경한 결과를 반환
boolen과 char를 제외한 기본형에만 사용 가능

int i = -10;
int j = +i;
System.out.println(j); //-10

int a = -15;
int b = -a;
System.out.println(b); //15

==> +는 부호에 영향이 없어서 잘 쓰이지 않고 '-'를 자주 사용


 

산술연산자

 

사칙연산자
- 종류 : + , - , / , * , %
- 산술 변환 규칙이랑 같음

int a = 1_000_000;
int b = 2_000_000;

long c = a * b;
System.out.println(c); //-1454759936
//int타입으로 연산, 범위를 넘어가서 오버플로우 발생!

c = (long)a * b;
System.out.println(c); //2000000000000

==>a나 b를 long타입으로 바꿔주면 long타입으로 연산되어서 제대로 된 값을 얻을 수 있음

***********여기 헷갈림********

char c1 = 'a'; // 'a' 코드값 = 97;
char c2 = c1;
char c3 = ' ';

int i = c1 + 1; //98 , char보다 int가 큰 단위라서 int + int로 계산

//c3 = c2 + 1; ==> c3이 char타입이라 char로 계산해줘야 됨
c3 = (char)(c2 + 1);
System.out.println(c3); //b

//c2 = c2 + 1; ==> c2는 char타입이라 char로 계산필요
c2++; //증감 연산자는 피연산자의 타입을 변경하지 않음
System.out.println(c2); //b

  ==> 헷갈렸는데 왼쪽 변수의 타입을 먼저 생각! 

char c1 = 'a';
//char c2 = c1 + 1;
char c2 = 'a' + 1;
//System.out.printf(c1 + 1);
System.out.println(c2); //b
System.out.println('a' +1); //98

=================> println(c2)는 char타입이라서 b로 나오고 println('a'+1)은 int값으로 연산돼서 int로 출력

 

float pi = 3.141592f;
float shortPi = (int)(pi * 1000) / 1000f;
System.out.println(shortPi); //3.141 , 셋째자리까지 출력

//소수점 셋째자리에서 반올림
double d = 3.141592;
double mathPi = Math.round(d * 1000) / 1000.0;
double mathPi2 = Math.round(d * 1000) / 1000;
System.out.println(mathPi); //3.142
System.out.println(mathPi2); //3.0

//소수점 셋째자리에서 반올림
shortPi = (int)(pi * 1000 + 0.5) / 1000f;
System.out.println(shortPi); //3.142

===> Math.round() : 소수점 첫째자리에서 반올림해서 '정수'로 출력해주는 메서드

1000.0으로 하면 double타입으로 연산돼서 3.142가 되고, 1000으로하면 정수와 정수 연산으로 돼서 3.0이 됨 ? 

 

 

나머지연산자

% , 나누는 수로 0 사용 불가

int x = 10;
int y = 8;
System.out.printf("%d을 %d로 나누면, 몫은 : %d , 나머지는 : %d입니다.", x , y , x/y, x%y);
//10을 8로 나누면, 몫은 : 1 , 나머지는 : 2입니다.
System.out.println(10%8); //2
System.out.println(-10%8); //-2
System.out.println(-10%-8); //-2

==> 부호는 무시돼서 결과는 절댓값으로 나눈 나머지랑 같음!

 


 

비교연산자

 

논리연산자

 

기타

 

컴파일러

1. 번역

2. 자동코드추가

3. 최적화

 

 

비교연산자

float f = 0.1f != double d = 0.1 이거만 조심하면 됨===> 실수는 비교할 때 작은 쪽으로 맞춰서 계산~! (float로 맞춰서 비교)

헷갈리는 거 : 0.1f -> 0.1d 로 바꿀 때 왜 버려지는지 다시 확인

 

조건연산자 ( = if문)

-> 자바스크립트랑 어떻게 다른지 비교해서 보기 ~~

 

 

 

 

-->

 

? ?  ?

 

 

 

 

'java' 카테고리의 다른 글

람다와 스트링  (0) 2025.04.22
변수  (0) 2025.03.27