item 61 jihoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[item61] ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ

Java์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…

  • ๋ฐ์ดํ„ฐ ํƒ€์ž…

    • ๊ธฐ๋ณธ(Primitive) ํƒ€์ž…
    • ์ฐธ์กฐ(Reference) ํƒ€์ž…
  • ๊ธฐ๋ณธ ํƒ€์ž…์—๋Š” ๋Œ€์‘ํ•˜๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด ํ•˜๋‚˜์”ฉ ์žˆ๊ณ , ์ด๋ฅผ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค.

    • Integer(int)
    • Double(double)
    • Boolean(boolean)

๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ์ฐจ์ด์ 

  • ๊ธฐ๋ณธ ํƒ€์ž…์€ ๊ฐ’๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜, ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์€ ๊ฐ’์— ๋”ํ•ด ์‹๋ณ„์„ฑ(identity)์ด๋ž€ ์†์„ฑ์„ ๊ฐ–๋Š”๋‹ค(๊ฐ’์ด ๊ฐ™์•„๋„ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๊ณ  ์‹๋ณ„๋  ์ˆ˜ ์žˆ๋‹ค).
  • ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฐ’์€ ์–ธ์ œ๋‚˜ ์œ ํšจํ•˜๋‚˜, ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’(null)์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋ณธ ํƒ€์ž…์ด ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฉด์—์„œ ๋” ํšจ์œจ์ ์ด๋‹ค.

๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ์ฐจ์ด๋ฅผ ๋ฌด์‹œํ•œ ๋Œ€๊ฐ€

// ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ1
Comparator<Integer> naturalOrder = (i, j) -> (j < j) ? -1 : (i == j ? 0 : 1);

naturalOrder.compare(new Integer(42), new Integer(42)); // 1

// TMI
naturalOrder.compare(Integer.valueOf(42), Integer.valueOf(42)); // 0
naturalOrder.compare(Integer.valueOf(123456789), Integer.valueOf(123456789)); // 1

์ฒซ ๋ฒˆ์งธ ๊ฒ€์‚ฌ(i < j)์—์„œ๋Š” i์™€ j๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์˜คํ† ๋ฐ•์‹ฑ๋œ Integer ์ธ์Šคํ„ด์Šค๋Š” ๊ธฐ๋ณธ ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์ž˜ ๋™์ž‘ํ•œ๋‹ค.
๋‘ ๋ฒˆ์งธ ๊ฒ€์‚ฌ(i == j)์—์„œ ๋‘ '๊ฐ์ฒด ์ฐธ์กฐ'์˜ ์‹๋ณ„์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ฒŒ ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
i์™€ j๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ Integer ์ธ์Šคํ„ด์Šค๋ผ์„œ ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€ false๊ฐ€ ๋˜๊ณ , comparator๋Š” 1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์— == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๊ฐœ ๋‚ด๊ฐ€ ์›ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค.


๊ธฐ๋ณธ ํƒ€์ž…์„ ๋‹ค๋ฃจ๋Š” Comparator๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด Comparator.NaturalOrder()๋ฅผ ์‚ฌ์šฉํ•˜์ž

List<Integer> values = Arrays.asList(212, 324, 435, 566, 133, 100, 121); 
values.sort(Comparator.naturalOrder()); // 100, 121, 133, 212, 324, 435, 566 (์˜ค๋ฆ„์ฐจ์ˆœ)

// ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•œ Comparator
Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> {
	int i = iBoxed, j = jBoxed; // ์˜คํ† ๋ฐ•์‹ฑ
	return i < j ? -1 : (i == j ? 0 : 1);
}


// ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ2
public class Unbelievable {
	static Integer i;
	
	public static void main(String[] args) {
		if (i == 42)
			System.out.println("Unbelievable");
	}
}

i == 42๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ NullPointerException์„ ๋˜์ง„๋‹ค. ์›์ธ์€ int๊ฐ€ ์•„๋‹ˆ๋ผ Integer์ธ i์˜ ์ดˆ๊นƒ๊ฐ’์ด null์ด๋ผ๋Š” ๋ฐ ์žˆ๋‹ค.
i == 42์—์„œ Integer์™€ int๋ฅผ ๋น„๊ตํ•˜๊ฒŒ ๋˜๊ณ , ๊ฑฐ์˜ ์˜ˆ์™ธ ์—†์ด ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ํ˜ผ์šฉํ•œ ์—ฐ์‚ฐ์—์„œ๋Š” ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑ์ด ์ž๋™์œผ๋กœ ํ’€๋ฆฐ๋‹ค.
๊ทธ๋ฆฌ๊ณ  null ์ฐธ์กฐ๋ฅผ ์–ธ๋ฐ•์‹ฑํ•˜๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•œ๋‹ค.

// ํ•ด๊ฒฐ
static int i;

// ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ3
public static void main(String[] args) {
	Long sum = 0L;
	
	for (long i = 0; i <= Integer.MAX_VALUE; i++) {
		sum += i;
	}
	System.out.println(sum);
}

์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š” ์—†์ง€๋งŒ, ์ง€์—ญ ๋ณ€์ˆ˜ sum์„ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜์—ฌ for๋ฌธ์˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋งŒํผ ๋ฐ•์‹ฑ์ด ์ผ์–ด๋‚˜ ์„ฑ๋Šฅ์ด ๋А๋ ค์ง„๋‹ค.

๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • ์ปฌ๋ ‰์…˜์˜ ์›์†Œ, ํ‚ค, ๊ฐ’
    • ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์ด๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ๋ฉ”์„œ๋“œ์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์จ์•ผ ํ•œ๋‹ค(Java๊ฐ€ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค).
      • E.g.
        Threadlocal<int>     // ๋ถˆ๊ฐ€๋Šฅ
        Threadlocal<Integer> // ๊ฐ€๋Šฅ
  • ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•  ๋•Œ

ํ•ต์‹ฌ ์ •๋ฆฌ

  • ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅธ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ.
  • ์˜คํ† ๋ฐ•์‹ฑ์ด ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ๊ทธ ์œ„ํ—˜๊นŒ์ง€ ์—†์• ์ฃผ์ง€ ์•Š์œผ๋‹ˆ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.
  • ์ฃผ์˜ํ•ด์•ผ ํ•  ์‚ฌํ•ญ
    • ๋‘ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ == ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•œ๋‹ค๋ฉด ์‹๋ณ„์„ฑ ๋น„๊ต๊ฐ€ ์ด๋ค„์ง€๊ณ , ์ด๋Š” ์›ํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์•„๋‹ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.
    • ๊ฐ™์€ ์—ฐ์‚ฐ์—์„œ ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ํ˜ผ์šฉํ•˜๋ฉด ์–ธ๋ฐ•์‹ฑ์ด ์ด๋ค„์ง€๋ฉฐ, null ์ฐธ์กฐ๋ฅผ ์–ธ๋ฐ•์‹ฑํ•˜๋ฉด NullpointerException์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • ๊ธฐ๋ณธ ํƒ€์ž…์„ ๋ฐ•์‹ฑํ•˜๋Š” ์ž‘์—…์€ '๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ'์„ ํ•˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ