Search

μ ‘κ·Όμ§€μ •μž

μ ‘κ·Όμ§€μ •μž

μ ‘κ·Όμ§€μ •μžλŠ” 클래슀, λ©”μ„œλ“œ, λ³€μˆ˜μ˜ μ ‘κ·Ό λ²”μœ„λ₯Ό μ œν•œν•˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.
public(λͺ¨λ“  κ³³μ—μ„œ μ ‘κ·Ό κ°€λŠ₯), protected(같은 νŒ¨ν‚€μ§€μ™€ μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯), default(같은 νŒ¨ν‚€μ§€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯), private(같은 클래슀 λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯)이 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œμ˜ μ•ˆμ •μ„±κ³Ό μΊ‘μŠν™”λ₯Ό μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

μ ‘κ·Όμ§€μ •μž

β€’
public
β€’
protected
β€’
default
β€’
private

public vs protected vs defaultp vs private

μ ‘κ·Ό μ§€μ •μž
같은 클래슀
같은 νŒ¨ν‚€μ§€
λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ‹ 클래슀
λ‹€λ₯Έ νŒ¨ν‚€μ§€
public
O
O
O
O
protected
O
O
O
X
default
O
O
X
X
private
O
X
X
X

μ ‘κ·Ό λ²”μœ„

public > protected > default > private
μ ‘κ·Όμ§€μ •μžλŠ” ν΄λž˜μŠ€μ™€ κ·Έ 멀버듀(λ³€μˆ˜, λ©”μ„œλ“œ, 쀑첩 클래슀 λ“±)의 μ ‘κ·Ό λ²”μœ„λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€:
β€’
public: κ°€μž₯ 넓은 λ²”μœ„λ‘œ, μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€. λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œλ„ 자유둭게 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
protected: 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œμ™€ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 상속 관계가 μžˆμ„ λ•Œ μ€‘μš”ν•œ 의미λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
β€’
default: μ ‘κ·Ό μ œν•œμžλ₯Ό λͺ…μ‹œν•˜μ§€ μ•Šμ„ λ•Œ μžλ™μœΌλ‘œ 적용되며, 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
β€’
private: κ°€μž₯ μ œν•œμ μΈ λ²”μœ„λ‘œ, 같은 클래슀 λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. μ™ΈλΆ€μ—μ„œλŠ” 직접 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ‚¬μš© λͺ©μ 

β€’
μΊ‘μŠν™”(Encapsulation): 데이터와 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ¬Άκ³  μ™ΈλΆ€μ—μ„œμ˜ 접근을 μ œν•œν•˜μ—¬ μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ λ†’μž…λ‹ˆλ‹€.
β€’
정보 은닉(Information Hiding): κ΅¬ν˜„ μ„ΈλΆ€ 사항을 숨기고 ν•„μš”ν•œ μΈν„°νŽ˜μ΄μŠ€λ§Œ λ…ΈμΆœμ‹œμΌœ λ³΅μž‘μ„±μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
β€’
μ½”λ“œ μ•ˆμ •μ„±: μ™ΈλΆ€μ—μ„œ 데이터λ₯Ό 직접 μ‘°μž‘ν•˜μ§€ λͺ»ν•˜κ²Œ ν•¨μœΌλ‘œμ¨ μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.
β€’
μ½”λ“œ μœ μ§€λ³΄μˆ˜: λ‚΄λΆ€ κ΅¬ν˜„μ„ 변경해도 μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€κ°€ μœ μ§€λ˜λ©΄ λ‹€λ₯Έ 뢀뢄에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
β€’
λ³΄μ•ˆ: λ―Όκ°ν•œ λ°μ΄ν„°λ‚˜ κΈ°λŠ₯에 λŒ€ν•œ 접근을 μ œν•œν•˜μ—¬ λ³΄μ•ˆμ„ κ°•ν™”ν•©λ‹ˆλ‹€.

μ ‘κ·Ό μ§€μ •μž λΆ„λ₯˜

1. public

β€’
κ°€μž₯ 넓은 λ²”μœ„μ˜ μ ‘κ·Ό μ§€μ •μž
β€’
ν”„λ‘œμ νŠΈ μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯
β€’
λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œλ„ 자유둭게 μ ‘κ·Όν•  수 있음
β€’
예: public class, public method, public variable

2. protected

β€’
동일 νŒ¨ν‚€μ§€ λ‚΄μ˜ ν΄λž˜μŠ€μ™€ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯
β€’
상속 κ΄€κ³„μ—μ„œ μ€‘μš”ν•œ μ—­ν• 
β€’
예: protected method, protected variable

3. default (package-private)

β€’
μ ‘κ·Ό μ œν•œμžλ₯Ό λͺ…μ‹œν•˜μ§€ μ•Šμ„ λ•Œ μžλ™μœΌλ‘œ 적용됨
β€’
같은 νŒ¨ν‚€μ§€ λ‚΄μ˜ ν΄λž˜μŠ€λ“€λ§Œ μ ‘κ·Ό κ°€λŠ₯
β€’
λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ ν΄λž˜μŠ€λŠ” μ ‘κ·Ό λΆˆκ°€
β€’
예: class, method, variable (μ ‘κ·Ό μ œν•œμž 없이 μ„ μ–Έ)

4. private

β€’
κ°€μž₯ μ œν•œμ μΈ μ ‘κ·Ό μ§€μ •μž
β€’
동일 클래슀 λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
β€’
클래슀 μ™ΈλΆ€μ—μ„œλŠ” 직접 μ ‘κ·Ό λΆˆκ°€
β€’
μΊ‘μŠν™”λ₯Ό μœ„ν•΄ 주둜 μ‚¬μš©λ¨
β€’
예: private method, private variable
// μ ‘κ·Όμ§€μ •μž 예제 μ½”λ“œ package com.example; public class AccessModifierExample { public String publicVar = "λˆ„κ΅¬λ‚˜ μ ‘κ·Ό κ°€λŠ₯"; protected String protectedVar = "같은 νŒ¨ν‚€μ§€ λ˜λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯"; String defaultVar = "같은 νŒ¨ν‚€μ§€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯"; private String privateVar = "같은 ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯"; public void publicMethod() { System.out.println("곡개 λ©”μ„œλ“œμž…λ‹ˆλ‹€."); } protected void protectedMethod() { System.out.println("보호된 λ©”μ„œλ“œμž…λ‹ˆλ‹€."); } void defaultMethod() { System.out.println("κΈ°λ³Έ λ©”μ„œλ“œμž…λ‹ˆλ‹€."); } private void privateMethod() { System.out.println("λΉ„κ³΅κ°œ λ©”μ„œλ“œμž…λ‹ˆλ‹€."); } }
Java
볡사

μ ‘κ·Ό μ§€μ •μž μ‚¬μš© μ‹œ 고렀사항

β€’
ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ μ ‘κ·Ό λ²”μœ„λ₯Ό μ„ νƒν•˜λŠ” 것이 μ’‹μŒ (μΊ‘μŠν™” 원칙)
β€’
클래슀 멀버 λ³€μˆ˜λŠ” 보톡 private으둜 μ„ μ–Έν•˜κ³  getter/setterλ₯Ό 톡해 μ ‘κ·Ό
β€’
상속을 κ³ λ €ν•  λ•ŒλŠ” protected μ‚¬μš©μ„ κ²€ν† 
β€’
API둜 μ œκ³΅λ˜λŠ” κΈ°λŠ₯은 public으둜 μ„ μ–Έ

μ ‘κ·Όμ§€μ •μž μ˜ˆμ‹œμ½”λ“œ

// packageA/Person.java package packageA; public class Person { public String publicName = "λˆ„κ΅¬λ‚˜ μ ‘κ·Ό κ°€λŠ₯ν•œ 이름"; protected int protectedAge = 30; String defaultAddress = "μ„œμšΈμ‹œ"; // default μ ‘κ·Ό μ§€μ •μž private String privatePhoneNumber = "010-1234-5678"; public void publicMethod() { System.out.println("λͺ¨λ“  κ³³μ—μ„œ 호좜 κ°€λŠ₯ν•œ λ©”μ†Œλ“œ"); } protected void protectedMethod() { System.out.println("같은 νŒ¨ν‚€μ§€μ™€ μžμ‹ ν΄λž˜μŠ€μ—μ„œ 호좜 κ°€λŠ₯ν•œ λ©”μ†Œλ“œ"); } void defaultMethod() { System.out.println("같은 νŒ¨ν‚€μ§€μ—μ„œλ§Œ 호좜 κ°€λŠ₯ν•œ λ©”μ†Œλ“œ"); } private void privateMethod() { System.out.println("같은 클래슀 λ‚΄μ—μ„œλ§Œ 호좜 κ°€λŠ₯ν•œ λ©”μ†Œλ“œ"); // privatePhoneNumber에 μ ‘κ·Ό κ°€λŠ₯ System.out.println("μ „ν™”λ²ˆν˜Έ: " + privatePhoneNumber); } }
Java
볡사
// packageB/Student.java package packageB; import packageA.Person; public class Student extends Person { public void accessTest() { // λΆ€λͺ¨ 클래슀(Person)의 멀버에 μ ‘κ·Ό ν…ŒμŠ€νŠΈ System.out.println(publicName); // public - μ ‘κ·Ό κ°€λŠ₯ System.out.println(protectedAge); // protected - μžμ‹ ν΄λž˜μŠ€μ΄λ―€λ‘œ μ ‘κ·Ό κ°€λŠ₯ // System.out.println(defaultAddress); // default - λ‹€λ₯Έ νŒ¨ν‚€μ§€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ // System.out.println(privatePhoneNumber); // private - λ‹€λ₯Έ ν΄λž˜μŠ€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ publicMethod(); // public - μ ‘κ·Ό κ°€λŠ₯ protectedMethod(); // protected - μžμ‹ ν΄λž˜μŠ€μ΄λ―€λ‘œ μ ‘κ·Ό κ°€λŠ₯ // defaultMethod(); // default - λ‹€λ₯Έ νŒ¨ν‚€μ§€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ // privateMethod(); // private - λ‹€λ₯Έ ν΄λž˜μŠ€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ } }
Java
볡사
// packageB/Manager.java package packageB; import packageA.Person; public class Manager { public void accessTest() { Person person = new Person(); // Person 클래슀의 멀버에 μ ‘κ·Ό ν…ŒμŠ€νŠΈ System.out.println(person.publicName); // public - μ ‘κ·Ό κ°€λŠ₯ // System.out.println(person.protectedAge); // protected - μžμ‹ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλ―€λ‘œ μ ‘κ·Ό λΆˆκ°€ // System.out.println(person.defaultAddress); // default - λ‹€λ₯Έ νŒ¨ν‚€μ§€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ // System.out.println(person.privatePhoneNumber); // private - λ‹€λ₯Έ ν΄λž˜μŠ€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ person.publicMethod(); // public - μ ‘κ·Ό κ°€λŠ₯ // person.protectedMethod(); // protected - μžμ‹ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλ―€λ‘œ μ ‘κ·Ό λΆˆκ°€ // person.defaultMethod(); // default - λ‹€λ₯Έ νŒ¨ν‚€μ§€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ // person.privateMethod(); // private - λ‹€λ₯Έ ν΄λž˜μŠ€λΌμ„œ μ ‘κ·Ό λΆˆκ°€ } }
Java
볡사

μ ‘κ·Όμ§€μ •μž μ˜ˆμ‹œ μ„€λͺ…

μœ„ μ½”λ“œ μ˜ˆμ‹œλŠ” μ„Έ 가지 클래슀λ₯Ό 톡해 μ„œλ‘œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ™€ 상속 κ΄€κ³„μ—μ„œ 각 μ ‘κ·Ό μ§€μ •μžκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ λ³΄μ—¬μ€λ‹ˆλ‹€:
β€’
Person 클래슀(packageA): λͺ¨λ“  μ ‘κ·Ό μ§€μ •μžλ₯Ό 가진 멀버 λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
β€’
Student 클래슀(packageB): Person을 상속받아 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ μžμ‹ 클래슀둜 μ ‘κ·Όν•˜λŠ” 상황을 λ³΄μ—¬μ€λ‹ˆλ‹€.
β€’
Manager 클래슀(packageB): Person의 객체λ₯Ό 생성해 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ 일반적인 μ‚¬μš© κ΄€κ³„λ‘œ μ ‘κ·Όν•˜λŠ” 상황을 λ³΄μ—¬μ€λ‹ˆλ‹€.