IT’s Portfolio

[Java] Lecture - Day 8 λ³Έλ¬Έ

Development Study/Java

[Java] Lecture - Day 8

f1r3_r41n 2023. 12. 12. 01:04
728x90
λ°˜μ‘ν˜•

πŸ–₯ Basic Java - Day 8

πŸ‘‰πŸ» [Chapter 05] 상속

상속(inheritance)

  • 객체 지ν–₯ μ–Έμ–΄μ—μ„œμ˜ 상속
    • μžμ‹μ΄ λΆ€λͺ¨ μœ μ „μžλ₯Ό λ¬Όλ €λ°›λŠ” 것과 μœ μ‚¬ν•œ κ°œλ…
  • μƒμ†μ˜ ν•„μš”μ„±
    • 상속을 μ΄μš©ν•œ 경우 μ½”λ“œμ˜ 쀑볡을 제거, 클래슀λ₯Ό κ°„κ²°ν•˜κ²Œ κ΅¬ν˜„ κ°€λŠ₯
  • μƒμ†μ˜ μž₯점
    • 클래슀 사이이 멀버 쀑볡 μ„ μ–Έ λΆˆν•„μš”
      • 클래슀의 κ°„κ²°ν™”
    • ν΄λž˜μŠ€λ“€μ˜ 계측적 λΆ„λ₯˜λ‘œ 클래슀 관리 용이
    • 클래슀 μž¬μ‚¬μš©κ³Ό ν™•μž₯을 ν†΅ν•œ μ†Œν”„νŠΈμ›¨μ–΄ 생산성 ν–₯상

클래슀 상속과 객체

  • 상속 μ„ μ–Έ
    • extends ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ
      • λΆ€λͺ¨ 클래슀λ₯Ό λ¬Όλ €λ°›μ•„ ν™•μž₯ν•œλ‹€λŠ” 의미
    • λΆ€λͺ¨ 클래슀 -> 슈퍼 클래슀(super class)
      • 슈퍼 클래슀의 private 멀버
        • μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•  수 μ—†μŒ
      • 슈퍼 클래슀의 default 멀버
        • μ„œλΈŒ ν΄λž˜μŠ€κ°€ λ™μΌν•œ νŒ¨ν‚€μ§€μ— μžˆμ„ λ•Œ, μ ‘κ·Ό κ°€λŠ₯
      • 슈퍼 클래슀의 public 멀버
        • μ„œλΈŒ ν΄λž˜μŠ€λŠ” 항상 μ ‘κ·Ό κ°€λŠ₯
      • 슈퍼 클래슀의 protected 멀버
        • 같은 νŒ¨ν‚€μ§€ λ‚΄μ˜ λͺ¨λ“  클래슀 μ ‘κ·Ό ν—ˆμš©
        • νŒ¨ν‚€μ§€ 여뢀와 상관없이 μ„œλΈŒ ν΄λž˜μŠ€λŠ” μ ‘κ·Ό κ°€λŠ₯
    • μžμ‹ 클래슀 -> μ„œλΈŒ 클래슀(sub class)
      • μ„œλΈŒ ν΄λž˜μŠ€λŠ” 슈퍼 클래슀의 private 멀버λ₯Ό μ œμ™Έν•œ λͺ¨λ“  멀버에 μ ‘κ·Όν•  수 있음
  • μ„œλΈŒ 클래슀 객체의 λͺ¨μ–‘
    • 슈퍼 클래슀 객체와 μ„œλΈŒ 클래슀 κ°μ²΄λŠ” λ³„κ°œ
    • μ„œλΈŒ 클래슀 κ°μ²΄λŠ” 슈퍼 클래슀 멀버 포함

μžλ°” μƒμ†μ˜ νŠΉμ§•

  • 클래슀 닀쀑 상속(multiple inheritance) λΆˆν—ˆ
    • Cpp은 닀쀑 상속 κ°€λŠ₯
      • 닀쀑 μƒμ†μœΌλ‘œ 멀버가 쀑볡 μƒμ„±λ˜λŠ” λ¬Έμ œκ°€ 있음
    • μžλ°”λŠ” μΈν„°νŽ˜μ΄μŠ€(interface)의 닀쀑 상속 ν—ˆμš©
  • λͺ¨λ“  μžλ°” ν΄λž˜μŠ€λŠ” λ¬΅μ‹œμ μœΌλ‘œ Object 클래슀λ₯Ό μƒμ†λ°›μŒ
    • Java.lang.Object ν΄λž˜μŠ€λŠ” λͺ¨λ“  클래슀의 슈퍼 클래슀

protected 멀버

  • 같은 νŒ¨ν‚€μ§€μ˜ λͺ¨λ“  ν΄λž˜μŠ€μ—κ²Œ ν—ˆμš©
  • μƒμ†λ˜λŠ” μ„œλΈŒ 클래슀(같은 νŒ¨ν‚€μ§€λ“  λ‹€λ₯Έ νŒ¨ν‚€μ§€λ“  상관 μ—†μŒ)μ—κ²Œ ν—ˆμš©

μ„œλΈŒ 클래슀/슈퍼 클래슀의 μƒμ„±μž 호좜과 μ‹€ν–‰

  • μ„œλΈŒ 클래슀의 객체가 생성될 λ•Œ
    • 슈퍼 클래슀 μƒμ„±μžμ™€ μ„œλΈŒ 클래슀 μƒμ„±μž λͺ¨λ‘ μ‹€ν–‰
      • μ„œλΈŒ 클래슀의 μƒμ„±μž λ¨Όμ € 호좜
      • μ„œλΈŒ 클래슀의 μƒμ„±μžλŠ” μ‹€ν–‰ μ „ 슈퍼 클래슀 μƒμ„±μž 호좜
    • 슈퍼 클래슀의 μƒμ„±μžκ°€ λ¨Όμ € μ‹€ν–‰λœ ν›„ μ„œλΈŒ 클래슀의 μƒμ„±μž μ‹€ν–‰

μ„œλΈŒ ν΄λž˜μŠ€μ™€ 슈퍼 클래슀의 μƒμ„±μž 선택

  • 슈퍼 ν΄λž˜μŠ€μ™€ μ„œλΈŒ 클래슀
    • 각각 μ—¬λŸ¬ 개의 μƒμ„±μž μž‘μ„± κ°€λŠ₯
  • μ„œλΈŒ 클래슀의 객체가 생성될 λ•Œ
    • 슈퍼 클래슀 μƒμ„±μž 1κ°œμ™€ μ„œλΈŒ 클래슀 μƒμ„±μž 1κ°œκ°€ μ‹€ν–‰
  • μ„œλΈŒ 클래슀의 μƒμ„±μžμ™€ 슈퍼 클래슀의 μƒμ„±μžκ°€ κ²°μ •λ˜λŠ” 방식
    • 개발자의 λͺ…μ‹œμ  선택
      • μ„œλΈŒ 클래슀 κ°œλ°œμžκ°€ 슈퍼 클래슀의 μƒμ„±μž λͺ…μ‹œμ  선택
      • super() ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 선택
        • super(parameter)
          • 인자λ₯Ό μ΄μš©ν•˜μ—¬ 슈퍼 클래슀의 μ λ‹Ήν•œ μƒμ„±μž 호좜
          • λ°˜λ“œμ‹œ μ„œλΈŒ 클래슀 μƒμ„±μž μ½”λ“œμ˜ 제일 첫 라인에 와야 함
    • μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έ μƒμ„±μž 선택
      • μ„œλΈŒ 클래슀 κ°œλ°œμžκ°€ 슈퍼 클래슀의 μƒμ„±μžλ₯Ό μ„ νƒν•˜μ§€ μ•ŠλŠ” 경우
      • μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ 슈퍼 클래슀의 κΈ°λ³Έ μƒμ„±μž 선택

μ—…μΊμŠ€νŒ…(upcasting)

class Person { ... }
class Student extends Person { ... }

Person p;
Student s = new Student();
p = s; // μ—…μΊμŠ€νŒ…, p = (Person)s 처럼 λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ λΆˆν•„μš”
  • μ„œλΈŒ 클래슀 레퍼런슀λ₯Ό 슈퍼 클래슀 λ ˆνΌλŸ°μŠ€μ— λŒ€μž…
  • 슈퍼 클래슀 레퍼런슀둜 μ„œλΈŒ 클래슀 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ λ˜λŠ” ν˜„μƒ
  • μ—…μΊμŠ€νŒ…ν•œ λ ˆνΌλŸ°μŠ€λ‘œλŠ” 였직 슈퍼 클래슀의 λ©€λ²„λ§Œ μ ‘κ·Ό
  • μ—…μΊμŠ€νŒ…μ€ 상속 κ΄€κ³„μ—μ„œλ§Œ λ°œμƒ
  • μ—…μΊμŠ€νŒ…λœ λ ˆνΌλŸ°μŠ€λ‘œλŠ” 객체의 μ‹€μ œ νƒ€μž…μ„ κ΅¬λΆ„ν•˜κΈ° 어렀움
    • 슈퍼 ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ μ„œλΈŒ ν΄λž˜μŠ€μ— μƒμ†λ˜κΈ° λ•Œλ¬Έ

λ‹€μš΄μΊμŠ€νŒ…(downcasting)

class Person { ... }
class Student extends Person { ... }

Person p = new Student("λ°•ν™”λΉ„"); // μ—…μΊμŠ€νŒ…
Student s = (Student)p; // λ‹€μš΄μΊμŠ€νŒ…, κ°•μ œ νƒ€μž… λ³€ν™˜
Student s = p; // 잘λͺ»λœ 방식
  • 슈퍼 클래슀 레퍼런슀λ₯Ό μ„œλΈŒ 클래슀 λ ˆνΌλŸ°μŠ€μ— λŒ€μž…
  • μ—…μΊμŠ€νŒ…λœ 것을 λ‹€μ‹œ μ›λž˜λŒ€λ‘œ λ˜λŒλ¦¬λŠ” 것
  • λ°˜λ“œμ‹œ λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ 지정

instanceof μ—°μ‚°μž

Person p = new Professor();

if(p instanceof Person) // true
if(p instanceof Student) // false. Studentλ₯Ό 상속받지 μ•ŠκΈ° λ•Œλ¬Έ
if(p instanceof Researcher) // true
if(p instanceof Professor) // true

if("java" instanceof String) // true
if(3 instanceof int) // 였λ₯˜. instanceofλŠ” 객체에 λŒ€ν•œ λ ˆνΌλŸ°μŠ€μ—λ§Œ μ‚¬μš©λ¨
  • λ ˆνΌλŸ°μŠ€κ°€ κ°€λ¦¬ν‚€λŠ” 객체의 νƒ€μž… 식별
    • 객체레퍼런슀 instanceof ν΄λž˜μŠ€νƒ€μž…
      • μ—°μ‚°μ˜ κ²°κ³Ό : boolean κ°’
class Person { ... }
class Student extends Person { ... }
class Researcher extends Person { ... }
class Professor extends Researcher { ... }

public class InstanceOfEx {
    static void print(Person p) {
        if(p instanceof Person)
            System.out.print("Person ");
        if(p instanceof Student)
            System.out.print("Student ");
        if(p instanceof Researcher)
            System.out.print("Researcher ");
        if(p instanceof Professor)
            System.out.print("Professor");
        System.out.println();
    }
    public static void main(String[] args) {
        System.out.print("new Student() -> "); print(new Student());
        System.out.print("new Researcher() -> "); print(new Researcher());
        System.out.print("new Professor() -> "); print(new Professor());
    }
}

// Result
new Student() -> Person Student
new Researcher() -> Person Researcher
new Professor() -> Person Researcher Professor
  • instanceof 예제

λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©(Method Overriding)

  • μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 슈퍼 클래슀의 λ©”μ†Œλ“œλ₯Ό 쀑볡 μž‘μ„±
  • 슈퍼 클래슀의 λ©”μ†Œλ“œλ₯Ό 무λ ₯ν™”, 항상 μ„œλΈŒ ν΄λž˜μŠ€μ— μ˜€λ²„λΌμ΄λ”©ν•œ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λ˜λ„λ‘ 보μž₯
  • "λ©”μ†Œλ“œ λ¬΄μ‹œν•˜κΈ°", "λ©”μ†Œλ“œ μž¬μ •μ˜ν•˜κΈ°" 둜 λ²ˆμ—­λ˜κΈ°λ„ 함
  • μ˜€λ²„λΌμ΄λ”© 쑰건
    • 슈퍼 클래슀 λ©”μ†Œλ“œμ˜ μ›ν˜•(λ©”μ†Œλ“œ 이름, 인자 νƒ€μž… 및 개수, 리턴 νƒ€μž…)κ³Ό λ™μΌν•˜κ²Œ μž‘μ„±
  • μ˜€λ²„λΌμ΄λ”©μ˜ λͺ©μ 
    • λ‹€ν˜•μ„± μ‹€ν˜„
      • ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€(같은 이름)에 μ„œλ‘œ λ‹€λ₯Έ κ΅¬ν˜„
      • 슈퍼 클래슀의 λ©”μ†Œλ“œλ₯Ό μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 각각 λͺ©μ μ— 맞게 λ‹€λ₯΄κ²Œ κ΅¬ν˜„

동적 바인딩(dynamic binding)

  • μ‹€ν–‰ν•  λ•Œ λ©”μ†Œλ“œλ₯Ό μ»΄νŒŒμΌν•  λ•Œ(compile time)에 κ²°μ •ν•˜μ§€ μ•Šκ³  μ‹€ν–‰ν•  λ•Œ(run time)에 κ²°μ •ν•˜λŠ” 것
  • μžλ°”λŠ” 동적 바인딩을 톡해 μ„œλΈŒ ν΄λž˜μŠ€μ— κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” μ˜€λ²„λΌμ΄λ”© λ©”μ†Œλ“œκ°€ 항상 μ‹€ν–‰λ˜λ„λ‘ 보μž₯
  • super
    • 슈퍼 클래슀의 멀버에 μ ‘κ·Όν•  λ•Œ μ‚¬μš©λ˜λŠ” 레퍼런슀
      • super.슈퍼 클래슀의 멀버
    • μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©
      • 슈퍼 클래슀의 ν•„λ“œ μ ‘κ·Ό
      • 슈퍼 클래슀의 λ©”μ†Œλ“œ 호좜
    • super둜 μ΄λ£¨μ–΄μ§€λŠ” λ©”μ†Œλ“œ ν˜ΈμΆœμ€ 정적 바인딩

좔상 클래슀(abstract class)

  • abstract method
    • abstract둜 μ„ μ–Έλœ λ©”μ†Œλ“œ, λ©”μ†Œλ“œμ˜ μ½”λ“œλŠ” μ—†κ³  μ›ν˜•λ§Œ μ„ μ–Έ
  • abstract class
    • 좔상 λ©”μ†Œλ“œλ₯Ό 가지며, abstract둜 μ„ μ–Έλœ 클래슀
    • 좔상 λ©”μ†Œλ“œ 없이, abstract둜 μ„ μ–Έν•œ 클래슀
  • 좔상 ν΄λž˜μŠ€λŠ” μ˜¨μ „ν•œ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆκΈ°μ— μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŒ
  • 좔상 클래슀 상속
    • 좔상 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄ 좔상 ν΄λž˜μŠ€κ°€ 됨
    • μ„œλΈŒ ν΄λž˜μŠ€λ„ abstract둜 μ„ μ–Έν•΄μ•Ό 함
  • 좔상 클래슀 κ΅¬ν˜„
    • μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 슈퍼 클래슀의 λͺ¨λ“  좔상 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λŠ” 것
    • 좔상 클래슀λ₯Ό κ΅¬ν˜„ν•œ μ„œλΈŒ ν΄λž˜μŠ€λŠ” 좔상 ν΄λž˜μŠ€κ°€ μ•„λ‹˜
      • 좔상 클래슀λ₯Ό κ΅¬ν˜„ν•œ μ„œλΈŒ ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 있음
  • 좔상 클래슀 λͺ©μ 
    • 상속을 μœ„ν•œ 슈퍼 클래슀둜 ν™œμš©ν•˜λŠ” 것
    • 좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œλ₯Ό 톡해 μ„œλΈŒ ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•  λ©”μ†Œλ“œμ˜ μ›ν˜•μ„ μ•Œλ €μ£ΌλŠ” μ—­ν• 
    • λ‹€ν˜•μ„± μ‹€ν˜„

μΈν„°νŽ˜μ΄μŠ€

  • μž₯점
    • μΈν„°νŽ˜μ΄μŠ€λ§Œ μ€€μˆ˜ν•˜λ©΄ 톡합에 신경쓰지 μ•Šκ³  λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ μƒˆλ‘œμš΄ 클래슀 개발 κ°€λŠ₯
    • μžλ°”λŠ” 클래슀의 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€λ‘œ 닀쀑 μƒμ†μ˜ 효과λ₯Ό κ°„μ ‘μ μœΌλ‘œ 얻을 수 있음
  • μžλ°”μ˜ μΈν„°νŽ˜μ΄μŠ€
    • ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•  λ©”μ†Œλ“œλ“€μ΄ μ„ μ–Έλ˜λŠ” μΆ”μƒν˜•
    • μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ
      • interface ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ
  • μžλ°” μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ λ³€ν™”
    • Java 7κΉŒμ§€
      • μΈν„°νŽ˜μ΄μŠ€λŠ” μƒμˆ˜μ™€ 좔상 λ©”μ†Œλ“œλ‘œλ§Œ ꡬ성
    • Java 8λΆ€ν„°
      • μƒμˆ˜μ™€ 좔상 λ©”μ†Œλ“œ 포함
      • default λ©”μ†Œλ“œ 포함 (Java 8)
      • private λ©”μ†Œλ“œ 포함 (Java 9)
      • stativ λ©”μ†Œλ“œ 포함 (Java 9)
    • μ—¬μ „νžˆ μΈν„°νŽ˜μ΄μŠ€μ—λŠ” ν•„λ“œ(멀버 λ³€μˆ˜) μ„ μ–Έ λΆˆκ°€
  • μΈν„°νŽ˜μ΄μŠ€μ˜ ꡬ성 μš”μ†Œλ“€
    • μƒμˆ˜
      • public만 ν—ˆμš©, public static final μƒλž΅
    • 좔상 λ©”μ†Œλ“œ
      • public abstract μƒλž΅ κ°€λŠ₯
    • default λ©”μ†Œλ“œ
      • μΈν„°νŽ˜μ΄μŠ€μ— μ½”λ“œκ°€ μž‘μ„±λœ λ©”μ†Œλ“œ
      • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ— μžλ™ 상속
      • public μ ‘κ·Ό μ§€μ •λ§Œ ν—ˆμš©ν•˜λ©° μƒλž΅ κ°€λŠ₯함
    • private λ©”μ†Œλ“œ
      • μΈν„°νŽ˜μ΄μŠ€ 내에 λ©”μ†Œλ“œ μ½”λ“œκ°€ μž‘μ„±λ˜μ–΄μ•Ό 함
      • μΈν„°νŽ˜μ΄μŠ€ 내에 μžˆλŠ” λ‹€λ₯Έ λ©”μ†Œλ“œμ— μ˜ν•΄μ„œλ§Œ 호좜 κ°€λŠ₯
    • static λ©”μ†Œλ“œ
      • public, private λͺ¨λ‘ 지정 κ°€λŠ₯ν•˜λ©° μƒλž΅ν•˜λ©΄ public
  • μžλ°” μΈν„°νŽ˜μ΄μŠ€μ˜ νŠΉμ§•
    • μΈν„°νŽ˜μ΄μŠ€μ˜ 객체 생성 λΆˆκ°€
    • μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ 레퍼런슀 λ³€μˆ˜ μ„ μ–Έ κ°€λŠ₯
  • μΈν„°νŽ˜μ΄μŠ€ 상속
    • μΈν„°νŽ˜μ΄μŠ€ κ°„ 상속 κ°€λŠ₯
      • μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜μ—¬ ν™•μž₯된 μΈν„°νŽ˜μ΄μŠ€ μž‘μ„± κ°€λŠ₯
      • extends ν‚€μ›Œλ“œλ‘œ 상속 μ„ μ–Έ
    • μΈν„°νŽ˜μ΄μŠ€ 닀쀑 상속 ν—ˆμš©
  • μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
    • μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ κ΅¬ν˜„ν•œ 클래슀 μž‘μ„±
      • implements ν‚€μ›Œλ“œ μ‚¬μš©
      • μ—¬λŸ¬ 개의 μΈν„°νŽ˜μ΄μŠ€ λ™μ‹œ κ΅¬ν˜„ κ°€λŠ₯
728x90
λ°˜μ‘ν˜•

'Development Study > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] Lecture - Day 10  (0) 2023.12.12
[Java] Lecture - Day 9  (1) 2023.12.12
[Java] Lecture - Day 7  (0) 2023.12.12
[Java] Lecture - Day 6  (0) 2023.12.12
[Java] Lecture - Day 5  (0) 2023.12.12
Comments