Study 3. μ—°μ‚°μž πŸ™‚

정지은·2023λ…„ 1μ›” 17일
1

JAVAλ₯Ό μž‘μ•„~

λͺ©λ‘ 보기
3/15
post-thumbnail

Today's Study


  1. μ‚°μˆ  μ—°μ‚°μž
  2. λΉ„νŠΈ μ—°μ‚°μž
  3. 관계 μ—°μ‚°μž
  4. 논리 μ—°μ‚°μž
  5. instanceof
  6. assignment(=) operator
  7. ν™”μ‚΄ν‘œ(->) μ—°μ‚°μž
  8. 3ν•­ μ—°μ‚°μž
  9. μ—°μ‚°μž μš°μ„  μˆœμœ„
  10. (optional) Java 13. switch μ—°μ‚°μž

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


λ§μ…ˆ(+), λΊ„μ…ˆ(-), κ³±μ…ˆ(x), λ‚˜λˆ—μ…ˆ(/), λ‚˜λ¨Έμ§€(%)κ°€ μžˆλ‹€.

νŠΉμ§•

  1. ν”Όμ—°μ‚°μžλ“€μ˜ νƒ€μž…μ΄ λ™μΌν•˜μ§€ μ•Šμ„ λ•Œ, μžλ™ νƒ€μž… λ³€ν™˜μ΄ λœλ‹€.

    • (byte, char, short) + int -> int + int = int
    • int + long -> long + long = long
    • int + double/float -> double/float + double/float
      = double/float ( double/float을 크기가 큰 μ‹€μˆ˜ νƒ€μž…μœΌλ‘œ λ³€ν™˜)
  2. μ—°μ‚°μ˜ μ‚°μΆœκ°’μ΄ μ‚°μΆœ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.

    • μ‚°μΆœκ°’μ΄ 데이터 νƒ€μž…μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ²Œ 되면 μ˜€λ²„ν”Œλ‘œμš° 및 μ“°λ ˆκΈ° κ°’ 이 λ°œμƒν•œλ‹€.
      => μ˜€λ²„ν”Œλ‘œμš° 탐지 λ©”μ†Œλ“œ ν•„μˆ˜
    // μ΅œλŒ€κ°’ 초과
    if(n > Integer.MAX_VALUE){
    	throw new ArithmeticException("μ˜€λ²„ν”Œλ‘œμš° λ°œμƒ");
    }
    
    // μ΅œμ†Œκ°’ 미만
    if(n > Integer.MIN_VALUE){
    	throw new ArithmeticException("μ˜€λ²„ν”Œλ‘œμš° λ°œμƒ");
    }
  3. μ‹€μˆ˜λŠ” κ·Όμ‚¬μΉ˜λ‘œ κ³„μ‚°λ˜κΈ° λ•Œλ¬Έμ— μ •ν™•ν•œ 계산을 μœ„ν•΄μ„œλŠ” μ •μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

  4. 0으둜 λ‚˜λˆ΄μ„ λ•Œμ˜ Infinite, NaN 문제

    • /와 %을 μ‚¬μš©ν• λ•Œ 우츑 ν”Όμ—°μ‚°μžλŠ” 0 μ‚¬μš© λΆˆκ°€
      => ArthmenticException μ˜ˆμ™Έ λ°œμƒ

    • 우츑 ν”Όμ—°μ‚°μžκ°€ 0.0 μ΄λ‚˜ 0.0f 인 경우
      / -> Infinity (λ¬΄ν•œλŒ€)
      % -> NaN(Not a Number)

    • λ”°λΌμ„œ / 은 Double.isInfinite()λ₯Ό μ‚¬μš©ν•΄ Infinityλ₯Ό ν™•μΈν•˜κ³  %λŠ” Double.isNaN()λ₯Ό μ‚¬μš©ν•΄ NaN을 확인해쀀닀.

    • μ‹€μˆ˜λ₯Ό μž…λ ₯으둜 받을 κ²½μš°λŠ” NaN 검사 ν•„μˆ˜!
      ( NaN은 != 을 μ œμ™Έν•œ λͺ¨λ“  λΉ„κ΅μ—°μ‚°μžμ˜ κ²°κ³Όκ°€ falseμ΄λ―€λ‘œ ==이 μ•„λ‹Œ Double.isNaN()을 μ‚¬μš©ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. )



2. λΉ„νŠΈ μ—°μ‚°μž


λΉ„νŠΈ μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžλ₯Ό λΉ„νŠΈλ‹¨μœ„λ‘œ λ…Όλ¦¬μ—°μ‚°ν•˜λŠ” κ²ƒμœΌλ‘œ μ •μˆ˜λ§Œ ν—ˆμš©ν•œλ‹€.

λΉ„νŠΈ 이동 μ—°μ‚°μž

  1. x << y (left SHIFT)
    : μ •μˆ˜ x의 각 λΉ„νŠΈλ₯Ό y만큼 μ™Όμͺ½μœΌλ‘œ μ΄λ™μ‹œν‚¨ ν›„ λΉˆμžλ¦¬λŠ” 0으둜 μ±„μš΄λ‹€.
  2. x >> y (right SHIFT)
    : μ •μˆ˜ x의 각 λΉ„νŠΈλ₯Ό y만큼 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™μ‹œν‚¨ 수 λΉˆμžλ¦¬λŠ” x의 μ΅œμƒμœ„ λΉ„νŠΈμ™€ 같은 κ°’μœΌλ‘œ μ±„μš΄λ‹€.
  3. x >>> y (unsigned right SHIFT)
    : μ •μˆ˜ x의 각 λΉ„νŠΈλ₯Ό y만큼 였λ₯Έμͺ½μœΌλ‘œ 이동킀기고 λΉˆμžλ¦¬λŠ” 0으둜 μ±„μš΄λ‹€.
int a = 1;			// a = 0000 0000 0000 0000 0000 0000 0000 0001
int b = a << 1;		// b = 0000 0000 0000 0000 0000 0000 0000 0010
int c = ~a;			// c = 1111 1111 1111 1111 1111 1111 1111 1110
int d = c >> 1;		// d = 1111 1111 1111 1111 1111 1111 1111 1111 
int e = c >>> 1;	// e = 0111 1111 1111 1111 1111 1111 1111 1111

λΉ„νŠΈ 논리 μ—°μ‚°μž

  1. & (AND) : 두 λΉ„νŠΈ λͺ¨λ‘ 1일 κ²½μš°μ—λ§Œ 1
  2. | (OR) : 두 λΉ„νŠΈ 쀑 ν•˜λ‚˜λ§Œ 1일 κ²½μš°μ—λ§Œ 1
  3. ^ (XOR) : 두 λΉ„νŠΈκ°€ λ‹€λ₯Ό κ²½μš°μ—λ§Œ 1
  4. ~ (NOT) : λΉ„νŠΈ λ°˜μ „
XYX | YX & YX ^ Y~X
111100
101010
011011
000001


3. 관계 μ—°μ‚°μž


두 ν”Όμ—°μ‚°μžλ₯Ό λΉ„κ΅ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” μ—°μ‚°μžλ‘œ λŒ€μ†ŒλΉ„κ΅μ—°μ‚°μž ( >, <, >=, <= ) 와 λ“±κ°€λΉ„κ΅μ—°μ‚°μž ( ==, != )κ°€ μžˆλ‹€. μ—°μ‚°κ²°κ³ΌλŠ” 였직 true, false 쀑에 ν•˜λ‚˜μ΄λ‹€.

νŠΉμ§•

  1. μ‚°μˆ μ—°μ‚°μž μ—μ„œ λ§ν–ˆλ˜ κ²ƒμ²˜λŸΌ ν”Όμ—°μ‚°μžμ˜ νƒ€μž…μ΄ λ‹€λ₯Ό 경우 λ²”μœ„κ°€ 큰 μͺ½μœΌλ‘œ μžλ™ν˜•λ³€ν™˜λœλ‹€.
  2. λŒ€μ†ŒλΉ„κ΅μ—°μ‚°μžλŠ” boolean을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μžλ£Œν˜•μ— μ‚¬μš©ν•  수 μžˆμ§€λ§Œ μ°Έμ‘°ν˜•μ€ μ‚¬μš©ν•  수 μ—†λ‹€.
  3. λ“±κ°€λΉ„κ΅μ—°μ‚°μžλŠ” λͺ¨λ“  μžλ£Œν˜•μ— μ‚¬μš©ν•  수 μžˆλ‹€. κΈ°λ³Έν˜•μ˜ 경우, λ³€μˆ˜μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 값을 λΉ„κ΅ν•˜κ³  μ°Έμ‘°ν˜•μ˜ 경우, 두 ν”Όμ—°μ‚°μžμ˜ μ°Έμ‘°λ³€μˆ˜κ°€ 같은 객체λ₯Ό κ°€λ¦¬ν‚€λŠ”μ§€ λΉ„κ΅ν•œλ‹€. ( μ°Έμ‘°ν˜•κ³Ό κΈ°λ³Έν˜•μ€ μ„œλ‘œ ν˜•λ³€ν™˜μ΄ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ 비ꡐ할 수 μ—†λ‹€.)

❗ λ¬Έμžμ—΄μ„ 비ꡐ할 λ•ŒλŠ” == 보닀 equals()λΌλŠ” λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μž.



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


  1. && (AND) : ν”Όμ—°μ‚°μž 쀑 μ–΄λŠ ν•œμͺ½λ§Œ true이면 true
  2. || (OR) : ν”Όμ—°μ‚°μž μ–‘μͺ½ λͺ¨λ‘ true μΌλ•Œλ§Œ true

🧐 Short-Circuit Evalustion (SCE) μ΄λž€?

&&의 μ™Όμͺ½ ν”Όμ—°μ‚°μžκ°€ false이면 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžλ₯Ό ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.
||의 μ™Όμͺ½ ν”Όμ—°μ‚°μžκ°€ true이면 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžλ₯Ό ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.

public class Operator {
	public static void main(String[] args){
    	int num1 = 0;
        int num2 = 0;
        boolean result;
        
        result = ((num1 += 10 < 0) && ((num2 += 10) > 0);
        System.out.println(num1);	//10
        System.out.println(num2);	//0
        System.out.println(result);	//false
    }
}

이 λ•Œ num2λŠ” μ™œ 0일까? μ΄μœ κ°€ SCEλ•Œλ¬Έμ΄λ‹€. ((num1 += 10 < 0) && ((num2 += 10) > 0) 이 연산을 μ§„ν–‰ν•  λ•Œ, &&의 μ™ΌνŽΈμ— μžˆλŠ” 연산이 λ¨Όμ € μ§„ν–‰λ˜μ–΄ num2값은 10이 λœλ‹€. λ”°λΌμ„œ (num1 += 10 < 0)의 κ²°κ³ΌλŠ” falseκ°€ λ˜μ–΄ 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžλ₯Ό ν™•μΈν•˜μ§€ μ•Šκ³  λ°”λ‘œ falseλ₯Ό λ°˜ν™˜ν•˜λŠ” 것이닀. κ·Έλž˜μ„œ num2의 계산은 μ§„ν–‰μ‘°μ°¨ λ˜μ§€ μ•ŠλŠ”λ‹€.



5. instance of


κ°μ²΄νƒ€μž…μ„ ν™•μΈν•˜λŠ” μ—°μ‚°μžλ‘œ true/false둜 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

  • 주둜 상속 κ΄€κ³„μ—μ„œ λΆ€λͺ¨κ°μ²΄μΈμ§€ μžμ‹ 객체인지 ν™•μΈν•˜λŠ” 데 μ‚¬μš©ν•œλ‹€. (ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ 내집이 λ§žλŠ”μ§€ ν™•μΈν•˜λŠ” λŠλ‚Œ)
  • trueλΌλŠ” 것은 μ°Έμ‘°λ³€μˆ˜κ°€ κ²€μ‚¬ν•œ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것을 λœ»ν•œλ‹€.
  • 값이 null인 μ°Έμ‘°λ³€μˆ˜μ— λŒ€ν•΄μ„œλŠ” false의 결과값을 κ°€μ§„λ‹€.
class Parent{}
class Child extends Parent{}

public class InstanceofTest {
	public static void main(String[] args){
    	Parent parent = new Parent();
        child child = new Child();
        
        System.out.println( parent instanceof Parent);	// true
        System.out.println( child instanceof Parent);	//true
        System.out.println( parent instanceof Child);	//false
        System.out.println( child instanceof Child);	//true
    }
}

본인이 본인집을 μ°Ύκ³  μžμ‹μ΄ 상속받은 λΆ€λͺ¨μ§‘을 μ°ΎλŠ” 것은 true이닀. ν•˜μ§€λ§Œ λΆ€λͺ¨κ°€ μžμ‹μ§‘μ„ μ°ΎλŠ” 경우만 falseκ°€ 된 것을 확인할 수 μžˆλ‹€.



6. assignment(=) operator


λŒ€μž… μ—°μ‚°μžλ‘œ λ³€μˆ˜μ— 값을 λŒ€μž…ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 이항 μ—°μ‚°μžμ΄λ‹€. ν”Όμ—°μ‚°μžλ“€μ˜ κ²°ν•© λ°©ν–₯은 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μ΄λ‹€.

λŒ€μž…μ—°μ‚°μžμ—λŠ” =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>= κ°€ 있고 λͺ¨λ‘ = μ•žμͺ½μ— 연산을 ν•œ ν›„, κ·Έ 결과값을 μ™Όμͺ½μ˜ ν”Όμ—°μ‚°μžμ— λŒ€μž…ν•˜λ©΄ λœλ‹€.



7. ν™”μ‚΄ν‘œ(->) μ—°μ‚°μž


Java 8 버전 λ•Œ, μΆ”κ°€λœ κ²ƒμœΌλ‘œ λžŒλ‹€ ν‘œν˜„μ‹κ³Ό ν•¨κ»˜ μ‚¬μš©λœλ‹€.

(argument, ...) -> {expression}

int min(int x, int y){
	return x < y ? x : y ;
}

(x, y) -> x < y ? x : y;
  • λžŒλ‹€μ‹μ€ λ©”μ†Œλ“œλ₯Ό λ³€μˆ˜μ²˜λŸΌ λ‹€λ£° 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.
  • λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆλŠ” κ²½μš°μ—λŠ” νƒ€μž…μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.


8. 3ν•­ μ—°μ‚°μž


쑰건식 ? ν”Όμ—°μ‚°μž1 : ν”Όμ—°μ‚°μž2
μ‘°κ±΄μ‹μ˜ 결과에 따라 true이면 ν”Όμ—°μ‚°μž1이 결과이고 false이면 ν”Όμ—°μ‚°μž 2κ°€ 결과이닀.

if ( x > Y )
	result = x;
else
	result = y;
    
result = ( x > y ) ? x : y ;

λ‹€μŒκ³Ό 같이 if 문을 3ν•­μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ§§κ³  κ°„κ²°ν•˜κ²Œ ν•˜μ—¬ 가독성을 높일 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€. ν•˜μ§€λ§Œ 3ν•­μ—°μ‚°μžκ°€ 속도가 더 λΉ λ₯Έ 것은 μ•„λ‹ˆλ‹€. λ”°λΌμ„œ if문의 연산이 λ³΅μž‘ν•œ κ²½μš°μ—λŠ” 였히렀 3ν•­μ—°μ‚°μžλ‘œ μž‘μ„±ν•˜λŠ” 것이 더 λ³΅μž‘ν•  수 μžˆμœΌλ―€λ‘œ κ²½μš°μ— 따라 잘 μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.



9. μ—°μ‚°μž μš°μ„  μˆœμœ„


μš°μ„ μˆœμœ„μ—°μ‚°μžν”Όμ—°μ‚°μžμ—°μ‚°λ°©ν–₯
0()κ΄„ν˜Έ 속 μ—°μ‚°μžλ‹€μ–‘->
1증감(++, --), λΆ€ν˜Έ(+, -), λΉ„νŠΈ(~), 논리(!)단항<-
2μ‚°μˆ (*, /, %)이항->
3μ‚°μˆ (+, -)이항->
4μ‰¬ν”„νŠΈ (>>, <<)이항->
5비ꡐ(<, >, <=, >=, instanceof)이항->
6비ꡐ(==, !=)이항->
7논리 &이항(단항)->
8논리 ^이항(단항)->
9논리이항(단항)
10논리 &&이항->
11논리
123ν•­μ—°μ‚°μžμ‚Όν•­->
13λŒ€μž…μ—°μ‚°μž(=, +=, -=, *=, /=, %=, &=, ^=,=, <<=, >>=, >>>=)이항


10. (optional) Java 13. switch μ—°μ‚°μž


기쑴의 switch문이 λ³€κ²½λœ 것이 μ•„λ‹ˆλΌ switchμ—°μ‚°μžκ°€ λ”°λ‘œ μΆ”κ°€ λœκ²ƒμ΄λ‹€.

  • break λŒ€μ‹  yieldλ₯Ό μ‚¬μš©ν•΄ return값을 적어쀄 수 μžˆλ‹€.
  • case : λŒ€μ‹  case -> 도 μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.


Reference


λ³Έ μŠ€ν„°λ””λŠ” 2020 λ°±κΈ°μ„ λ‹˜μ˜ μžλ°”μŠ€ν„°λ””μ˜ μ»€λ¦¬ν˜λŸΌμ„ μ°Έκ³ ν•˜μ—¬ μ§„ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€