μƒˆμ†Œμ‹

Java

[Java] 06. μΊ‘μŠν™”μ™€ 정보 은닉

  • -

πŸ“Œ μΊ‘μŠν™”μ™€ 정보 은닉

μ•Œμ•½μ€ ν•˜λ‚˜μ˜ 캑슐둜 약듀이 λ¬Άμ—¬μžˆμ–΄ κ΄€λ¦¬ν•˜κΈ° νŽΈν•˜κ³ , κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ μ΅œμ†Œν•œμ˜ λͺ¨μ–‘λ§Œ μœ μ§€ν•©λ‹ˆλ‹€.

μ•Œμ•½μ€ 각 κΈ°λŠ₯을 ν•˜λŠ” 성뢄듀을 ν•˜λ‚˜μ˜ μΊ‘μŠμ— λ¬Άμ–΄ μ‚¬μš©μžκ°€ λ¨Ήκ±°λ‚˜ κ΄€λ¦¬ν•˜λŠ” 것을 νŽΈν•˜κ²Œ ν•©λ‹ˆλ‹€. λ˜ν•œ μ•Œμ•½μ€ κ·Έ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μ΅œμ†Œν•œμ˜ λΆ€λΆ„ 즉 μ™Έν˜•λ§Œ κ³΅κ°œν•˜κ³  κ·Έ μ™Έμ˜ 것은 μˆ¨κΉλ‹ˆλ‹€. 이λ₯Ό 톡해 ν™˜μžλ“€μ€ μ•Œμ•½μ„ μ‰½κ²Œ μ„­μ·¨ν•˜κ³  μ•½μœΌλ‘œμ„œ 편히 μ‚¬μš©ν•  수 μžˆλŠ” 것 μž…λ‹ˆλ‹€.

μžλ°” κ°μ²΄λŠ” 데이터λ₯Ό 가지고 μžˆλŠ” "멀버 ν•„λ“œ"와 κ·Έ κΈ°λŠ₯을 ν•˜λŠ” "λ©”μ„œλ“œ"둜 κΈ°λŠ₯듀이 λ¬Άμ—¬μžˆμŠ΅λ‹ˆλ‹€. λ•Œλ¬Έμ— κ°œλ°œμžλ‚˜ μ‚¬μš©μžκ°€ 객체λ₯Ό μœ μ§€  및 λ³΄μˆ˜ν•˜κΈ° μ’‹μŠ΅λ‹ˆλ‹€. λ˜ν•œ 객체의 멀버 ν•„λ“œλ‚˜ λ©”μ„œλ“œ 쀑 ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ ‘κ·Όν•˜λ„λ‘ ν•˜μ—¬ λΆ€μ μ ˆν•œ 접근을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ I. μΊ‘μŠν™”μ™€ μ •λ³΄ μ€λ‹‰

πŸ“š 1. μΊ‘μŠν™”(Encapsulation)

  • "데이터"와 κ΄€λ ¨λœ "λ©”μ„œλ“œ"듀을 ν•˜λ‚˜μ˜ 객체둜 λ¬ΆλŠ” 것을 의미
  • λ‚΄λΆ€λ₯Ό λ³΄ν˜Έν•˜μ—¬ 보닀 쉽고 μ•ˆμ „ν•œ μ‚¬μš©μ„ κ°€λŠ₯ν•˜κ²Œ 함
  • μžλ°”λŠ” λ‹¨μœ„ 객체λ₯Ό λͺ¨μ•„ 큰 클래슀둜 λ§Œλ“€ 수 있기 λ•Œλ¬Έμ— λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ 클래슀둜 λ§Œλ“€μ–΄μ•Όν•˜λŠ” 것은 μ•„λ‹˜
  • μΊ‘μŠν™”κ°€ 잘 λ˜μ–΄μžˆλ‹€λ©΄ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ λ³€κ²½λ˜λ”λΌλ„ κ΄€λ ¨λœ λ‚˜λ¨Έμ§€ ν΄λž˜μŠ€λŠ” μ΅œμ†Œν•œμœΌλ‘œ 변경됨

πŸ“š 2. 멀버 ν•„λ“œμ— λŒ€ν•œ λΆ€μ μ ˆν•œ μ ‘κ·Ό 예

public class CircleTest2 {

  public static void main(String[] args) {
    Circle c1;
    c1 = new Cricle();
    c1.radius = 1;
    
    System.out.print("λ°˜μ§€λ¦„ " + c1.radius + "인");
    System.out.print("μ›μ˜ λ‘˜λ ˆλŠ” " + c1.getCircumference());
    
    c1.radius = -99 // λΆ€μ μ ˆν•œ μ ‘κ·ΌμœΌλ‘œ μ›μ˜ λ°˜μ§€λ¦„μ„ κ°‘μžκΈ° 음수둜 λ°”κΏ€ 수 있음
    
    System.out.print("μ›μ˜ λ„“μ΄λŠ” " + c1.getArea());
  }
}

λ°˜μ§€λ¦„μ€ 항상 0보닀 크게 μœ μ§€λ˜μ–΄μ•Όν• ν…λ° 객체가 일을 ν•˜κΈ° μ „ λΆˆν•„μš”ν•˜κ²Œ 값이 λ°”λ€ŒλŠ” κ²½μš°κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이렇듯 객체가 슀슀둜 일을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•ˆμ „ν•œ μ²˜λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€. λ•Œλ¬Έμ— ν•¨λΆ€λ‘œ 객체 내뢀에 듀어가지 λͺ»ν•˜λ„둝 μ΅œμ†Œν•œμ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œ λ“€μ–΄λ‚΄λŠ” 정보 은닉(Information Hiding)이 ν•„μš”ν•©λ‹ˆλ‹€.


πŸ“š 3. 정보은닉(Information Hiding)

  • 객체 외뢀에 μ΅œμ†Œν•œμ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ λ“œλŸ¬λ‚΄κ³  객체의 λ‚΄λΆ€ κ΅¬ν˜„μ€ 숨길 수 있음
  • λΆ€μ μ ˆν•œ μ²˜λ¦¬μ™€ λ³΅μž‘ν•œ κ΅¬ν˜„μ„ λ§‰μŒ
  • TV μžμ²΄λŠ” λ³΅μž‘ν•˜κ²Œ κ΅¬ν˜„λ˜μ§€λ§Œ μ‹œμ²­μžλŠ” TV 리λͺ¨μ»¨λ§ŒμœΌλ‘œ TVλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 λΉ„μŠ·ν•¨
  • 멀버 λ³€μˆ˜ μ„ μ–Έμ‹œ private μ ‘κ·Όμ œμ–΄ μ§€μ •μžλ₯Ό μ΄μš©ν•˜μ—¬ 객체 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•˜λ„λ‘ ν•  수 있음

[2. 멀버 ν•„λ“œμ— λŒ€ν•œ λΆ€μ μ ˆν•œ μ ‘κ·Ό 예]μ—μ„œ λ³Έ Circle κ°μ²΄λŠ” λ°˜μ§€λ¦„μ— λΆ€μ μ ˆν•˜κ²Œ μ ‘κ·Όν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. radius 멀버 public으둜 λ§Œλ“€μ–΄ λ©”μ„œλ“œλ₯Ό ν†΅ν•œ μ•ˆμ „ν•œ μ ‘κ·Όλ§Œ ν—ˆμš©λ˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ“š 4. 각쒅 λ³€μˆ˜μ˜ κΈ°λ³Έ 유효 λ²”μœ„

(1) 지역 λ³€μˆ˜μ™€ 맀개 λ³€μˆ˜

  • ν•΄λ‹Ή λ©”μ„œλ“œ μ•ˆμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯
  • λ©”μ„œλ“œ μ‹œμž‘ μ‹œ μžλ™ ν• λ‹Ή, λ©”μ„œλ“œ λ°˜ν™˜ μ²˜λ¦¬μ—μ„œ μžλ™ ν•΄μ œ
  • μžλ°”μ˜ λͺ¨λ“  λ³€μˆ˜λŠ” class μ•ˆμ—μ„œ μ„ μ–Έλ˜κΈ° λ•Œλ¬Έμ— μ „μ—­ λ³€μˆ˜κ°€ μ—†μŒ

(2) 멀버 λ³€μˆ˜

  • λͺ¨λ“  멀버 λ³€μˆ˜λ“€μ€ κ·Έ 클래슀 객체 μ „μ²΄μ—μ„œ μœ νš¨ν•œ λ²”μœ„λ₯Ό 가짐
  • 객체가 μƒμ„±λ˜λ©΄ ν• λ‹Ήλ˜κ³ , 객체가 μ†Œλ©Έλ˜λ©΄ ν• λ‹Ή ν•΄μ œλ¨
  • 객체 속성을 μ§€μ •ν•˜κΈ° λ•Œλ¬Έμ— 객체가 μƒμ„±λ˜μ–΄μ•Ό μ ‘κ·Όν•  수 있음

πŸ“š 5. 멀버 μ ‘κ·Ό μ œν•œ

멀버에 μ ‘κ·Όν•˜λŠ” 클래슀 λ©€λ²„μ˜ μ ‘κ·Ό μ§€μ •μž
 private default protected public
같은 νŒ¨ν‚€μ§€μ˜ 클래슀 X O O O
λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ 클래슀 X X X O
μ ‘κ·Ό κ°€λŠ₯ μ˜μ—­ 클래슀 λ‚΄ 동일 νŒ¨ν‚€μ§€ λ‚΄ 동일 νŒ¨ν‚€μ§€μ™€
μžμ‹ 클래슀
λͺ¨λ“  클래슀

πŸ“š 6. Access λ©”μ„œλ“œ

  • μ ‘κ·Ό μ§€μ •μžλ‘œ μ™ΈλΆ€μ—μ„œ 값을 λ³€κ²½ν•˜μ§€ λͺ»ν•˜λ„둝 μ„€μ •ν•  λ•Œ, λ‚΄λΆ€ 접근이 κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” 것이 Access λ©”μ„œλ“œ
  • 클래슀 μ‚¬μš©μ„ μœ„ν•΄ 객체 μ™ΈλΆ€μ—μ„œ λΆ€μ μ ˆν•œ μ²˜λ¦¬κ°€ λ˜μ§€ μ•Šλ„λ‘ 함
  • νŠΉμ • 멀버 λ³€μˆ˜μ˜ 값을 λ°˜ν™˜ν•˜λŠ” getter( ) λ©”μ„œλ“œ, νŠΉμ • 멀버 λ³€μˆ˜λ₯Ό μ‹€μΈμˆ˜ κ°’μœΌλ‘œ μ„€μ •ν•˜λŠ” setter( ) λ©”μ„œλ“œ 쑴재
  • μ•ˆμ „ν•œ 접근을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ λ‹Ήμž₯ ν•„μš”μ—†λ”λΌλ„ μ•”λ¬΅μ μœΌλ‘œ 객체 멀버λ₯Ό μ‘°μž‘ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œλ₯Ό 미리 λ§Œλ“¦

πŸ“š 7. default ν΄λž˜μŠ€μ™€ public 클래슀

(1) default 클래슀

  • μ ‘κ·Όμ œν•œμžλ₯Ό 아무것도 적지 μ•Šμ„ λ•Œ κΈ°λ³Έ κ°’
  • 같은 νŒ¨ν‚€μ§€ λ‚΄λΆ€μ—μ„œλ§Œ 객체 생성이 κ°€λŠ₯

(2) public 클래슀

  • class ν‚€μ›Œλ“œ μ•žμ— public을 μΆ”κ°€ν•˜μ—¬ μ–΄λ””μ„œλ‚˜ 클래슀 객체 생성을 ν—ˆμš©
  • ν•˜λ‚˜μ˜ μ†ŒμŠ€ νŒŒμΌμ—λŠ” ν•˜λ‚˜μ˜ 클래슀만 public이 될 수 있음
  • μ†ŒμŠ€ 파일의 이름과 클래슀의 이름이 λ°˜λ“œμ‹œ κ°™μ•„μ•Ό 함

 


πŸ“Œ II. μƒμ„±μž

πŸ“š 1. μƒμ„±μž

  • 객체가 생성될 λ•Œ λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•  ν•„μš”λŠ” 없이 단 ν•œ 번 μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” μΌμ’…μ˜ λ©”μ„œλ“œ
  • Setter와 달리 객체의 멀버 λ³€μˆ˜λ₯Ό μžλ™μœΌλ‘œ μ΄ˆκΈ°ν™”ν•΄μ€Œ
[μ ‘κ·Όμ œν•œ] <μƒμ„±μžλͺ…> (λ§€κ°œλ³€μˆ˜1, ... ,λ§€κ°œλ³€μˆ˜ n)

μƒμ„±μž κ΅¬ν˜„ 쑰건은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. μƒμ„±μžλŠ” public μ˜μ—­μ— μ„ μ–Έν•˜μ—¬ 데이터 멀버λ₯Ό μ΄ˆκΈ°ν™” μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. μƒμ„±μž 이름은 클래슀 이름과 같아야함
  2. λ°˜λ“œμ‹œ λ°˜ν™˜ μžλ£Œν˜•μ΄ μ§€μ •λ˜μ§€ μ•Šμ•„μ•Όν•¨
Circle();

πŸ“š 2. default μƒμ„±μž

  • ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 단 ν•˜λ‚˜λ„ λͺ…μ‹œμ μœΌλ‘œ μƒμ„±μžλ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ€ 경우 μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μžλ™μœΌλ‘œ 제곡
  • μƒμ„±μžκ°€ ν•˜λ‚˜λΌλ„ μ •μ˜λ˜μ–΄ 있으면 μ œκ³΅λ˜μ§€ μ•ŠμŒ
  • μΈμžκ°€ μ—†λŠ” μƒμ„±μžλ‘œ μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•œ μ•„λ¬΄μΌλ‘œ μΌμ–΄λ‚˜μ§€ μ•ŠμŒ
Circle c = new Circle();

new μ—°μ‚°μžμ™€ 인자 μ—†λŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ default μƒμ„±μžλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ“š 3. λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λŠ” μƒμ„±μž

  • 객체가 κ°€μ§ˆ instance 멀버 λ³€μˆ˜μ˜ 초기 섀정값을 객체 생성과 λ™μ‹œμ— 전달 λ°›μŒ
  • 객체 생성 직후 μ΄ˆκΈ°ν™” μž‘μ—…μ΄ ν•œ λ²ˆμ— μˆ˜ν–‰λ¨
  • ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ”°λ‘œ 값을 μ΄ˆκΈ°ν™”ν•  일이 μ—†μ–΄ μ•ˆμ „ν•œ μ΄ˆκΈ°ν™” κ°€λŠ₯
Circle c = new Circle(1);

객체 속성값을 생성과 λ™μ‹œμ— μ„ μ–Έν•˜μ—¬ μ™ΈλΆ€ 접근을 μ°¨λ‹¨ν•©λ‹ˆλ‹€.


πŸ“š 4. μƒμ„±μž μ˜€λ²„λ‘œλ”©

  • λ§€κ°œλ³€μˆ˜ λ¦¬μŠ€νŠΈκ°€ λ‹€λ₯Έ μƒμ„±μžλ“€λ‘œ μƒμ„±μžμ˜ 닀쀑 μ •μ˜ κ°€λŠ₯
  • 객체 μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•΄ μΈμžκ°€ μ—¬λŸ¬ 개 μžˆμ„ 수 있고, 없을 μˆ˜λ„ 있음
Circle c1 = new Circle(1); // μ •μˆ˜ 인자λ₯Ό λ°›λŠ” μƒμ„±μž
Circle c2 = new Circle(); // 인자λ₯Ό 받지 μ•ŠλŠ” μƒμ„±μž
Circle c3 = new Circle(2.58); // μ‹€μˆ˜ν˜• 인자λ₯Ό λ°›λŠ” μƒμ„±μž

πŸ“š 5. this( )

μΈμˆ˜κ°€ λ§Žμ€ 경우 μƒμ„±μž λ³„λ‘œ 값을 μ§€μ •ν•˜κΈ° λ³΅μž‘ν•©λ‹ˆλ‹€. μ΄λ•Œ κ°€μž₯ μΌλ°˜ν™”λœ μƒμ„±μžλ₯Ό λ‹€λ₯Έ μƒμ„±μžμ—μ„œ μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ μƒμ„±μž κ΅¬ν˜„μ‹œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • λ°˜λ“œμ‹œ κΈ°μ‘΄ μƒμ„±μžμ˜ 첫 행에 μœ„μΉ˜
  • ν˜„μž¬ 클래슀의 인수 λ¦¬μŠ€νŠΈκ°€ μΌμΉ˜ν•˜λŠ” μƒμ„±μžμ˜ 호좜
  • ν•œ 클래슀 λ‚΄μ˜ νŠΉμ • μƒμ„±μž κ΅¬ν˜„μ‹œ μ˜€λ²„λ‘œλ”©λ˜μ–΄ μžˆλŠ” λ‹€λ₯Έ μƒμ„±μžλ₯Ό 호좜

πŸ“Œ III. 가비지 μ»¬λ ‰μ…˜

πŸ“š 가비지 μ»¬λ ‰μ…˜(Garbage Collection)

  • μžλ°”λŠ” new ν‚€μ›Œλ“œμ— μ˜ν•΄ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό λ‹€μ‹œ λ°˜λ‚©ν•˜λŠ” μ†Œλ©Έμžλ₯Ό 가지지 μ•ŠμŒ
  • μ–΄λ–€ μ°Έμ‘° λ³€μˆ˜λ„ 객체가 μ°Έμ‘°λ˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•œ 경우 JVM의 가비지 컬렉터가 μžλ™μœΌλ‘œ 할당을 ν•΄μ œν•¨
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.