λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Programming/Java

μžλ°”[Java] μ ‘κ·Ό μ œμ–΄μž[Access modifier]

728x90
λ°˜μ‘ν˜•

μžλ°”μ˜ μ ‘κ·Ό μ œμ–΄μž default / public(package) / private / protected / static / final

β–Ά default(package)

κ°€μž₯ 기본적인 μ ‘κ·Ό μ œμ–΄μžλ‘œ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€. => μ ‘κ·Ό μ œμ–΄μžλ₯Ό μƒλž΅ν•˜λ©΄ default둜 μ„€μ •λœλ‹€.

defaultλŠ” 같은 νŒ¨ν‚€μ§€ 내에 μžˆλŠ” class라면 접근이 κ°€λŠ₯ν•˜λ‹€.

testPackage1 νŒ¨ν‚€μ§€ / TestClass1 클래슀
testPackage2 νŒ¨ν‚€μ§€ / TestClass2 클래슀

1번 νŒ¨ν‚€μ§€μ— 1번 클래슀λ₯Ό μ •μ˜ν•˜μ˜€λ‹€.

2번 νŒ¨ν‚€μ§€λ₯Ό λ§Œλ“€κ³  2번 클래슀λ₯Ό λ§Œλ“€κ³  2번 ν΄λž˜μŠ€μ— 1번 클래슀λ₯Ό 뢈러였기(import)λ₯Ό ν–ˆμ„ λ•Œ, 였λ₯˜ λ°œμƒ

=> 같은 νŒ¨ν‚€μ§€ μ•ˆμ—μ„œλ§Œ 뢈러였기 κ°€λŠ₯

 

β–Ά public

μ΄λ¦„μ²˜λŸΌ μ–΄λ””μ„œλ“  뢈러올 수 μžˆλ‹€.

 

λ‹€λ₯Έ νŒ¨ν‚€μ§€ μ•ˆμ˜ λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œλ„ λΆˆλŸ¬μ™€ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

testPackage1 / TestClass1

testPackage1 νŒ¨ν‚€μ§€μ— μžˆλŠ” TestClass2 클래슀의  μ ‘κ·Ό μ œμ–΄μžλ₯Ό public으둜 변경해쀬닀.

testPackage2 νŒ¨ν‚€μ§€ / TestClass2 클래슀

testPackage2 νŒ¨ν‚€μ§€μ˜ TestClass2 ν΄λž˜μŠ€μ—μ„œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆλŠ” TestClass1을 λΆˆλŸ¬μ™€λ„ 잘 μž‘λ™λœλ‹€.

β–Ά private

μžμ‹ μ„ μ œμ™Έν•œ λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό λΆˆκ°€λŠ₯

 

였직 μžμ‹ μ˜ 클래슀 μ•ˆμ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.

 

private / public 으둜 ν•„λ“œ κ°’ 생성
public 으둜 μ •μ˜λœ publicNum만 μ ‘κ·Ό κ°€λŠ₯

testPackage1 νŒ¨ν‚€μ§€μ˜ TestClass1 ν΄λž˜μŠ€μ— ν•„λ“œ 값을 μƒμ„±ν–ˆλ‹€. (public int, private int 1κ°œμ”©)

TestClass1은 public이기 λ•Œλ¬Έμ— λ‹€λ₯Έ νŒ¨ν‚€μ§€(testPackage2)μ—μ„œ λ‹€λ₯Έ 클래슀(testClass2)둜 import ν•  수 μžˆμ—ˆμ§€λ§Œ, ν•„λ“œ 값은 publicNum 밖에 μ ‘κ·Όν•˜μ§€ λͺ»ν•œλ‹€.

 

 

β–· private μ ‘κ·Όμžλ₯Ό μ“°λŠ” 이유?

 

ν΄λž˜μŠ€λŠ” 좔상적인 κ°œλ…μ„ 정리해 놓고 ν•΄λ‹Ή 클래슀λ₯Ό 상속받은 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬μ²΄ν™”μ‹œμΌœμ„œ μ‚¬μš©ν•œλ‹€. ex). μƒμœ„ 클래슀 : λ„ν˜•, 동물... / ν•˜μœ„ 클래슀 : μ‚¬κ°ν˜•, μ‚Όκ°ν˜•...    강아지, 고양이...

 

μ΄λ•Œ, κ°€μž₯ 큰 틀인 μƒμœ„ 클래슀의 ν•„λ“œ 값을 직접 μ ‘κ·Όν•˜λ©΄ ν•˜μœ„ ν΄λž˜μŠ€λ“€μ—κ²Œ λ¬Έμ œκ°€ λ°œμƒν•  μˆ˜λ„ 있고 μ‚¬μš©μžμ˜ 잘λͺ»λœ 값을 μž…λ ₯받을 μˆ˜λ„ μžˆλ‹€.

 

ex): 잘λͺ»λœ κ°’ λŒ€μž… : 1~100κΉŒμ§€λ§Œ μ €μž₯ν•΄μ•Ό ν•˜λŠ” λ³€μˆ˜μ— μ‚¬μš©μžκ°€ 200을 μ €μž₯ 

 

이 같은 문제λ₯Ό λ°©μ§€ν•˜κ³ μž 일반적으둜 ν•„λ“œ 값은 private둜 μ •μ˜ν•˜κ³  getter / setter ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ ν•„λ“œ 값에 μ ‘κ·Όν•œλ‹€.

β–Ά protected

같은 νŒ¨ν‚€μ§€ ν˜Ήμ€ μƒμ†ν•œ ν•˜μœ„(μžμ‹, μ„œλΈŒ) ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ / 상속받지 μ•Šμ€ ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ μ‚¬μš© λΆˆκ°€λŠ₯

protected / private μ ‘κ·Ό μ œμ–΄μž ν•„λ“œ κ°’ 생성
ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•œ ν•„λ“œ κ°’ 확인 

testPackage1 νŒ¨ν‚€μ§€ μ•ˆμ˜ μƒμœ„ 클래슀인 SuperClassμ—μ„œ protected와 private ν•„λ“œ 값을 각각 μƒμ„±ν–ˆμ„ λ•Œ,

testPackage2 νŒ¨ν‚€μ§€μ—μ„œ ν•˜μœ„ 클래슀인 SubClassμ—μ„œλŠ” protected둜 μ •μ˜λœ ν•„λ“œ κ°’λ§Œ 접근이 κ°€λŠ₯ν•œ κ±Έ 확인할 수 μžˆλ‹€.

β–Ά static

β–·κ³΅μœ  λ©”λͺ¨λ¦¬μ— 쑴재

 

static으둜 μ •μ˜λœ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ 곡유 λ©”λͺ¨λ¦¬μ— μƒμ£Όν•˜λ©΄μ„œ μ‚¬μš©λœλ‹€.

 

일반적으둜 객체λ₯Ό 생성할 λ•Œλ©΄ λ©”λͺ¨λ¦¬ 곡간을 μ°¨μ§€ν•˜κ²Œ λœλ‹€.

 

ν•˜μ§€λ§Œ, μƒμˆ˜ κ°’μ²˜λŸΌ λ³€ν•¨μ—†λŠ” κ°’μ˜ 경우 λ°˜λ³΅ν•΄μ„œ μƒμ„±ν•˜κ²Œ 되면 λ©”λͺ¨λ¦¬λ₯Ό λ‚­λΉ„ν•˜λŠ” 꼴이 될 수 μžˆλ‹€.

 

μ΄λ•Œ 반볡적으둜 μ‚¬μš©λ˜λŠ” κ°μ²΄λŠ” 곡유 λ©”λͺ¨λ¦¬μ— ν•œ 번만 μ €μž₯μ‹œν‚¨ ν›„ ν•„μš”ν•  λ•Œλ§ˆλ‹€ λΆˆλŸ¬μ™€ μ‚¬μš©ν•˜λ©΄ λ©”λͺ¨λ¦¬λ₯Ό 더 효율적으둜 μ‚¬μš©ν•  수 있게 λœλ‹€. 

 

ex)

A ν΄λž˜μŠ€μ—λŠ” λ°μ΄ν„°1, 데이터 2, 데이터 3 이 μžˆλ‹€κ³  κ°€μ •

 

데이터 1은 값이 μ ˆλŒ€ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν–ˆμ„ λ•Œ, A클래슀λ₯Ό λ°˜λ³΅ν•΄μ„œ μƒμ„±ν•˜κ²Œ 뢈러였게 되면 λ³€ν•˜μ§€ μ•Šμ„ 값인 λ°μ΄ν„° 1을 λ°˜λ³΅ν•΄μ„œ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ²Œ λ˜μ–΄ λΉ„νš¨μœ¨μ μ΄λ‹€.

 

λ³€ν•˜μ§€ μ•Šμ„ 데이터 κ°’(예λ₯Ό λ“€μ–΄ μƒμˆ˜) 은 static으둜 μ •μ˜ν•˜μ—¬ 곡유 λ©”λͺ¨λ¦¬μ— μ €μž₯ -> λ©”λͺ¨λ¦¬ νš¨μœ¨μ„± 증가

 

 

 

 

 

 

 

 

β–·static끼리만 ν˜Έν™˜

 

static으둜 μ •μ˜λœ 데이터λ₯Ό μ–΄λ””μ„œλ“  μ‚¬μš©ν•  수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€.

 

static으둜 μ •μ˜λœ λ°μ΄ν„°λŠ” 같이 static으둜 μ •μ˜λœ ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

λŒ€ν‘œμ μΈ static ν΄λž˜μŠ€λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” main ν΄λž˜μŠ€κ°€ μžˆλ‹€.

static 데이터와 static 클래슀

static으둜 μ •μ˜λœ main ν΄λž˜μŠ€μ—μ„œ static으둜 μ •μ˜λœ MAX_NUM 데이터 값이 잘 μ‚¬μš©λœλ‹€.

static 데이터와 static이 μ•„λ‹Œ 클래슀

static이 μ•„λ‹Œ 클래슀 μ•ˆμ—μ„œ static으둜 μ •μ˜λœ 데이터λ₯Ό λΆˆλŸ¬μ™€ μ‚¬μš©ν•  λ•Œμ˜ λͺ¨μŠ΅μ΄λ‹€.

 

ν”„λ‘œκ·Έλž¨ μ‹œμž‘ μ „μ—λŠ” 문법적 μ—λŸ¬κ°€ μ—†μ–΄μ„œ 경고문이 λ‚˜νƒ€λ‚˜μ§€ μ•Šμ§€λ§Œ, ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ μœ„μ²˜λŸΌ μ—λŸ¬κ°€ λ‚˜λ©° μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

 

MAX_NUM은 곡유 λ©”λͺ¨λ¦¬μ— μƒμ£Όλ˜λŠ” static 데이터인데 static이 μ•„λ‹Œ ν΄λž˜μŠ€μ—μ„œ λΆˆλŸ¬μ™”κΈ° λ•Œλ¬Έμ΄λ‹€.

 

이처럼 static λ°μ΄ν„°λŠ” static ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

 

β–Ά final

μƒμˆ˜λ₯Ό μ €μž₯ν•˜λŠ” μ ‘κ·Ό μ œμ–΄μž

 

final의 κ²½μš°λŠ” staticμ—μ„œ 잠깐 λ‚˜μ™”λŠ”λ° μƒμˆ˜(λ³€ν•˜μ§€ μ•ŠλŠ” κ°’)λ₯Ό μ €μž₯ν•  λ•Œ μ‚¬μš©λœλ‹€.

μƒμˆ˜ κ°’ λ³€κ²½ 였λ₯˜

final둜 μ •μ˜λœ MAX_NUM의 값을 λ³€κ²½ν•˜λ €κ³  ν•˜λ©΄ 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚˜μ˜¨λ‹€.

 

λ³€κ²½λ˜μ–΄μ„œλŠ” μ•ˆ λ˜λŠ” 값이 경우, μ‚¬μš©μž ν˜Ήμ€ κ°œλ°œμžκ°€ μ‹€μˆ˜λ‘œλΌλ„ λ³€κ²½ν•  수 μ—†λ„λ‘œ final둜 μ •μ˜ν•œλ‹€.

 

β–· ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œ 생성 κ°€λŠ₯

 

final둜 μ •μ˜λœ 값은 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œ 생성 κ°€λŠ₯ν•˜λ‹€. -> 같은 이름, λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ£Όμ†Œ

 

ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμœ„ ν΄λž˜μŠ€μ— μ’…μ†λ˜μ–΄ 있기 λ•Œλ¬Έμ— μƒμœ„ 클래슀의 데이터 값에 직접 κ°€λŠ₯, ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ MAX_NUM μƒμˆ˜ κ°’ μƒˆλ‘œ 생성 κ°€λŠ₯

μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μƒμˆ˜ κ°’ μ •μ˜
ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒμˆ˜ κ°’ μž¬μ •μ˜ 및 getterν•¨μˆ˜ μ •μ˜

ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μœ„ 사진과 같이 μƒμˆ˜ 값을 μž¬μ •μ˜ ν•œ ν›„ getter ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄ 리턴 값을 μƒˆλ‘œ μ •μ˜λœ μƒμˆ˜ κ°’μœΌλ‘œ ν•΄μ€€λ‹€.

μƒμˆ˜ λ³€κ²½ ν…ŒμŠ€νŠΈ

ν…ŒμŠ€νŠΈν•΄λ³΄λ©΄ ν•˜μœ„ 클래슀의 μƒμˆ˜ 값이 잘 λ‚˜μ˜€λŠ” κ±Έ 확인할 수 μžˆλ‹€.

728x90
λ°˜μ‘ν˜•