quilt code

[Java] 연산자 본문

daily/Java

[Java] 연산자

김뱅쇼 2022. 12. 23. 20:30

1. 연산자

연산에 사용되는 표시나 기호: 연산자

연산자와 함께 연산되는 데이터: 피연산자

연산자와 피연산자를 이용하여 연산의 과정을 기술한 것: 연산식

 

*연산자의 종류

산술 +,  -,  *, /, % 이항 숫자 사칙연산 및 나머지 계산
부호 +, - 단항 숫자 음수와 양수의 부호
문자열 + 이항 문자열 두 문자열을 연결
대입 =, +=, -=, *=, /=, %= 이항 다양 우변의 값을 좌변의 변수에 대입
증감 ++, -- 단항 숫자 1만큼 증가/감소
비교 ==, !=, >, <, >=, <=, instanceof 이항 boolean 값의 비교
논리 !, &, |, &&, || 단항
이항
boolean 논리 부정, 논리곱, 논리합
조건 (조건식) ? A : B 삼항 다양 조건식에 따라 A 또는 B 중 하나를 선택
  • 자바에서 사용하는 연산식은 하나만 도출
  • 산술 연산자는 숫자 타입으로 결과값이 나옴(byte, short, int, float, double)
  • 비교연산자와 논리 연산자는 논리 타입으로 결과값이 나옴(boolean)

*연산자의 연산방향과 우선순위

  • 증감(++,--), 부호(+,-), 논리(!) 
  • 산술(*, /,  %)
  • 산술(+, -)
  • 비교(<, >, <=, >=, instanceof)
  • 비교(==, !=)
  • 논리(&)
  • 논리(^)
  • 논리(|)
  • 논리(&&)
  • 논리(||)
  • 조건(?:)
  • 대입(=, +=,-=,*=,/=,%=)  

p.107

1. ③ 연산식은 하나의 값만 산출

2. ④ 산술연산이 우선 수행됨

 

2. 연산자의 종류

  • 단항 연산자: ++x; 
  • 이항 연산자: x + y;
  • 삼항 연산자: (sum > 90) ? "A" : "B";

1) 단항 연산자 

 (1) 부호 연산자: 양수 및 음수를 표시하는 +. -, boolean타입과 char타입 제외한 나머지 기본타입에 사용

+ 피연산자 피연산자의 부호 유지
- 피연산자 피연산자의 부호 변경

자바에서 기본 연산은 int처리 (정수의 경우, 실수의 경우엔 double 처리)

 

 

 (2) 증감 연산자: 변수의 값을 1증가(++) 혹은 1감소(--)시키는 연산자, boolean 타입 제외 모든 기본 타입에 사용

 

int x = 1;

int y = 1;

int result1 = ++x + 10;

연산 하기 전에 x의 값을 1 증가 시키고 연산해라 => 1 + 1 + 10 = 12

int reslult2 = y++ + 10;

연산 한 후에 y의 값을 1 증가 시켜라 => 1 + 10 = 11, y = 2

int x = 10;

int y = 10;

int z;

x++;
++x;
System.out.println("x=" + x);
x=12 x++: x값을 불러 온 후 10 에 1 증가 11 
++x: 불러온 x값 11 에 1증가 12
y--;
--y;
System.out.println("y=" + y);
y=8 y--: y값 불러 온 후 10 에 1 감소 9
--y: 불러온 y값 9에 1 감소 8
z = x++;
System.out.println("z=" + z);
System.out.println("x=" + x);
z=12
x=13
z=x++; : x값 불러온 후 12 1 증가 13 -> x=13 다음 줄부터 적용됨
z = ++x;
System.out.println("z=" + z);
System.out.println("x=" + x);
z=14
x=14
z=++x: x값 13에 1 증가한 후 값 불러옴 14
z = ++x + y++;
System.out.println("z=" + z);
System.out.println("x=" + x);
System.out.println("y=" + y);
z=23
x=15
y=9
z=++x : x값 14에 1 증가한 후 값 불러옴 15
 + y++ : y값을 불러온 후 8 1증가 9

int result = 0;
result += 10; 
result +=1;
result +=1;
=1 생략
**1만

 

 

연산공간 저장 공간 (영역)-메모리
int result = 0;
result += 1;

result ++; (=result+1;)
-> 숫자 값을 꺼내온 다음에 1 증가
++result;
-> 값을 꺼내기 전에 1증가(1증가시킨 다음에 값을 꺼냄)

->명령 실행 위치랑 저장 공간이 다름

 

 (3) 논리 부정 연산자: !로 true는 false로 false는 true 값 산출, boolean타입에만 사용

! true = false

! false = true

1. play = true  play를 출력하라고 했으니까 true
2. 1의 결과 play=true 논리 부정(!)  false
3. 2의 결과 play=false 논리 부정(!)  true

 2) 이항 연산자

 (1) 산술 연산자: 사칙연산자인 +, -, *, /과 나머지를 구하는 % (boolean타입 제외 나머지 기본 타입에 사용)

*% : 왼쪽 피연산자를 오른쪽 피연산자로 나눈 나머지를 구하는 연산

ex) 46%5 => 1, 7%45=>7 (오른쪽 피연산자가 더 크면 왼쪽 피연산자 출력), 9%1=>0

 

산술연산자 예)

 

  • 피연산자들이 byte, short, char 타입일 경우 모두 int 타입으로 변환 후에 연산
  • 피연산자들이 모두 정수타입이고 long 타입이 포함되어 있을 경우 모두 long 타입으로 변환 후에 연산
  • 피연산자 중 실수 타입 float, double이 있을 경우, 허용범위가 큰 실수 타입으로 변환된 후 수행

char 타입의 산술연산 예)

char c1 = 'A' + 1;  => char c1=66;으로 컴파일됨

('A':65라는 유니코드를 가지므로 'A'+1은 66이 됨)

char c3 = c2 + 1; => c2는 int 타입으로 변환, 1과 연산이 되기 때문에 연산 결과는 int 타입이 됨

=> char 타입인 c3에 저장하게 되면 컴파일 에러 발생

=> char c3 = (char) (c2 + 1); 

문자열 결합 연산자 예)

 

어느게 먼저 연산되느냐에 따라 결과값이 달라짐

 (2) 비교 연산자

동등 비교 x == y x,y의 값이 같은지 검사
  x != y 값이 다른지 검사
크기 비교 x > y x가 큰지 검사
  x >= y x가 크거나 같은지 검사
  x < y y가 큰지 검사
  x <= y y가 크거나 같은지 검사

*피연산자가 char 타입이면 유니코드 값으로 비교 연산

이거 왜..?

int랑 double이랑 비교 가능...? 안된다면서...?

>> double은 정수를 정확하게 나타낼 수 있습니다. (https://stackoverflow.com/questions/7453505/why-a-double-1-0-its-equal-to-an-int-1)

 

double이랑 float은 불가 하지만 (float)추가해서 변환해주고 비교 or 정수타입으로 변환해서 비교

 (3) 논리 연산자 &&, ||, &, |, ^, ! : boolean타입만 사용 가능

&&(논리곱, AND) true &&(&) true : t
t &&(&) false : f
f &&(&) t : f
f &&(&) f :f
피연산자가 모두 true일 경우에만 연산 결과가 true
||(논리합, OR) t ||(|) t : t
t ||(|) f : t
f ||(|) t : t
f ||(|) f : f
피연산자 중 하나만 true이면 연산 결과는 true
^(배타적 논리합,  XOR) t ^ t : f
t ^ f : t
f ^ t : t
f ^ f : f
피연산자 중 하나는 true이고 다른 하나가 false일 경우에만 연산 결과가 true
!(논리 부정, NOT) !t: f
!f:t
피연산자의 논리값을 바꿈

* & Ampersand : 그리고 : 둘다 참이어야 참이 나옴
*  | : 또는 : 둘중 하나가 참이면 참이 나옴

* &,|: 비트연산자 : 거짓이 나와도 뒤 연산함
* &&,||: 논리연산자 : 앞이 거짓이 나오면 뒤가 참이든 거짓이든 앞 결과로 나옴, 뒤는 연산하지 않음

보통은 두개짜리 많이 사용->조금 더 효율적이기 때문

* ^ 두개의 논리가 같으면 false 다르면 true
* ! not

 (4) 대입 연산자

: 오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장. 오른쪽 피연산자에는 리터럴 및 변수, 다른 연산식이 올 수 있음

int x = 10;
x = x + 5;
x = x + 6;

 

① int x = 10의 값을 메모리에 있는 x값에 대입

② 메모리에 있는 x 값을 가져와서 대입 x=15;

③ 다시 메모리 x값 가져감 15

④ 메모리에 있는 x값 가져와서 대입 x=16;

⑤ 결과: 21

 

x = x + 10;

x값 중복이라 삭제 

x =   + 10;

-> x += 10;    자리를 나타내기 위해 +를 앞으로 꺼냄

 

int x = 10;  
x = x + 10; x += 10;
x = x - 10; x -= 10;

 

result = result + 10;

result = result - 5;

result = result * 3;

result = result / 5;

result = result % 3;

 3) 삼항 연산자

: 3개의 피연산자를 필요로 하는 연산자

? 앞의 조건식에 따라 콜론 (:) 앞뒤의 피연산자가 선택된다고 해서 조건 연산식이라고도 함

연산 결과를 대입하기 위해 사용
데이터를 결정해줌....

 

조건식
(피연산자)
? 값 또는 연산식
(피연산자2)
: 값 또는 연산식
(피연산자3)
                                               true    
                                                                                                                                          false

조건식을 연산하여 true가 나오면 삼항 연산자의 결과는 피연산자2가 됨

조건식을 연산하여 false가 나오면 삼항 연산자의 결과는 피연산자3이 됨

Scanner추가예)


[과제]

4.

6.

value의 값을 3.56로 만들고 value/100 -> int로 3이 됨

->다시 *100

1. 나머지를 활용

value - value %1002. 연산자 활용value / 100*100

 

8. 

9.

 

scanner부터 만들기

double result = num1 / num2

sysout ("결과: " + result)

조건에 따라서 값을 다르게 할당

0 입력시 무한대로 출력 -> double 타입을 바꿔줌

삼항 연산자 사용

String result = (num1 == 0 || num2 == 0.0 ? "무한대" + num1 / num2 + 

String result = (num1 == 0 || num2 == 0.0 ? "무한대" : String.valueOf(num1 / num2);

 

10.

var2 + "." + var3 -> 문자열 -> 숫자로 바꾸려면  Double.parseDouble

11. ★★★

"10".equals("20")

문자열은 ==으로 비교

if (condition)

condition 조건에 따라서 참이면 if 출력 거짓이면 else 출력같다 다르다 표현할때 ==문자열의 같다 다르다 표현할때 == 쓰면 안됨기본타입의 경우는 데이터 비교가 가능한데기본타입이 아닌 나머지의 경우에는 값 비교가 아니라 값이 저장된 주소값을 비교문자열 비교 : equals 메소드 사용 -> "java".equals(name)

숫자는 ==

 

'daily > Java' 카테고리의 다른 글

[Java] 연산자 예제  (0) 2022.12.26
[Java] 조건문과 반복문  (0) 2022.12.26
[Java] 변수와 시스템 입출력  (0) 2022.12.22
[Java] 타입 변환  (0) 2022.12.21
[Java] 타입  (0) 2022.12.21