Back-End/Java

μžλ°”μ˜ 정석 3μž₯: μ—°μ‚°μž(Operator)

μ±”πŸ» 2024. 1. 23. 18:14
3️⃣

[ 좜처 ]
μžλ°”μ˜ 정석:
https://product.kyobobook.co.kr/detail/S000001550352
μžλ°”μ˜ 정석 유튜브:
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp

1. μ—°μ‚°μž(operator)

1.1 μ—°μ‚°μžμ™€ ν”Όμ—°μ‚°μž

μ—°μ‚°μž(operator) : 연산을 μˆ˜ν–‰ν•˜λŠ” 기호(+, -, *, / λ“±)

ν”Όμ—°μ‚°μž(operand) : μ—°μ‚°μžμ˜ μ—°μ‚° μˆ˜ν–‰ λŒ€μƒ(λ³€μˆ˜, μƒμˆ˜, λ¦¬ν„°λŸ΄, μˆ˜μ‹)

μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžλ‘œ 연산을 μˆ˜ν–‰ν•˜κ³  λ‚˜λ©΄ 항상 결과값을 λ°˜ν™˜ν•œλ‹€.

1.2 식(式)κ³Ό λŒ€μž…μ—°μ‚°μž

μ±… 86p. μ°Έκ³ 

1.3 μ—°μ‚°μžμ˜ μ’…λ₯˜

μ’…λ₯˜μ—°μ‚°μžμ„€λͺ…
μ‚°μˆ  μ—°μ‚°μž+ - * / % << >>사칙 μ—°μ‚°κ³Ό λ‚˜λ¨Έμ§€ μ—°μ‚°(%)
비ꡐ μ—°μ‚°μž> < β‰₯ ≀ == ≠크고 μž‘μŒκ³Ό κ°™κ³  닀름을 비ꡐ
논리 μ—°μ‚°μž&& || ! & | ^ ~β€˜κ·Έλ¦¬κ³ (AND)’와 β€˜λ˜λŠ”(OR)β€™μœΌλ‘œ 쑰건을 μ—°κ²°
λŒ€μž… μ—°μ‚°μž=μš°λ³€μ˜ 값을 μ’Œλ³€μ— μ €μž₯
기타(type) ?: instanceof ν˜•λ³€ν™˜ μ—°μ‚°μž, μ‚Όν•­ μ—°μ‚°μž, instanceof μ—°μ‚°μž

ν”Όμ—°μ‚°μžμ˜ κ°œμˆ˜μ— μ˜ν•œ λΆ„λ₯˜

ν”Όμ—°μ‚°μžμ˜ 개수둜 μ—°μ‚°μžλ₯Ό λΆ„λ₯˜ν•˜κΈ°λ„ ν•˜λŠ”λ°, ν”Όμ—°μ‚°μžμ˜ κ°œμˆ˜κ°€ ν•˜λ‚˜λ©΄ β€˜λ‹¨ν•­ μ—°μ‚°μžβ€™, 두 개면 β€˜μ΄ν•­ μ—°μ‚°μžβ€™, μ„Έ 개면 β€˜μ‚Όν•­ μ—°μ‚°μžβ€™λΌκ³  λΆ€λ₯Έλ‹€. λŒ€λΆ€λΆ„μ˜ μ—°μ‚°μžλŠ” β€˜μ΄ν•­ μ—°μ‚°μžβ€™μ΄κ³  μ‚Όν•­ μ—°μ‚°μžλŠ” 였직 β€˜? :’ ν•˜λ‚˜ 뿐이닀.

μœ„μ˜ μ‹μ—λŠ” 두 개의 μ—°μ‚°μžκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”λ°, λ‘˜ λ‹€ 같은 기호 β€˜-β€™λ‘œ λ‚˜νƒ€λ‚΄μ§€λ§Œ μ—„μ—°νžˆ λ‹€λ₯Έ μ—°μ‚°μžμ΄λ‹€. μ™Όμͺ½μ˜ 것은 β€˜λΆ€ν˜Έ μ—°μ‚°μžβ€™μ΄κ³  였λ₯Έμͺ½μ˜ 것은 β€˜λΊ„μ…ˆ μ—°μ‚°μžβ€™μ΄λ‹€. 이처럼 μ„œλ‘œ λ‹€λ₯Έ μ—°μ‚°μžμ˜ κΈ°ν˜Έκ°€ 같은 κ²½μš°λ„ μžˆλŠ”λ°, 이럴 λ•ŒλŠ” ν”Όμ—°μ‚°μžμ˜ 개수둜 ꡬ뢄이 κ°€λŠ₯ν•˜λ‹€.

β€˜λΆ€ν˜Έ μ—°μ‚°μžβ€™λŠ” 단항 μ—°μ‚°μžλ‘œ ν”Όμ—°μ‚°μžκ°€ β€˜3’ ν•œ κ°œλΏμ΄μ§€λ§Œ β€˜λΊ„μ…ˆ μ—°μ‚°μžβ€™λŠ” 이항 μ—°μ‚°μžλ‘œ ν”Όμ—°μ‚°μžκ°€ β€˜-3’과 β€˜5’ 두 κ°œμ΄λ‹€.

이처럼 μ—°μ‚°μžλ₯Ό κΈ°λŠ₯별, ν”Όμ—°μ‚°μžμ˜ κ°œμˆ˜λ³„λ‘œ λ‚˜λˆ„μ–΄ λΆ„λ₯˜ν•˜λŠ” 것은 곧이어 배우게 될 β€˜μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„β€™λ•Œλ¬Έμ΄κΈ°λ„ ν•˜λ‹€. μ—°μ‚°μžλ§ˆλ‹€ μš°μ„ μˆœμœ„κ°€ λ‹€λ₯΄μ§€λ§Œ, 같은 μ’…λ₯˜μ˜ μ—°μ‚°μžλ“€μ€ μš°μ„ μˆœμœ„κ°€ λΉ„μŠ·ν•˜κΈ° λ•Œλ¬Έμ— 각 μ’…λ₯˜λ³„λ‘œ μš°μ„ μˆœμœ„λ₯Ό μ™Έμš°λ©΄ κΈ°μ–΅ν•˜κΈ° 더쉽닀.

1.4 μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„μ™€ κ²°ν•©κ·œμΉ™

μ—°μ‚°μžμ˜ κ²°ν•©κ·œμΉ™

ν•˜λ‚˜μ˜ 식에 같은 μš°μ„ μˆœμœ„μ˜ μ—°μ‚°μžλ“€μ΄ μ—¬λŸ¬ 개 μžˆλŠ” 경우, μ–΄λ–€ μˆœμ„œλ‘œ 연산을 μˆ˜ν–‰ν• κΉŒ? μš°μ„ μˆœμœ„κ°€ κ°™λ‹€κ³  ν•΄μ„œ μ•„λ¬΄κ±°λ‚˜ λ¨Όμ € μ²˜λ¦¬ν•˜λŠ” 것은 μ•„λ‹ˆκ³  λ‚˜λ¦„λŒ€λ‘œμ˜ κ·œμΉ™μ„ κ°€μ§€κ³  μžˆλŠ”λ°, κ·Έ κ·œμΉ™μ„ β€˜μ—°μ‚°μžμ˜ κ²°ν•©κ·œμΉ™β€™μ΄λΌκ³  ν•œλ‹€.

λŒ€λΆ€λΆ„ μ™Όμͺ½ β†’ 였λ₯Έμͺ½μ˜ μˆœμ„œλ‘œ 연산을 μˆ˜ν–‰ν•˜κ³ , 단항 μ—°μ‚°μžλ§Œ κ·Έ λ°˜λŒ€λ‘œ, 였λ₯Έμͺ½ β†’ μ™Όμͺ½μ˜ μˆœμ„œλ‘œ 연산을 μˆ˜ν–‰ν•œλ‹€.

<μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„ 정리>

  1. μ‚°μˆ  > 비ꡐ > 논리 > λŒ€μž…. λŒ€μž…μ€ 제일 λ§ˆμ§€λ§‰μ— μˆ˜ν–‰λœλ‹€.
  1. 단항(1) > 이항(2) > μ‚Όν•­(3). 단항 μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„κ°€ 이항 μ—°μ‚°μžλ³΄λ‹€ λ†’λ‹€.
  1. 단항 μ—°μ‚°μžμ™€ λŒ€μž… μ—°μ‚°μžλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ—°μ‚°μ˜ μ§„ν–‰λ°©ν–₯은 μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μ΄λ‹€.

<μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„μ™€ κ²°ν•©κ·œμΉ™>

1.5 μ‚°μˆ  λ³€ν™˜(usual arithmetic conversion)

μ±… 91p.

μ‚°μˆ  λ³€ν™˜μ΄λž€? μ—°μ‚° μˆ˜ν–‰ 직전에 λ°œμƒν•˜λŠ” ν”Όμ—°μ‚°μžμ˜ μžλ™ ν˜•λ³€ν™˜
β‘  두 ν”Όμ—°μ‚°μžμ˜ νƒ€μž…μ„ κ°™κ²Œ μΌμΉ˜μ‹œν‚¨λ‹€.(보닀 큰 νƒ€μž…μœΌλ‘œ 일치)
β‘‘ ν”Όμ—°μ‚°μž”μ˜ νƒ€μž…μ΄ int보닀 μž‘μ€ νƒ€μž…μ΄λ©΄ int둜 λ³€ν™˜λœλ‹€.

첫 번째 κ·œμΉ™μ€ 2μž₯ λ³€μˆ˜μ˜ μžλ™ ν˜•λ³€ν™˜ κ·œμΉ™ μ°Έκ³ 

두 번째 κ·œμΉ™μ€ 2μž₯ λ³€μˆ˜ μ •μˆ˜ν˜•μ˜ 선택기쀀 μ°Έκ³ 

2. 단항 μ—°μ‚°μž

2.1 증감 μ—°μ‚°μž ++ --

❕
증가 μ—°μ‚°μž(++) ν”Όμ—°μ‚°μžμ˜ 값을 1 μ¦κ°€μ‹œν‚¨λ‹€.
κ°μ†Œ μ—°μ‚°μž(--) ν”Όμ—°μ‚°μžμ˜ 값을 1 κ°μ†Œμ‹œν‚¨λ‹€.

νƒ€μž…μ„€λͺ…μ‚¬μš©μ˜ˆ
μ „μœ„ν˜•κ°’μ΄ 참쑰되기 전에 μ¦κ°€μ‹œν‚¨λ‹€.j = ++i;
ν›„μœ„ν˜•κ°’μ΄ 참쑰된 후에 μ¦κ°€μ‹œν‚¨λ‹€.j = i++;

κ·ΈλŸ¬λ‚˜ β€˜++i;’와 β€˜i++;β€™μ²˜λŸΌ μ¦κ°μ—°μ‚°μžκ°€ μˆ˜μ‹μ΄λ‚˜ λ©”μ„œλ“œ ν˜ΈμΆœμ— ν¬ν•¨λ˜μ§€ μ•Šκ³  독립적인 ν•˜λ‚˜μ˜ λ¬Έμž₯으둜 쓰인 κ²½μš°μ—λŠ” μ „μœ„ν˜•κ³Ό ν›„μœ„ν˜•μ˜ 차이가 μ—†λ‹€.

++i; // i의 값을 1 μ¦κ°€μ‹œν‚¨λ‹€.
i++; // μœ„μ˜ λ¬Έμž₯κ³Ό 차이가 μ—†λ‹€.

증감 μ—°μ‚°μžκ°€ ν¬ν•¨λœ 식을 μ΄ν•΄ν•˜κΈ° μ–΄λ €μšΈ λ•ŒλŠ” λ‹€μŒκ³Ό 같이 증감 μ—°μ‚°μžλ₯Ό λ”°λ‘œ λ–Όμ–΄λ‚΄λ©΄ μ΄ν•΄ν•˜κΈ°κ°€ μ‰¬μ›Œμ§„λ‹€. μ „μœ„ν˜•μ˜ 경우 μ¦κ°μ—°μ‚°μžλ₯Ό μ‹μ˜ μ΄μ „μœΌλ‘œ,

j = ++i; // μ „μœ„ν˜•

β†’

++i; // 증가 후에
j = i; // μ°Έμ‘°ν•˜μ—¬ λŒ€μž…

ν›„μœ„ν˜•μ˜ 경우 μ¦κ°μ—°μ‚°μžλ₯Ό μ‹μ˜ μ΄ν›„λ‘œ λ–Όμ–΄λ‚΄λ©΄ λœλ‹€.

j = i++; // ν›„μœ„ν˜•

β†’

j = i; // μ°Έμ‘°ν•˜μ—¬ λŒ€μž… 후에
i++; // 증가
  • ch3 - OperatorEx3.java
    class OperatorEx03 {
    	public static void main(String args[]) {
    		int i=5, j=5;
    
    		System.out.println(i++);	
    		System.out.println(++j);
    		System.out.println("i = " + i + ", j = " +j);
    	}
    }

증감 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ κ°„κ²°ν•΄μ§€μ§€λ§Œ, μ§€λ‚˜μΉ˜λ©΄ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ„œ μ΄ν•΄ν•˜κΈ° μ–΄λ €μ›Œμ§€κΈ°λ„ ν•œλ‹€. 예λ₯Ό λ“€μ–΄ x의 값이 5일 λ•Œ, μ•„λž˜ 식이 μˆ˜ν–‰λœ ν›„μ˜ x의 값은 μ–Όλ§ˆμΌκΉŒ?

x = x++ - ++x; // x의 값은 -1? -2?

생각보닀 μ‰½κ²Œ 닡을 λ‚΄κΈ° μ–΄λ €μšΈ 것이닀. μ‹€μ œ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” μ΄λŸ¬ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  일이 μ—†κ³ , μ΄λ ‡κ²Œ μž‘μ„±ν•˜λŠ” 것은 λ°”λžŒμ§ν•˜μ§€ μ•Šλ‹€. ν•˜λ‚˜μ˜ μ‹μ—μ„œ μ¦κ°μ—°μ‚°μžμ˜ μ‚¬μš©μ„ μ΅œμ†Œν™”ν•˜κ³ , 식에 두 번 이상 ν¬ν•¨λœ λ³€μˆ˜μ— μ¦κ°μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 ν”Όν•΄μ•Ό ν•œλ‹€.

κ°μ†Œ μ—°μ‚°μž(--)λŠ” ν”Όμ—°μ‚°μžμ˜ 값을 1 κ°μ†Œμ‹œν‚¨λ‹€λŠ” κ²ƒλ§Œ λΉΌλ©΄ 증가 μ—°μ‚°μžμ™€ λ™μΌν•˜λ‹€.

2.2 λΆ€ν˜Έ μ—°μ‚°μž + -

λΆ€ν˜Έ μ—°μ‚°μž -'λŠ” ν”Όμ—°μ‚°μžμ˜ λΆ€ν˜Έλ₯Ό λ°˜λŒ€λ‘œ λ³€κ²½ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. ν”Όμ—°μ‚°μžκ°€ 음수면 μ–‘μˆ˜, μ–‘μˆ˜λ©΄ μŒμˆ˜κ°€ μ—°μ‚°μ˜ κ²°κ³Όκ°€ λœλ‹€. λΆ€ν˜Έμ—°μ‚°μž'+'λŠ” ν•˜λŠ” 일이 μ—†μœΌλ©°, μ“°μ΄λŠ” κ²½μš°λ„ 거의 μ—†λ‹€. λΆ€ν˜Έμ—°μ‚°μž '-'κ°€ μžˆμœΌλ‹ˆκΉŒ ν˜•μ‹μ μœΌλ‘œ '+'λ₯Ό μΆ”κ°€ν•΄ 쒋은 것뿐이닀.
λΆ€ν˜Έ μ—°μ‚°μžλŠ” booleanν˜•κ³Ό charν˜•μ„ μ œμ™Έν•œ κΈ°λ³Έν˜•μ—λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

3. μ‚°μˆ  μ—°μ‚°μž

μ‚°μˆ  μ—°μ‚°μžμ—λŠ” 사칙 μ—°μ‚°μž(+, -, *, /)와 λ‚˜λ¨Έμ§€ μ—°μ‚°μž(%)κ°€ μžˆλ‹€. 사칙연산은 μΌμƒμƒν™œμ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” μ΅μˆ™ν•œ 것이라 그리 μ–΄λ ΅μ§€ μ•Šμ„ 것이닀. λ‹€λ§Œ λͺ‡ κ°€μ§€ μ£Όμ˜ν•  사항듀이 μžˆλŠ”λ°, 그것듀을 μ€‘μ‹¬μœΌλ‘œ μ„€λͺ…ν•  것이닀.

3.1 사칙 μ—°μ‚°μž + - *

μ •μˆ˜ν˜• - byte, short, int, long

int a = 10;
int b = 4;

System.out.printf("%d + %d = %d%n",  a, b, a + b);
System.out.printf("%d - %d = %d%n",  a, b, a - b);
System.out.printf("%d * %d = %d%n",  a, b, a * b);
System.out.printf("%d / %d = %d%n",  a, b, a / b);
System.out.printf("%d / %f = %f%n",  a, (float)b, a / (float)b);

λ‚˜λˆ„κΈ° μ—°μ‚°μžμ˜ 두 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ intνƒ€μž…μΈ 경우, μ—°μ‚°κ²°κ³Ό μ—­μ‹œ intνƒ€μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ μ‹€μ œ μ—°μ‚°κ²°κ³ΌλŠ” 2.5일지라도 intνƒ€μž…μ˜ 값인 2λ₯Ό 결과둜 μ–»λŠ”λ‹€. intνƒ€μž…μ€ μ†Œμˆ˜μ μ„ μ €μž₯ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ μ •μˆ˜λ§Œ 남고 μ†ŒμŠ€μ  μ΄ν•˜λŠ” 버렀지기 λ•Œλ¬Έμ΄λ‹€. μ΄λ•Œ, 반올림이 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것에 μ£Όμ˜ν•˜μž.

System.out.println(3/0);   // μ‹€ν–‰ν•˜λ©΄, 였λ₯˜(ArithmeticException) λ°œμƒ
System.out.println(3/0.0); // Infinityκ°€ 좜λ ₯됨

그리고 ν”Όμ—°μ‚°μžκ°€ μ •μˆ˜ν˜•μΈ 경우, λ‚˜λˆ„λŠ” 수둜 0을 μ‚¬μš©ν•  수 μ—†λ‹€. 만일 0으둜 λ‚˜λˆ„λ©΄ μ»΄νŒŒμΌμ€ μ •μƒμ μœΌλ‘œ λ˜μ§€λ§Œ μ‹€ν–‰ μ‹œ 였λ₯˜(ArithmeticException)κ°€ λ°œμƒν•œλ‹€.

뢀동 μ†Œμˆ˜μ κ°’μΈ 0.0f, 0.0d둜 λ‚˜λˆ„λŠ” 것은 κ°€λŠ₯ν•˜μ§€λ§Œ κ·Έ κ²°κ³ΌλŠ” Infinity(λ¬΄ν•œλŒ€)이닀.

byte a = 10;
byte b = 30;
byte c = a * b; // μ—λŸ¬ λ°œμƒ

System.out.println(c);

이 예제λ₯Ό μ»΄νŒŒμΌν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. a와 bλŠ” λͺ¨λ‘ intν˜•λ³΄λ‹€ μž‘μ€ byteν˜•μ΄κΈ° λ•Œλ¬Έμ— μ—°μ‚°μž'+'λŠ” 이 두 개의 ν”Όμ—°μ‚°μžλ“€μ˜ μžλ£Œν˜•μ„ intν˜•μœΌλ‘œ λ³€ν™˜ν•œ λ‹€μŒ μ—°μ‚°(λ§μ…ˆ)을 μˆ˜ν–‰ν•œλ‹€.

κ·Έλž˜μ„œ 'a+b'의 μ—°μ‚°κ²°κ³ΌλŠ” byteν˜•μ΄ μ•„λ‹Œ intν˜•(4 byte)인 것이닀. 4 byte의 값을 1 byte의 λ³€μˆ˜μ— ν˜•λ³€ν™˜μ—†μ΄ μ €μž₯ν•˜λ €κ³  ν–ˆκΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 것이닀.

byte a = 10;
byte b = 30;
byte c = (byte) (a * b); // 44좜λ ₯

System.out.println(c);

이 예제λ₯Ό μ‹€ν–‰ν•˜λ©΄ 화면에 44κ°€ 좜λ ₯λœλ‹€. β€˜10 * 30β€™μ˜ κ²°κ³ΌλŠ” 300μ΄μ§€λ§Œ, ν˜•λ³€ν™˜μ—μ„œ 배운 κ²ƒμ²˜λŸΌ, 큰 μžλ£Œν˜•μ—μ„œ μž‘μ€ μžλ£Œν˜•μœΌλ‘œ λ³€ν™˜ν•˜λ©΄ λ°μ΄ν„°μ˜ 손싀이 λ°œμƒν•˜λ―€λ‘œ 값이 λ°”λ€” 수 μžˆλ‹€. 300은 byteν˜•μ˜ λ²”μœ„λ₯Ό λ„˜κΈ° λ•Œλ¬Έμ— byteν˜•μœΌλ‘œ λ³€ν™˜ν•˜λ©΄ 데이터 손싀이 λ°œμƒν•˜μ—¬ κ²°κ΅­ 44κ°€ byteν˜• λ³€μˆ˜ c에 μ €μž₯λœλ‹€.

int a = 1000000;    // 1,000,000   1백만 
int b = 2000000;    // 2,000,000   2백만 

long c = a * b;     // a * b = 2,000,000,000,000 ?

System.out.println(c);

식 a * b의 κ²°κ³Ό 값을 λ‹΄λŠ” λ³€μˆ˜ 2의 μžλ£Œν˜•μ΄ long νƒ€μž…(8 byte)이기 λ•Œλ¬Έμ— 2 X 1012^{12}을 μ €μž₯ν•˜κΈ°μ— μΆ©λΆ„ν•˜λ―€λ‘œ β€˜2000000000000’이 좜λ ₯될 것 κ°™μ§€λ§Œ, κ²°κ³ΌλŠ” μ „ν˜€ λ‹€λ₯Έ 값이 좜λ ₯λœλ‹€.
κ·Έ μ΄μœ λŠ” intνƒ€μž…κ³Ό intνƒ€μž…μ˜ μ—°μ‚°κ²°κ³ΌλŠ” intνƒ€μž…μ΄κΈ° λ•Œλ¬Έμ΄λ‹€. 'a * b의 κ²°κ³Όκ°€ 이미 intνƒ€μž…μ˜ κ°’(- 1454759936)μ΄λ―€λ‘œ longν˜•μœΌλ‘œ μžλ™ ν˜•λ³€ν™˜λ˜μ–΄λ„ 값은 λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

   long c = a * b;
-> long c = 1000000 * 2000000;
-> long c = -1454759936;

μ˜¬λ°”λ₯Έ κ²°κ³Όλ₯Ό μ–»μœΌλ €λ©΄ μ•„λž˜μ™€ 같이 λ³€μˆ˜ a λ˜λŠ” b의 νƒ€μž…μ„ β€˜longβ€™μœΌλ‘œ λ³€ν™˜ν•΄μ•Ό ν•œλ‹€.

   long c = (long)a * b;
-> long c = (long)1000000 * 2000000;
-> long c = 1000000L * 2000000;
-> long c = 1000000L * 2000000L;
-> long c = 1000000000000L;

λ¬Έμžν˜• - char

char a = 'a';
char d = 'd';
char zero = '0';
char two = '2';

System.out.printf("'%c' - '%c' = %d%n", d, a, d - a); // 'd' - 'a' = 3
System.out.printf("'%c' - '%c' = %d%n", two, zero, two - zero);
System.out.printf("'%c'=%d%n", a, (int)a);
System.out.printf("'%c'=%d%n", d, (int)d);
System.out.printf("'%c'=%d%n", zero, (int)zero);
System.out.printf("'%c'=%d%n", two,  (int)two);

μ‚¬μΉ™μ—°μ‚°μ˜ ν”Όμ—°μ‚°μžλ‘œ 숫자뿐만 μ•„λ‹ˆλΌ λ¬Έμžλ„ κ°€λŠ₯ν•˜λ‹€. λ¬ΈμžλŠ” μ‹€μ œλ‘œ ν•΄λ‹Ή 문자의 μœ λ‹ˆμ½”λ“œ(λΆ€ν˜Έμ—†λŠ” μ •μˆ˜)둜 λ°”λ€Œμ–΄ μ €μž₯λ˜λ―€λ‘œ λ¬Έμžκ°„μ˜ 사칙연산은 μ •μˆ˜κ°„μ˜ μ—°μ‚°κ³Ό λ™μΌν•˜λ‹€. 주둜 λ¬Έμžκ°„μ˜ λΊ„μ…ˆμ„ ν•˜λŠ” κ²½μš°κ°€ λŒ€λΆ€λΆ„μ΄λ©°, 문자 β€˜2’λ₯Ό 숫자둜 λ³€ν™˜ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 문자 '0을 λΉΌμ£Όλ©΄ λœλ‹€.

'2' - '0' -> 50 - 48 -> 2

문자 2의 μœ λ‹ˆμ½”λ“œλŠ” 50이고, 문자 '0’은 48μ΄λ―€λ‘œ, 두 λ¬Έμžκ°„μ˜ λΊ„μ…ˆμ€ 2λ₯Ό 결과둜 μ–»λŠ”λ‹€. μ•„λž˜μ˜ ν‘œλŠ” μœ λ‹ˆμ½”λ“œμ˜ 일뢀인데, '0'~’9β€™κΉŒμ§€μ˜ λ¬Έμžκ°€ μ—°μ†μ μœΌλ‘œ λ°°μΉ˜λ˜μ–΄ μžˆλŠ” 것을 μ•Œ 수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή λ¬Έμžμ—μ„œ β€˜0'을 λΉΌμ£Όλ©΄ 숫자둜 λ³€ν™˜λ˜λŠ” 것이닀.

<μˆ«μžμ™€ 영문자의 μœ λ‹ˆμ½”λ“œ>

λ¬Έμžμ½”λ“œ
048
149
250
351
452
553
654
755
856
957
λ¬Έμžμ½”λ“œ
A65
B66
C67
D68
E69
……
W87
X88
Y89
Z90
λ¬Έμžμ½”λ“œ
a97
b98
c99
d100
e101
……
w119
x120
y121
z122

  • Operator12.java
    char c1 = 'a';        // c1μ—λŠ” 문자 'a'의 μ½”λ“œκ°’μΈ 97이 μ €μž₯λœλ‹€. 
    char c2 = c1;         // c1에 μ €μž₯λ˜μ–΄ μžˆλŠ” 값이 c2에 μ €μž₯λœλ‹€. 
    char c3 =' ';         // c3λ₯Ό 곡백으둜 μ΄ˆκΈ°ν™” ν•œλ‹€. 
    
    int i = c1 + 1;       // 'a'+1 β†’ 97+1 β†’ 98
    
    c3 = (char)(c1 + 1); 
    c2++; 
    c2++; 
    
    System.out.println("i=" + i); 
    System.out.println("c2=" + c2); 
    System.out.println("c3=" + c3);

char c1 = 'a';

// char c2 = c1 + 1; // 라인 5 : 컴파일 μ—λŸ¬ λ°œμƒ
char c2 = 'a' + 1;   // 라인 6 : 컴파일 μ—λŸ¬ μ—†μŒ
System.out.println(c2);

이 예제λ₯Ό μ»΄νŒŒμΌν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  싀행도 μ˜¬λ°”λ₯Έ κ²°κ³Όλ₯Ό μ–»λŠ”λ‹€. λ§μ…ˆ μ—°μ‚°μžμ™€ 같은 이항 μ—°μ‚°μžλŠ” int보닀 μž‘μ€ νƒ€μž…μ˜ ν”Όμ—°μ‚°μžλ₯Ό int둜 μžλ™ ν˜•λ³€ν™˜ν•œλ‹€κ³  λ°°μ› λŠ”λ° μ–΄μ§Έμ„œ 라인 6의 μ½”λ“œλŠ” ν˜•λ³€ν™˜μ„ ν•΄μ£Όμ§€ μ•Šκ³ λ„ λ¬Έμ œκ°€ μ—†λŠ” κ²ƒμΌκΉŒ?

그것은 λ°”λ‘œ β€˜a’+1이 λ¦¬ν„°λŸ΄ κ°„μ˜ 연산이기 λ•Œλ¬Έμ΄λ‹€. μƒμˆ˜ λ˜λŠ” λ¦¬ν„°λŸ΄ κ°„μ˜ 연산은 μ‹€ν–‰ κ³Όμ •λ™μ•ˆ λ³€ν•˜λŠ” 값이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, 컴파일 μ‹œμ— μ»΄νŒŒμΌλŸ¬κ°€ κ³„μ‚°ν•΄μ„œ κ·Έ 결과둜 λŒ€μ²΄ν•¨μœΌλ‘œμ¨ μ½”λ“œλ₯Ό 보닀 효율적으둜 λ§Œλ“ λ‹€.

<μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄μ„œ μ΅œμ ν™”λœ μ½”λ“œμ˜ 비ꡐ>

컴파일 μ „μ˜ μ½”λ“œμ»΄νŒŒμΌ ν›„μ˜ μ½”λ“œ
char c2 = β€˜a’ + 1;
int sec = 60 * 60 * 24;
char c2 = β€˜b’;
int sec = 86400;

μœ„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μ»΄νŒŒμΌλŸ¬κ°€ 미리 λ§μ…ˆμ—°μ‚°μ„ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ μ‹œμ—λŠ” λ§μ…ˆ 연산이 μˆ˜ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€. κ·Έμ € λ§μ…ˆμ—°μ‚°κ²°κ³ΌμΈ 문자 β€˜b’λ₯Ό λ³€μˆ˜ c2에 μ €μž₯ν•  뿐이닀.

κ·ΈλŸ¬λ‚˜ 라인 5와 같이 μˆ˜μ‹μ— λ³€μˆ˜κ°€ λ“€μ–΄κ°€ μžˆλŠ” κ²½μš°μ—λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 미리 계산을 ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ•„λž˜μ˜ 였λ₯Έμͺ½ μ½”λ“œμ™€ 같이 ν˜•λ³€ν™˜μ„ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

char c2 = c1 + 1;

β†’

char c2 = (char) (c1+1);

μΌλΆ€λŸ¬ λ»”ν•œ λ¦¬ν„°λŸ΄ 연산을 ν’€μ–΄μ“Έ ν•„μš”λŠ” μ—†μ§€λ§Œ, μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄μ„œ κ·Έλ ‡κ²Œ ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. ν‘œ3-9μ—μ„œ intνƒ€μž…μ˜ λ³€μˆ˜ sec에 ν•˜λ£¨λ₯Ό μ΄ˆλ‹¨μœ„λ‘œ λ³€ν™˜ν•œ 값을 μ €μž₯ν•˜λŠ” μ½”λ“œλ₯Ό 보면, β€˜86400β€™μ΄λΌλŠ” κ°’λ³΄λ‹€λŠ” '60*60*24’와 같이 μ μ–΄μ£ΌλŠ” 것이 μ΄ν•΄ν•˜κΈ°λ„ 쉽고 였λ₯˜κ°€ λ°œμƒν•  μ—¬μ§€κ°€ 적닀. λ‚˜μ€‘μ— λ°˜λ‚˜μ ˆ(12μ‹œκ°„)둜 값을 λ³€κ²½ν•΄μ•Όν•œλ‹€λ©΄ 계산할 ν•„μš”μ—†μ΄ '60*60*12'둜 λ³€κ²½ν•˜λ©΄ 되기 λ•Œλ¬Έμ΄λ‹€. μ΄λ ‡κ²Œ 풀어써도 κ²°κ΅­ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄μ„œ 미리 κ³„μ‚°λ˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ μ‹œμ˜ μ„±λŠ₯μ°¨μ΄λŠ” μ—†λ‹€.

  • 예제 3-14 OperatorEx14
    class OperatorEx14 { 
          public static void main(String[] args) { 
                char c = 'a'; 
                for(int i=0; i<26; i++) {          // λΈ”λŸ­{} μ•ˆμ˜ λ¬Έμž₯을 26λ²ˆμ„ λ°˜λ³΅ν•œλ‹€. 
                            System.out.print(c++); //'a'λΆ€ν„° 26개의 문자λ₯Ό 좜λ ₯ν•œλ‹€. 
                } 
                
                System.out.println(); // μ€„λ°”κΏˆμ„ ν•œλ‹€.
    
                c = 'A'; 
                for(int i=0; i<26; i++) {          // λΈ”λŸ­{} μ•ˆμ˜ λ¬Έμž₯을 26λ²ˆμ„ λ°˜λ³΅ν•œλ‹€. 
                            System.out.print(c++); //'A'λΆ€ν„° 26개의 문자λ₯Ό 좜λ ₯ν•œλ‹€. 
                } 
    
                System.out.println(); 
    
                c='0'; 
                for(int i=0; i<10; i++) {          // λΈ”λŸ­{} μ•ˆμ˜ λ¬Έμž₯을 10λ²ˆμ„ λ°˜λ³΅ν•œλ‹€. 
                            System.out.print(c++); //'0'λΆ€ν„° 10개의 문자λ₯Ό 좜λ ₯ν•œλ‹€. 
                } 
                System.out.println(); 
          } 
    }

char lowerCase = 'a';
char upperCase = (char) (lowerCase - 32);
System.out.println(upperCase);

πŸ’‘Β λŒ€λ¬Έμžμ™€ μ†Œλ¬Έμž κ°„μ˜ μ½”λ“œκ°’ μ°¨μ΄λŠ” 10μ§„μˆ˜λ‘œ 32이닀.

μ‹€μˆ˜ν˜•

float pi = 3.141592f;
float shortPi = (int)(pi * 1000) / 1000f;
System.out.println(shortPi); // 3.141

(int) (pi * 1000) / 1000f; // μœ„μ˜ μˆ˜μ‹μ—μ„œ 제일 λ¨Όμ € μˆ˜ν–‰λ˜λŠ” 것은 κ΄„ν˜Έ μ•ˆμ˜ 'pi * 1000'이닀.
(int) (3141.592f) / 1000f; // λ‹¨ν•­μ—°μ‚°μžμΈ ν˜•λ³€ν™˜ μ—°μ‚°μžμ˜ ν˜•λ³€ν™˜μ΄ μˆ˜ν–‰λœλ‹€. 3141.592fλ₯Ό int둜 λ³€ν™˜ν•˜λ©΄ 3141을 μ–»λŠ”λ‹€. μ†Œμˆ˜μ  μ΄ν•˜λŠ” 반올림 없이 버렀진닀.
3141 / 1000f; // int와 float의 μ—°μ‚°μ΄λ―€λ‘œ intκ°€ float둜 λ³€ν™˜λœ λ‹€μŒ, float와 float의 연산이 μˆ˜ν–‰λœλ‹€.
3141.0f / 1000f -> 3.141f;

  • 예제 3-17 Operator17.java - λ°˜μ˜¬λ¦Όλ˜λ„λ‘ν•˜λŠ” 예제
    class OperatorEx17 {
    	public static void main(String args[]) { 
    		double pi = 3.141592; 
    		double shortPi = (int)(pi * 1000 + 0.5) / 1000.0;
    
    		System.out.println(shortPi);
    	}
    }
  • 예제 3-18 Operator18.java - λ°˜μ˜¬λ¦Όλ˜λ„λ‘ν•˜λŠ” 예제2
    class OperatorEx18 {
    	public static void main(String args[]) { 
    		double pi = 3.141592; 
    		double shortPi = Math.round(pi * 1000) / 1000.0;
    
    		System.out.println(shortPi);
    	}
    }

3.2 λ‚˜λ¨Έμ§€ μ—°μ‚°μž %

μ±… 108p.

4. 비ꡐ μ—°μ‚°μž(p.109)

4.1 λŒ€μ†ŒλΉ„κ΅ μ—°μ‚°μž < > <= >=

4.2 등가비ꡐ μ—°μ‚°μž == !=

5. 논리 μ—°μ‚°μž

5.1 논리 μ—°μ‚°μž - &&, ||, !

|| (ORκ²°ν•©) ν”Όμ—°μ‚°μž 쀑 μ–΄λŠ ν•œ μͺ½λ§Œ true이면 trueλ₯Ό 결과둜 μ–»λŠ”λ‹€.

&& (ANDκ²°ν•©) ν”Όμ—°μ‚°μž μ–‘μͺ½ λͺ¨λ‘ true이어야 trueλ₯Ό 결과둜 μ–»λŠ”λ‹€.

효율적인 μ—°μ‚°(short circuit evaluation)

논리 μ—°μ‚°μžμ˜ 또 λ‹€λ₯Έ νŠΉμ§•μ€ 효율적인 연산을 ν•œλ‹€λŠ” 것이닀. ORμ—°μ‚° β€˜||β€™μ˜ 경우 두 ν”Όμ—°μ‚°μž 쀑 μ–΄λŠ ν•œ μͺ½λ§Œ β€˜μ°Έβ€™μ΄μ–΄λ„ 전체 μ—°μ‚°κ²°κ³Όκ°€ β€˜μ°Έβ€™μ΄λ―€λ‘œ 쒌츑 ν”Όμ—°μ‚°μžκ°€ β€˜ture(μ°Έ)’이면, 우츑 ν”Όμ—°μ‚°μžμ˜ 값은 ν‰κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€.

β€˜xκ°€ true이면, x || yλŠ” 항상 true이닀.’

ANDμ—°μ‚° β€˜&&β€™μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‘œμ–΄λŠ ν•œμͺ½λ§Œ β€˜κ±°μ§“(false)’이어도 전체 μ—°μ‚°κ²°κ³Όκ°€ β€˜κ±°μ§“(false)β€™μ΄λ―€λ‘œ 쒌츑 ν”Όμ—°μ‚°μžκ°€ β€˜κ±°μ§“(false)’이면 우츑 ν”Όμ—°μ‚°μžλŠ” ν‰κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€.

β€˜xκ°€ false이면, x && yλŠ” 항상 false이닀.’

κ·Έλž˜μ„œ 같은 쑰건식이라도 ν”Όμ—°μ‚°μžμ˜ μœ„μΉ˜μ— λ”°λΌμ„œ 연산속도가 λ‹¬λΌμ§ˆ 수 μžˆλŠ” 것이닀. ORμ—°μ‚° β€˜||β€™μ˜ κ²½μš°μ—λŠ” β€˜μ°Έβ€™μΌ ν™•λ₯ μ΄ 높은 ν”Όμ—°μ‚°μžλ₯Ό μ—°μ‚°μžμ˜ μ™Όμͺ½μ— 놓아야 더 λΉ λ₯Έ μ—°μ‚°κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

('a' <= ch && ch <= 'z' || ('A' <= ch && ch <= 'Z'))

μœ„μ˜ 식은 문자 chκ°€ μ†Œλ¬Έμž λ˜λŠ” λŒ€λ¬ΈμžμΈμ§€ ν™•μΈν•˜λŠ” 것인데, 이 μ‹μ—μ„œ 문자 chκ°€ μ†Œλ¬ΈμžμΈ 쑰건을 λŒ€λ¬ΈμžμΈ 쑰건보닀 μ™Όμͺ½μ— λ†“μ•˜λ‹€. κ·Έ μ΄μœ λŠ” μ‚¬μš©μžλ‘œλΆ€ν„° 문자 chλ₯Ό μž…λ ₯받을 λ•Œ, μ‚¬μš©μžκ°€ λŒ€λ¬Έμžλ³΄λ‹€ μ†Œλ¬Έμžλ₯Ό μž…λ ₯ν•  ν™•λ₯ μ΄ λ†’λ‹€κ³  νŒλ‹¨ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€. μ‹€μ œλ‘œ μ‚¬μš©μžκ°€ μ†Œλ¬Έμžλ₯Ό 더 자주 μž…λ ₯ν•œλ‹€λ©΄, 이 식은 더 효율적으둜 처리될 것이닀.


class OperatorEx26 {
	public static void main(String[] args) { 
		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);
		System.out.printf("a=%d, b=%d\n", a, b);
		System.out.printf("a==0 && ++b!=0 = %b%n", a==0 && ++b!=0);
		System.out.printf("a=%d, b=%d%n", a, b);
	} // main의 끝
}

논리 μ—°μ‚°μžκ°€ 효율적인 연산을 ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” μ˜ˆμ œμ΄λ‹€. λ³€μˆ˜ b에 증감 μ—°μ‚°μž β€˜++’을 μ‚¬μš©ν•΄μ„œ 우츑 ν”Όμ—°μ‚°μžκ°€ 처리되면, b의 값이 μ¦κ°€ν•˜λ„λ‘ ν–ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ‹€ν–‰κ²°κ³Όμ—μ„œ μ•Œ 수 μžˆλ“―μ΄, 두 번의 논리연산 후에도 b의 값은 μ—¬μ „νžˆ 0인 μ±„λ‘œ λ‚¨μ•„μžˆλ‹€. β€˜||(OR)β€™μ˜ κ²½μš°λŠ” 쒌츑 ν”Όμ—°μ‚°μž(a!=0)κ°€ μ°Έμ΄λΌμ„œ, 그리고 β€˜&&(AND)β€™μ˜ κ²½μš°λŠ” 쒌츑 ν”Όμ—°μ‚°μž(a==0)κ°€ κ±°μ§“μ΄λΌμ„œ 우츑 ν”Όμ—°μ‚°μžλ₯Ό ν‰κ°€ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

논리 λΆ€μ • μ—°μ‚°μž !

이 μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžκ°€ true이면 falseλ₯Ό, falseλ©΄ trueλ₯Ό 결과둜 λ°˜ν™˜ν•œλ‹€.

x!x
truefalse
falsetrue

논리 λΆ€μ • μ—°μ‚°μžβ€˜!’가 주둜 μ‚¬μš©λ˜λŠ” 곳은 쑰건문과 반볡문의 쑰건식이며, 이 μ—°μ‚°μžλ₯Ό 잘 μ‚¬μš©ν•˜λ©΄ 쑰건식이 보닀 μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€. 예λ₯Ό λ“€μ–΄ β€˜λ¬Έμž chλŠ” μ†Œλ¬Έμžκ°€ μ•„λ‹ˆλ‹€β€™λΌλŠ” 쑰건을 μ•„λž˜μ˜ μ™Όμͺ½κ³Ό 같이 쓰기보닀 였λ₯Έμͺ½κ³Ό 같이 λ…Όλ¦¬λΆ€μ •μ—°μ‚°μžβ€™!’λ₯Ό μ‚¬μš©ν•˜λŠ” μͺ½μ΄ μ•ŒκΈ° 쉽닀.

ch < 'a' || ch > 'z'

↔

!('a' <= ch || ch <= 'z')

μœ„μ™€ 같이 λ…Όλ¦¬λΆ€μ •μ—°μ‚°μžβ€™!’λ₯Ό 적절히 μ‚¬μš©ν•΄μ„œ 보닀 μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ 식이 λ˜λ„λ‘ λ…Έλ ₯ν•˜μž.


식 β€˜!!b’가 ν‰κ°€λ˜λŠ” κ³Όμ •

λ‹¨ν•­μ—°μ‚°μžλŠ” κ²°ν•©λ°©ν–₯이 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μ΄λ―€λ‘œ ν”Όμ—°μ‚°μžμ™€ κ°€κΉŒμš΄ 것뢀터 μ—°μ‚°λœλ‹€.

   !!b
-> !!true // κ°€κΉŒμš΄ μ—°μ‚°μžκ°€ λ¨Όμ € μ—°μ‚°λœλ‹€.
-> !false // !true의 κ²°κ³ΌλŠ” false이닀.
-> true   // !false의 κ²°κ³ΌλŠ” true이닀.

5.2 λΉ„νŠΈ μ—°μ‚°μž & | ^ ~ << >>

λΉ„νŠΈ μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžλ₯Ό λΉ„νŠΈλ‹¨μœ„λ‘œ 논리 μ—°μ‚°ν•œλ‹€. ν”Όμ—°μ‚°μžλ₯Ό μ΄μ§„μˆ˜λ‘œ ν‘œν˜„ν–ˆμ„ λ•Œμ˜ 각 자리λ₯Ό μ•„λž˜μ˜ κ·œμΉ™μ— 따라 ν‘œ3-14와 같이 연산을 μˆ˜ν–‰ν•˜λ©°, ν”Όμ—°μ‚°μžλ‘œλŠ” μ‹€μˆ˜λŠ” ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€. μ •μˆ˜(문자 포함)만 ν—ˆμš©λœλ‹€.

| (ORμ—°μ‚°μž) ν”Όμ—°μ‚°μž 쀑 ν•œ μͺ½μ˜ 값이 1이면, 1을 결과둜 μ–»λŠ”λ‹€. κ·Έ μ™Έμ—λŠ” 0을 μ–»λŠ”λ‹€.

& (ANDμ—°μ‚°μž) ν”Όμ—°μ‚°μž μ–‘ μͺ½μ΄ λͺ¨λ‘ 1μ΄μ–΄μ•Όλ§Œ 1을 결과둜 μ–»λŠ”λ‹€. κ·Έ μ™Έμ—λŠ” 0을 μ–»λŠ”λ‹€.

^ (XORμ—°μ‚°μž) ν”Όμ—°μ‚°μžμ˜ 값이 μ„œλ‘œ λ‹€λ₯Ό λ•Œλ§Œ 1을 결과둜 μ–»λŠ”λ‹€. 같을 λ•ŒλŠ” 0을 μ–»λŠ”λ‹€.

<ν‘œ 3-14 λΉ„νŠΈ μ—°μ‚°μžμ˜ μ—°μ‚°κ²°κ³Ό>

xyx | yx & yx ^ y
11110
10101
01101
00000

πŸ’‘Β μ—°μ‚°μž β€˜^β€™λŠ” 배타적 XOR(eXclusive OR)라고 ν•˜λ©°, ν”Όμ—°μ‚°μžμ˜ 값이 μ„œλ‘œ λ‹€λ₯Έ 경우, 즉 배타적인 κ²½μš°μ—λ§Œ μ°Έ(1)을 결과둜 μ–»λŠ”λ‹€.

λΉ„νŠΈORμ—°μ‚°μžβ€™|β€™λŠ” 주둜 νŠΉμ • λΉ„νŠΈμ˜ 값을 λ³€κ²½ν•  λ•Œ μ‚¬μš©ν•œλ‹€. μ•„λž˜μ˜ 식은 ν”Όμ—°μ‚°μž 0xAB의 λ§ˆμ§€λ§‰ 4 bitλ₯Ό β€˜Fβ€™λ‘œ λ³€κ²½ν•˜λŠ” 방법을 보여쀀닀.

식2μ§„μˆ˜16μ§„μˆ˜
0xAB | 0xF = 0xAF 10101011
00001111
| ) β€”β€”β€”β€”β€”β€”
10101111
0xAB
0x
F
β€”β€”
0xA
F

λΉ„νŠΈANDμ—°μ‚°μžβ€™&β€™λŠ” 주둜 νŠΉμ • λΉ„νŠΈμ˜ 값을 뽑아낼 λ•Œ μ‚¬μš©ν•œλ‹€. μ•„λž˜μ˜ μ‹μ—μ„œλŠ” ν”Όμ—°μ‚°μžμ˜ λ§ˆμ§€λ§‰ 4bitκ°€ μ–΄λ–€ 값인지 μ•Œμ•„λ‚΄λŠ”λ° μ‚¬μš©λ˜μ—ˆλ‹€.

식2μ§„μˆ˜16μ§„μˆ˜
0xAB & 0xF = 0xB 10101011
00001111
& ) β€”β€”β€”β€”β€”β€”
00001011
0xAB
0x
F
β€”β€”
0x
B

λΉ„νŠΈXORμ—°μ‚°μžβ€™^β€™λŠ” 두 ν”Όμ—°μ‚°μžμ˜ λΉ„νŠΈκ°€ λ‹€λ₯Ό λ•Œλ§Œ 1이 λœλ‹€. 그리고 같은 κ°’μœΌλ‘œ 두고 XOR연산을 μˆ˜ν–‰ν•˜λ©΄ μ›λž˜μ˜ κ°’μœΌλ‘œ λŒμ•„μ˜€λŠ” νŠΉμ§•μ΄ μžˆμ–΄μ„œ κ°„λ‹¨ν•œ μ•”ν˜Έν™”μ— μ‚¬μš©λœλ‹€.

식2μ§„μˆ˜16μ§„μˆ˜
0xAB ^ 0xF = 0xA4


0xA4 ^ 0xF =
0xAB
10101011
00001111
^ ) β€”β€”β€”β€”β€”β€”
10100100
00001111
^ ) β€”β€”β€”β€”β€”β€”
10101011
0xAB
0xF
β€”β€”
0xA4
0xF
β€”β€”

0xAB

이해λ₯Ό 돕기 μœ„ν•΄ 2μ§„μˆ˜λ₯Ό 8자리둜 ν‘œν˜„ν•œ 것이고, 사싀은 intνƒ€μž…(4 byte)κ°„μ˜ 연산이라 32자리둜 ν‘œν˜„ν•˜λŠ” 것이 λ§žλ‹€. 그리고 λΉ„νŠΈμ—°μ‚°μ—μ„œλ„ ν”Όμ—°μ‚°μžμ˜ νƒ€μž…μ„ μΌμΉ˜μ‹œν‚€λŠ” β€˜μ‚°μˆ  λ³€ν™˜β€™μ΄ 일어날 수 μžˆλ‹€.

  • 예제 3-28 OperatorEx28.java
    class OperatorEx28 {
    	public static void main(String[] args) { 
    		int x = 0xAB;
    		int y = 0xF;
    
    		System.out.printf("x = %#X \t\t%s%n", x, toBinaryString(x));
    		System.out.printf("y = %#X \t\t%s%n", x, toBinaryString(y));
    		System.out.printf("%#X | %#X = %#X \t%s%n", x, y, x | y, toBinaryString(x | y));
    		System.out.printf("%#X & %#X = %#X \t%s%n", x, y, x & y, toBinaryString(x & y));
    		System.out.printf("%#X ^ %#X = %#X \t%s%n", x, y, x ^ y, toBinaryString(x ^ y));
    		System.out.printf("%#X ^ %#X ^ %#X = %#X %s%n", x, y, y, x ^ y ^ y, toBinaryString(x ^ y ^ y));
    	} // main의 끝
    
    	// 10μ§„ μ •μˆ˜λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” λ©”μ„œλ“œ
    	static String toBinaryString(int x) {
    		String zero = "00000000000000000000000000000000";
    		String tmp = zero + Integer.toBinaryString(x);
    
    		return tmp.substring(tmp.length()-32);
    	}
    }

λΉ„νŠΈ μ „ν™˜ μ—°μ‚°μž ~

이 μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžλ₯Ό 2μ§„μˆ˜λ‘œ ν‘œν˜„ν–ˆμ„ λ•Œ, 0은 1둜, 1은 0으둜 λ°”κΎΌλ‹€. 논리뢀정 μ—°μ‚°μž β€˜!’와 μœ μ‚¬ν•˜λ‹€.

<λΉ„νŠΈμ „ν™˜ μ—°μ‚°μžμ˜ 2μ§„ μ—°μ‚°κ²°κ³Ό>

x~x
10
01

λΉ„νŠΈ μ „ν™˜ μ—°μ‚°μž β€˜~'에 μ˜ν•΄ 'λΉ„νŠΈ μ „ν™˜ 되고 λ‚˜λ©΄, λΆ€ν˜ΈμžˆλŠ” νƒ€μž…μ˜ ν”Όμ—°μ‚°μžλŠ” λΆ€ν˜Έκ°€ λ°˜λŒ€λ‘œ λ³€κ²½λœλ‹€. 즉, ν”Όμ—°μ‚°μžμ˜ 1의 보수λ₯Ό 얻을 수 μžˆλŠ” 것이닀. κ·Έλž˜μ„œ λΉ„νŠΈμ „ν™˜μ—°μ‚°μž λ₯Ό β€˜1의 보수' μ—°μ‚°μžλΌκ³ λ„ ν•œλ‹€.

예λ₯Ό λ“€μ–΄ 10μ§„μˆ˜ 10을 λΉ„νŠΈμ „ν™˜ μ—°μ‚°ν•œ κ²°κ³ΌλŠ” -11이고, 이 값은 10의 β€˜1의 보수'이닀. 이미 배운 것과 같이 1의 λ³΄μˆ˜μ— 1을 λ”ν•˜λ©΄ μŒμˆ˜κ°€ λ˜λ―€λ‘œ -11에 1을 λ”ν•˜λ©΄ -10이 되고 -11은 10의 1의 λ³΄μˆ˜κ°€ λ§žλ‹€λŠ” 것을 확인할 수 μžˆλ‹€.

  • 예제 3-29 OperatorEx29.java
    class OperatorEx29 {
    	public static void main(String[] args) {
    		byte p =  10;
    		byte n = -10;
    
    		System.out.printf(" p  =%d \t%s%n",  p,   toBinaryString(p));
    		System.out.printf("~p  =%d \t%s%n", ~p,   toBinaryString(~p));
    		System.out.printf("~p+1=%d \t%s%n", ~p+1, toBinaryString(~p+1));
    		System.out.printf("~~p =%d \t%s%n", ~~p,  toBinaryString(~~p));
    		System.out.println();
    		System.out.printf(" n  =%d%n",  n);	
    		System.out.printf("~(n-1)=%d%n", ~(n-1));
    	} // main의 끝
    
    	// 10μ§„ μ •μˆ˜λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” λ©”μ„œλ“œ
    	static String toBinaryString(int x) {
    		String zero = "00000000000000000000000000000000";
    		String tmp = zero + Integer.toBinaryString(x);
    
    		return tmp.substring(tmp.length()-32);
    	}
    }

    μ–‘μ˜ μ •μˆ˜ pκ°€ μžˆμ„ λ•Œ, p에 λŒ€ν•œ 음의 μ •μˆ˜λ₯Ό μ–»μœΌλ €λ©΄ β€˜~p+1’을 κ³„μ‚°ν•˜λ©΄ λœλ‹€.

    β€˜~~pβ€™λŠ” λ³€μˆ˜ p에 λΉ„νŠΈ μ „ν™˜ 연산을 두 번 μ μš©ν•œ 것인데, 1을 0으둜 λ°”κΏ¨λ‹€κ°€ λ‹€μ‹œ 0을 1둜 λ°”κΎΈλ―€λ‘œ μ›λž˜μ˜ 값이 λœλ‹€. κ·ΈλŸ¬λ‚˜ μ—°μ‚°κ²°κ³Όμ˜ νƒ€μž…μ΄ byteκ°€ μ•„λ‹ˆλΌ intλΌλŠ” 것에 μ£Όμ˜ν•˜μž.

μ‰¬ν”„νŠΈ μ—°μ‚°μž << >>

이 μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžμ˜ 각 자리(2μ§„μˆ˜λ‘œ ν‘œν˜„ν–ˆμ„ λ•Œ)λ₯Ό β€˜μ˜€λ₯Έμͺ½(>>)’ λ˜λŠ” β€˜μ™Όμͺ½(<<)β€™μœΌλ‘œ 이동(shift)ν•œλ‹€κ³  ν•΄μ„œ β€˜μ‰¬ν”„νŠΈ μ—°μ‚°μž(shift operator)’라고 이름 λΆ™μ—¬μ‘Œλ‹€.

예λ₯Ό λ“€μ–΄ β€˜8 << 2β€™λŠ” μ™Όμͺ½ ν”Όμ—°μ‚°μžμΈ 10μ§„μˆ˜ 8의 μ§„μˆ˜λ₯Ό μ™Όμͺ½μœΌλ‘œ 2자리 μ΄λ™ν•œλ‹€.

μ΄λ•Œ, μžλ¦¬μ΄λ™μœΌλ‘œ μ €μž₯λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ 값듀은 버렀지고 λΉˆμžλ¦¬λŠ” 0으둜 μ±„μ›Œμ§„λ‹€.

β€˜<<’ μ—°μ‚°μžμ˜ 경우, ν”Όμ—°μ‚°μžμ˜ λΆ€ν˜Έμ— 상관없이 각 자리λ₯Ό μ™Όμͺ½μœΌλ‘œ μ΄λ™μ‹œν‚€λ©° λΉˆμΉΈμ„ 0으둜만 μ±„μš°λ©΄ λ˜μ§€λ§Œ, β€˜>>' μ—°μ‚°μžλŠ” 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™μ‹œν‚€κΈ° λ•Œλ¬Έμ— λΆ€ν˜ΈμžˆλŠ” μ •μˆ˜λŠ” λΆ€ν˜Έλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ μ™Όμͺ½ ν”Όμ—°μ‚°μžκ°€ 음수인 경우 빈자리λ₯Ό 1둜 μ±„μš΄λ‹€. λ¬Όλ‘  μ–‘μˆ˜μΌ λ•ŒλŠ” 0으둜 μ±„μš΄λ‹€.

❕
x << n은 x * 2n^n의 결과와 κ°™λ‹€.
x >> n은 x / 2
n^n의 결과와 κ°™λ‹€.

그리고, 'x << n’ λ˜λŠ” 'x >> nβ€™μ—μ„œ, n의 값이 μžλ£Œν˜•μ˜ bit수 보닀 크면, μžλ£Œν˜•μ˜ bit수둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ§ŒνΌλ§Œ μ΄λ™ν•œλ‹€. 예λ₯Ό λ“€μ–΄ intνƒ€μž…μ΄ 4 byte(=32 bit)인 경우, 자리수λ₯Ό 32번 λ°”κΎΈλ©΄ κ²°κ΅­ 제자리둜 λŒμ•„μ˜€κΈ° λ•Œλ¬Έμ—. 8 >ß> 32'λŠ” 아무 일도 ν•˜μ§€ μ•ŠλŠ”λ‹€. β€˜8>>34'λŠ” 34λ₯Ό 32둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€μΈ 2만큼만 μ΄λ™ν•˜λŠ” '3>>2’λ₯Ό μˆ˜ν–‰ν•œλ‹€. λ‹Ήμ—°νžˆ n은 μ •μˆ˜ 만 κ°€λŠ₯ν•˜λ©° 음수인 경우, λΆ€ν˜Έμ—†λŠ” μ •μˆ˜λ‘œ μžλ™ λ³€ν™˜λœλ‹€.

κ³±μ…ˆμ΄λ‚˜ λ‚˜λˆ—μ…ˆ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆλŠ”λ°, ꡳ이 μ‰¬ν”„νŠΈ μ—°μ‚°μžλ₯Ό μ œκ³΅ν•˜λŠ” μ΄μœ λŠ” 속도 λ•Œλ¬Έμ΄λ‹€.

8>>2이 8/4보닀 속도가 더 빠름

κ·ΈλŸ¬λ‚˜ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰μ†λ„λ„μ€‘μš”ν•˜μ§€λ§Œ ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•  λ•Œ μ½”λ“œμ˜ 가독성 (readability)도 μ€‘μš”ν•˜λ‹€. μ‰¬ν”„νŠΈ μ—°μ‚°μžκ°€ 속도가 λΉ λ₯΄κΈ΄ 해도 κ³±μ…ˆμ΄λ‚˜ λ‚˜λˆ—μ…ˆ μ—°μ‚°μž λ³΄λ‹€λŠ” 가독성이 λ–¨μ–΄μ§ˆ 것이닀. μ‰¬ν”„νŠΈ μ—°μ‚°μžλ³΄λ‹€ κ³±μ…ˆ λ˜λŠ” λ‚˜λˆ—μ…ˆ μ—°μ‚°μžλ₯Ό 주둜 μ‚¬μš©ν•˜κ³ , 보닀 λΉ λ₯Έ 싀행속도가 μš”κ΅¬λ˜μ–΄μ§€λŠ” 곳만 μ‰¬ν”„νŠΈ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

  • 예제 3-30 OperatorEx30.java ν‘œ 3-18의 λ‚΄μš©μ„ 직접 확인할 수 μžˆλŠ” 예제
    class OperatorEx30 {
    	public static void main(String[] args) {
    		int dec = 8;
    
    		System.out.printf("%d >> %d = %4d \t%s%n", dec, 0, dec >> 0, toBinaryString(dec >> 0));
    		System.out.printf("%d >> %d = %4d \t%s%n", dec, 1, dec >> 1, toBinaryString(dec >> 1));
    		System.out.printf("%d >> %d = %4d \t%s%n", dec, 2, dec >> 2, toBinaryString(dec >> 2));
    
    		System.out.printf("%d << %d = %4d \t%s%n", dec, 0, dec << 0, toBinaryString(dec << 0));
    		System.out.printf("%d << %d = %4d \t%s%n", dec, 1, dec << 1, toBinaryString(dec << 1));
    		System.out.printf("%d << %d = %4d \t%s%n", dec, 2, dec << 2, toBinaryString(dec << 2));
    		System.out.println();
    
    		dec = -8;
    		System.out.printf("%d >> %d = %4d \t%s%n", dec, 0, dec >> 0, toBinaryString(dec >> 0));
    		System.out.printf("%d >> %d = %4d \t%s%n", dec, 1, dec >> 1, toBinaryString(dec >> 1));
    		System.out.printf("%d >> %d = %4d \t%s%n", dec, 2, dec >> 2, toBinaryString(dec >> 2));
    
    		System.out.printf("%d << %d = %4d \t%s%n", dec, 0, dec << 0, toBinaryString(dec << 0));
    		System.out.printf("%d << %d = %4d \t%s%n", dec, 1, dec << 1, toBinaryString(dec << 1));
    		System.out.printf("%d << %d = %4d \t%s%n", dec, 2, dec << 2, toBinaryString(dec << 2));
    		System.out.println();
    
    		dec = 8;
    		System.out.printf("%d >> %2d = %4d \t%s%n", dec, 0,  dec >> 0,  toBinaryString(dec << 2));
    		System.out.printf("%d >> %2d = %4d \t%s%n", dec, 32, dec >> 32, toBinaryString(dec << 2));
    	} // main의 끝
    
    	// 10μ§„ μ •μˆ˜λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” λ©”μ„œλ“œ
    	static String toBinaryString(int x) {
    		String zero = "00000000000000000000000000000000";
    		String tmp = zero + Integer.toBinaryString(x);
    
    		return tmp.substring(tmp.length()-32);
    	}
    }
  • 예제 3-31 OperatorEx31.java μ‰¬ν”„νŠΈ, λΉ„νŠΈAND μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ 16μ§„μˆ˜λ₯Ό λμ—μ„œλΆ€ν„° ν•œμžλ¦¬μ”© λ½‘μ•„λ‚΄λŠ” 예제
    λΉ„νŠΈANDμ—°μ‚°μžλŠ” 두 bitκ°€ λͺ¨λ‘ 1일 λ•Œλ§Œ 1이 λ˜λ―€λ‘œ 0xABCD와 0x000Fλ₯Ό λΉ„νŠΈANDμ—°μ‚°ν•˜λ©΄ λ§ˆμ§€λ§‰ 자리만 남고 λ‚˜λ¨Έμ§€μžλ¦¬λŠ” λͺ¨λ‘ 0μ΄λœλ‹€.
    class OperatorEx31 {
    	public static void main(String[] args) {
    		int dec  = 1234; 
    		int hex  = 0xABCD;
    		int mask = 0xF;
    
    		System.out.printf("hex=%X%n", hex);
    		System.out.printf("%X%n", hex & mask);
    		
    		hex = hex >> 4;
    		System.out.printf("%X%n", hex & mask);
    
    		hex = hex >> 4;
    		System.out.printf("%X%n", hex & mask);
    
    		hex = hex >> 4;
    		System.out.printf("%X%n", hex & mask);
    	} // main의 끝
    }

6. κ·Έ μ™Έμ˜ μ—°μ‚°μž

6.1 쑰건 μ—°μ‚°μž ? :

6.2 λŒ€μž… μ—°μ‚°μž = op=

lvalue와 rvalue

λŒ€μž… μ—°μ‚°μžμ˜ μ™Όμͺ½ ν”Όμ—°μ‚°μžλ₯Ό β€˜lvalue(left value)’이라 ν•˜κ³ , 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžλ₯Ό β€˜rvalue(right value)’라고 ν•œλ‹€.

μ—°

6번

float celcius = (float) ((int) (5/9.0f * (fahrenheit - 32) * 1000 + 0.5) * 0.001);

Uploaded by N2T