Skip to content

Latest commit

Β 

History

History
151 lines (133 loc) Β· 5.91 KB

Section4.md

File metadata and controls

151 lines (133 loc) Β· 5.91 KB

4. μžλ°”κ°€ ν™•μž₯ν•œ 객체 지ν–₯

abstract ν‚€μ›Œλ“œ - 좔상 λ©”μ„œλ“œμ™€ 좔상 클래슀

  • 좔상 λ©”μ„œλ“œ(Abstract Method)λŠ” μ„ μ–ΈλΆ€λŠ” μžˆλŠ”λ° κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œμ΄λ‹€.
  • 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ 좔상 클래슀(Abstract Class)μ—¬μ•Ό ν•œλ‹€.
    • λ¬Όλ‘  좔상 λ©”μ„œλ“œ 없이도 μΆ”μƒν΄λž˜μŠ€λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” 객체λ₯Ό λ§Œλ“€ 수 μ—†λ‹€. ➑️ newλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
  • 좔상 λ©”μ„œλ“œλŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—κ²Œ λ©”μ„œλ“œμ˜ κ΅¬ν˜„μ„ κ°•μ œν•œλ‹€. (μ˜€λ²„λΌμ΄λ”© κ°•μ œ)
public abstract class 동물{
  abstract void μšΈμ–΄λ³΄μ„Έμš”();
}
public class 고양이 extends 동물{
  void μšΈμ–΄λ³΄μ„Έμš”(){
    System.out.println("λ‚˜λŠ” 고양이. μ•Όμ˜Ή.");
  }
}
public class Driver{
  public static void main(String[] args){
    동물 cat = new 고양이();
    동물 dog = new 강아지();
    cat.μšΈμ–΄λ³΄μ„Έμš”();
    dog.μšΈμ–΄λ³΄μ„Έμš”();
  }
}

좔상 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ 각 동물듀은 λ‹€λ₯΄κ²Œ 울 수 μžˆλ‹€. (λ‹€ν˜•μ„±)


μƒμ„±μž

  • 클래슀의 μΈμŠ€ν„΄μŠ€(객체)λ₯Ό λ§Œλ“€ λ•Œ λ§ˆλ‹€ new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©° 클래슀λͺ…(...)을 μƒμ„±μžλΌκ³  ν•œλ‹€.
      동물 animal = new 동물();
    • μƒμ„±μž = 객체 μƒμ„±μž λ©”μ„œλ“œ
  • λ§Œμ•½ κ°œλ°œμžκ°€ μ•„λ¬΄λŸ° μƒμ„±μžλ„ λ§Œλ“€μ§€ μ•ŠμœΌλ©΄, μžλ°”λŠ” μΈμžμ—†λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.
  • μΈμžκ°€ μžˆλŠ” μƒμ„±μžλ₯Ό ν•˜λ‚˜λΌλ„ λ§Œλ“ λ‹€λ©΄ μžλ°”λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ 주지 μ•ŠλŠ”λ‹€.
  • μƒμ„±μžλŠ” κ°œλ°œμžκ°€ ν•„μš”ν•œ 만큼 μ˜€λ²„λ‘œλ”©ν•΄μ„œ λ§Œλ“€ 수 μžˆλ‹€.

클래슀 생성 μ‹œ μ‹€ν–‰ 블둝, static block

  • static block : ν΄λž˜μŠ€κ°€ μŠ€νƒœν‹± μ˜μ—­μ— 배치될 λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œλΈ”λ‘
public class 동물{
  static{
    System.out.println("동물 클래슀 λ ˆλ”” 온!");
  }
}
  • ν΄λž˜μŠ€κ°€ μŠ€νƒœν‹± μ˜μ—­μ— λ°°μΉ˜λ˜λŠ” 경우
    1. 클래슀의 정적 속성을 μ‚¬μš©ν•  λ•Œ
    2. 클래슀의 정적 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ
    3. 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 졜초둜 λ§Œλ“€ λ•Œ
  • μ™œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ λ°”λ‘œ 클래슀 정보λ₯Ό static μ˜μ—­μ— λ‘œλ”©ν•˜μ§€ μ•Šμ„κΉŒ?
    • μŠ€νƒœν‹± μ˜μ—­λ„ λ©”λͺ¨λ¦¬μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.
    • λ©”λͺ¨λ¦¬λŠ” μ΅œλŒ€ν•œ 늦게 μ‚¬μš©μ„ μ‹œμž‘ν•˜κ³  μ΅œλŒ€ν•œ 빨리 λ°˜ν™˜ν•˜λŠ” 것이 정석이닀.
    • λ¬Όλ‘  μžλ°”λŠ” static μ˜μ—­μ— ν•œλ²ˆ μ˜¬λΌκ°€λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜κΈ° μ „κΉŒμ§€ λ°˜ν™˜ λͺ»ν•¨.
    • κ·ΈλŸΌμ—λ„ μ΅œλŒ€ν•œ 늦게 λ‘œλ”©ν•¨μœΌλ‘œμ¨ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ΅œλŒ€ν•œ λŠ¦μΆ”κΈ° μœ„ν•΄μ„œλ‹€.

final ν‚€μ›Œλ“œ

  • final 클래슀 : 상속을 ν—ˆλ½ν•˜μ§€ μ•ŠλŠ” 클래슀
  • final λ³€μˆ˜ : λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μƒμˆ˜
    • μ„ μ–Έ μ‹œ λ˜λŠ” 졜초 ν•œλ²ˆ μ΄ˆκΈ°ν™” κ°€λŠ₯ν•˜λ‹€.
      • 클래슀 λ³€μˆ˜λŠ” static λΈ”λ‘μ—μ„œ
      • 멀버 λ³€μˆ˜λŠ” μƒμ„±μž λ˜λŠ” μΈμŠ€ν„΄μŠ€ λΈ”λ‘μ—μ„œ
      • 지역 λ³€μˆ˜λŠ” ν•΄λ‹Ή λ©”μ„œλ“œ μ•ˆμ—μ„œ
  • final λ©”μ„œλ“œ : μ˜€λ²„λΌμ΄λ”© κΈˆμ§€ λ©”μ„œλ“œ

instance of

  • μƒμ„±λœ 객체(μ‹€μ œ 객체)κ°€ νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€ λ¬Όμ–΄λ³΄λŠ” μ—°μ‚°μž.

    μ°Έμ‘°λ³€μˆ˜ instanceof 클래슀λͺ…
    • ν΄λž˜μŠ€λ“€μ˜ 상속관계 뿐 μ•„λ‹ˆλΌ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„κ΄€κ³„μ—μ„œλ„ λ™μΌν•˜κ²Œ μ μš©λœλ‹€.
  • 이 μ—°μ‚°μžλŠ” κ°•λ ₯ν•˜κΈ΄ ν•˜μ§€λ§Œ, LSP(λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙)을 μ–΄κΈ°λŠ” μ½”λ“œμ—μ„œ 주둜 λ‚˜νƒ€λ‚œλ‹€.

    • 보인닀면 λ¦¬νŒ©ν„°λ§ λŒ€μƒμ΄ μ•„λ‹Œμ§€ 점검해 봐야 ν•œλ‹€.

interface 와 implements

  • interfaceλŠ” public μΆ”μƒλ©”μ„œλ“œμ™€ public 정적 μƒμˆ˜λ§Œ κ°€μ§ˆ 수 μžˆλ‹€.
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ©”μ„œλ“œμ— publicκ³Ό abstract, 속성에 publicκ³Ό static, final을 뢙이지 μ•Šμ•„λ„ μžλ™μœΌλ‘œ μžλ°”κ°€ λΆ™μ—¬μ€€λ‹€.
    • ν•˜μ§€λ§Œ μ €μžλŠ” λͺ…ν™•ν•˜κ²Œ μ „λ‹¬ν•˜κΈ° μœ„ν•΄μ„œ ν‚€μ›Œλ“œλ₯Ό 뢙이라고 ν•œλ‹€..

μžλ°”8λΆ€ν„° λ””ν΄νŠΈ λ©”μ„œλ“œκ°€ 생겼닀.
이λ₯Ό 톡해 λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨ 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λ“€μ—κ²Œ κ΅¬ν˜„μ„ κ°•μ œν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€.
μ½”λ“œ λ³€κ²½ 없어도됨. ➑️ ν™•μž₯은 ν•  수 μžˆμ§€λ§Œ 변경에 λŒ€ν•΄μ„œ νμ‡„λ˜λŠ” OCPλ₯Ό 지킬 수 μžˆμ–΄μ§.


this ν‚€μ›Œλ“œ

  • 지역 λ³€μˆ˜μ™€ 속성(객체 λ³€μˆ˜, 정적 λ³€μˆ˜)의 이름이 같은 경우 지역 λ³€μˆ˜κ°€ μš°μ„ ν•œλ‹€.
  • 객체 λ³€μˆ˜μ™€ 이름이 같은 지역 λ³€μˆ˜κ°€ μžˆλŠ” 경우 객체 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ thisλ₯Ό μ ‘λ‘μ‚¬λ‘œ μ‚¬μš©ν•œλ‹€.
  • 정적 λ³€μˆ˜μ™€ 이름이 같은 지역 λ³€μˆ˜κ°€ μžˆλŠ” 경우 정적 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λΌλ©΄ 클래슀λͺ…을 μ ‘λ‘μ‚¬λ‘œ μ‚¬μš©ν•œλ‹€.

super ν‚€μ›Œλ“œ

  • super ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ μƒμœ„ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ super.super ν˜•νƒœλ‘œ μƒμœ„μ˜ μƒμœ„ 클래슀의 μΈμŠ€ν„΄μŠ€μ—λŠ” μ ‘κ·Ό λΆˆκ°€λŠ₯ν•˜λ‹€.

객체의 λ©”μ„œλ“œλŠ” staticμ˜μ—­μ— μžˆλ‹€.

  • 객체 멀버 λ©”μ„œλ“œλŠ” 각 κ°μ²΄λ³„λ‘œ 달라지지 μ•ŠλŠ”λ‹€.
    • 속성 κ°’λ§Œ λ‹€λ₯Ό 뿐이닀.
    • 객체의 λ©”μ„œλ“œλ₯Ό heapμ˜μ—­μ— λ§Œλ“œλŠ” 것은 μ‹¬κ°ν•œ λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ 될 것이닀.
  • 지λŠ₯적으둜 JVM은 객체 멀버 λ©”μ„œλ“œλ₯Ό staticμ˜μ—­μ— 단 ν•˜λ‚˜λ§Œ λ³΄μœ ν•œλ‹€.
    • 그리고 λ©”μ„œλ“œ 호좜 μ‹œ 객체 μžμ‹ μ„ λ‚˜νƒ€λ‚΄λŠ” this 객체 μ°Έμ‘° λ³€μˆ˜λ₯Ό λ„˜κΈ΄λ‹€.
  • κΈ°μ‘΄ μ½”λ“œ
    class νŽ­κ·„{
      void test(){
        System.out.println("ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ");
      }
    }
    public class Driver{
      public static void main(String[] args){
        νŽ­κ·„ λ½€λ‘œλ‘œ = new νŽ­κ·„();
        λ½€λ‘œλ‘œ.test();
      }
    }
  • JVM이 λ³€κ²½ν•˜λŠ” μ½”λ“œ
    class νŽ­κ·„{
      static void test(νŽ­κ·„ this){
        System.out.println("ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ");
      }
    }
    public class Driver{
      public static void main(String[] args){
        νŽ­κ·„ λ½€λ‘œλ‘œ = new νŽ­κ·„();
        νŽ­κ·„.test(λ½€λ‘œλ‘œ);
      }
    }