๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] ์•„์ดํ…œ 4. ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๊ฑฐ๋“  private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

by applemango2021 2022. 3. 27.

์ •์  ๋ฉ”์†Œ๋“œ(Static Method)์™€ ์ •์  ํ•„๋“œ(Static Field)๋งŒ์„ ๋‹ด์€ ํด๋ž˜์Šค์˜ ์˜ˆ

1) ๊ธฐ๋ณธ ํƒ€์ž… ๊ฐ’์ด๋‚˜ ๋ฐฐ์—ด ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋“ค์„ ๋ชจ์•„๋†“์€ ํด๋ž˜์Šค 

- java.lang.Math ํด๋ž˜์Šค๋Š” 2๊ฐœ์˜ ๋ณ€์ˆ˜์™€ 70์—ฌ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ์ „๋ถ€ static์ด๋‹ค.

๋ง์…ˆ, ๊ณฑ์…ˆ, ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ ๋“ฑ ๊ธฐ๋ณธ์ ์ธ ์ˆ˜ํ•™ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋งŒํผ, ๊ฐ์ฒด๋งˆ๋‹ค ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ’๊ณผ ๋กœ์ง์„ ๊ฐ€์ง€๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฅผ static์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ ์•„๋‹๊นŒ ์‹ถ๋‹ค.

Math ํด๋ž˜์Šค์˜ API ๋ฌธ์„œ

 

2) ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์ •์  ๋ฉ”์„œ๋“œ(ํ˜น์€ ํŒฉํ† ๋ฆฌ)๋ฅผ ๋ชจ์•„๋†“์€ ํด๋ž˜์Šค

- java.util.Collections๋Š” ๋ฌธ์„œ ์ดˆ๋ฐ˜์— ๋Œ€๋†“๊ณ  ์ปฌ๋ ‰์…˜์„ ๋ฆฌํ„ดํ•˜๊ฑฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ๋‹ค๋ฃจ๋Š” static method๋งŒ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•œ๋‹ค. 

์•„์˜ˆ ์ฒซ์ค„์— "This class consists exclusively of static methods"๋ผ๊ณ  ํ•œ๋‹ค

 

๊ทธ๋Ÿฐ๋ฐ, ์ฑ…์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” "ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค" ๊ฐ€ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌด์Šจ ์˜๋ฏธ์ธ๊ฐ€ ์‹ถ๋‹ค.

API ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด Collections ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์€ boolean, int์™€ ๊ฐ™์€ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€๋ถ€๋ถ„ Collection, List์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๊ฐ’์„ ๋ฐ›๊ณ , ๋˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

์ด์ค‘์—์„œ checkedList๋ผ๋Š” ์•„๋ž˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด List<E>์™€ Class<E> ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ List<E>๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

๋”ฑํžˆ List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ์•ˆ ๋“ค์—ˆ๋Š”๋ฐ,  ๋‚ด์šฉ์„ ์ž์„ธํžˆ ๋ณด๋‹ˆ์ƒํ™ฉ์— ๋”ฐ๋ผ CheckedRandomAccessList ํ˜น์€ CheckedList ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. ์ฐพ์•„๋ณด๋ฉด ๋‘ ๊ฐœ ํด๋ž˜์Šค ๋ชจ๋‘ Collections ๋‚ด๋ถ€์—์„œ List๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

์•„๋งˆ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ณ์—๋Š” List, Collection ๋“ฑ์˜ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์„ ๋ฆฌํ„ดํ•œ๋‹ค๊ณ  ๋˜์–ด ์žˆ์–ด๋„ ์‹ค์ œ๋กœ๋Š” ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค๋Š” ์˜๋ฏธ์ด์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.  

 

3) Final ํด๋ž˜์Šค์™€ ๊ด€๋ จํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ๋ชจ์•„๋†“์€ ํด๋ž˜์Šค 

- ์ผ๋‹จ, final ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Formatter๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค. ํ•œ ๋ฒˆ๋„ ์จ๋ณธ์ ์€ ์—†๋Š”๋ฐ, ์—ฌํŠผ ์ด ํด๋ž˜์Šค์—๋Š” final ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค. Formatter์˜ toString() ๋ฉ”์„œ๋“œ๋ฅผ  ์“ธ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์–ด์„œ  Formatter๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์ธ ExtendFinalClass๋ฅผ ๋งŒ๋“œ๋ ค๊ณ  ํ–ˆ๋‹ค๊ณ  ํ•˜์ž.

ํ•˜์ง€๋งŒ IDE๊ฐ€ ์นœ์ ˆํ•˜๊ฒŒ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฑ‰์–ด์ค€๋‹ค. Final์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ ์ž์ฒด์— '๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š”'์ด๋ผ๋Š” ์˜๋ฏธ ์ด์™ธ์—๋„  'ํ™•์žฅ๋  ์ˆ˜ ์—†๋Š”' ๋ผ๋Š” ์˜๋ฏธ๋„ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ์•„๋‹๊นŒ ์‹ถ๋‹ค. 

์—ฌํŠผ, ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด Fomatter๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š” static ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

ExtendFinalClass์—๋Š” 1๊ฐœ์˜ static method๋งŒ ์žˆ๋‹ค
ExtendFinalClass๋ฅผ ์ด์šฉํ•ด์„œ Formatter์˜ ๊ตฌํ˜„์ฒด๋“ค์ด ๋™์ผํ•œ ํ–‰์œ„๋ฅผ ํ•˜๋„๋ก ํ•œ๋‹ค

์ผ๋‹ค Formatter๊ฐ€ ๋ญํ•˜๋Š”์ง€๋„ ์ž˜ ๋ชจ๋ฅด๋Š” ํด๋ž˜์Šค์ธ๋ฐ, final class๋ผ๋Š” ์ด์œ  ํ•˜๋‚˜๋งŒ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์ ์ ˆํ•œ ์˜ˆ์‹œ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์กฐ์Šˆ์•„์”จ๊ฐ€ ๋Œ€๋žต ์ด๋Ÿฐ ๋Š๋‚Œ์œผ๋กœ ๋งํ•œ ๊ฒƒ ๊ฐ™๋‹ค. 

 

์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๋ฉด Private ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ

์œ„์™€ ๊ฐ™์ด '์ •์  ๋ฉค๋ฒ„๋งŒ ๋‹ด์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค'๋Š” ๋Œ€๊ฐœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋ ค๊ณ  ์„ค๊ณ„ํ•œ ํด๋ž˜์Šค๋“ค์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ExtendFinalClass extendFinalClass = new ExtendFinalClass()๋ฅผ ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋งŒ๋“  ExtendFinalClass๋Š” ์•„๋ž˜ 14๋ฒˆ์งธ ์ค„์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

๋‹น์—ฐํ•˜๋‹ค. ๋‚ด๊ฐ€ ๋”ฐ๋กœ ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด publicํ•œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

ํŒŒ์ผ๋ช…์„ ๋ณด๋ฉด .java๊ฐ€ ์•„๋‹ˆ๋ผ .class, ์ฆ‰ ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์ด๋‹ค

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ExtendFinalClass์˜ ์˜๋„๋ฅผ ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ์šฉ์ž๋Š” ๋งˆ์Œ๋Œ€๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ private์ธ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด๋‘”๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ์‹œ์— publicํ•œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์ƒ๊ฒจ๋‚˜์ง€๋„ ์•Š์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. 

9๋ฒˆ์งธ ์ค„์˜ AssertionError()๋Š” ExtendFinalClass ๋‚ด๋ถ€์—์„œ๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋„ฃ์–ด๋†“์€ ๋กœ์ง์ด๋‹ค. ์ €๋ ‡๊ฒŒ ์—๋Ÿฌ(Exception์ด ์•„๋‹Œ Error์ด๋‹ค)๋ฅผ ๋˜์ง€๋„๋ก ํ•ด๋†“๊ณ  18๋ฒˆ์งธ ๋ผ์ธ์—์„œ ExtendFinalClass ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋ณด์•˜๋‹ค.

ExtendFinalClass๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Item04 ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์—๋Ÿฌ๋ฅผ ๋ฑ‰์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉˆ์ถฐ๋ฒ„๋ฆฐ๋‹ค. 

 

๋”๋ณด๊ธฐ

AssertionError์— ๋Œ€ํ•œ ์—ฌ๋‹ด

 

์žฅ์˜ ์ฃผ์ œ์™€๋Š” ๋ฒ—์–ด๋‚˜์ง€๋งŒ, ์ƒ์„ฑ์ž ์•ˆ์— Error๊ฐ€ ์•„๋‹Œ RuntimeException์„ ๋˜์ง€๋„๋ก ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ”์„ธ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

9๋ฒˆ์งธ ์ค„์—์„œ Error๊ฐ€ ์•„๋‹Œ Exception์„ ๋˜์ง€๋„๋ก ํ–ˆ๋‹ค.

AssertionError๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์—๋Š” ๊ทธ๋ž˜๋„ "do something"์€ ์ถœ๋ ฅํ–ˆ๋Š”๋ฐ, RuntimeException์€ ์•„๋ฌด๊ฒƒ๋„ ๋˜์ง€์ง€ ์•Š๋Š”๋‹ค. ์™ค๊นŒ?

 

๊ฒฐ๋ก 

- ์ •์  ํ•„๋“œ์™€ ์ •์  ๋ฉ”์„œ๋“œ๋งŒ์„ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค๋“ค์€ ๋Œ€๊ฐœ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์œ ํ‹ธ๋ฆฌํ‹ฐ ์„ฑ ํด๋ž˜์Šค๋“ค์€ ๋Œ€๊ฐœ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. 

- ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๋ฉด private ์ƒ์„ฑ์ž๊ฐ€ ๋ถ™์€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๊ผญ ๋งŒ๋“ค์–ด๋‘์–ด๋ผ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ publicํ•œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

- ์กฐ๊ธˆ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰๊ณ  ์‹ถ๋‹ค๋ฉด, private ๊ธฐ๋ณธ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฑ‰๋„๋ก ํ•ด๋ผ.