관리 메뉴

βœπŸ»κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έ

[ JAVA ] 상속 λ³Έλ¬Έ

Language/Java

[ JAVA ] 상속

μ©μ‹œν‚΄ 2020. 12. 25. 18:12
728x90

μžλ°” 라이브 μŠ€ν„°λ”” 6μ£Ό μ°¨ - 상속

github.com/whiteship/live-study/issues/6#issuecomment-751219666


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

클래슀λ₯Ό μ •μ˜ν•  λ•Œ 기쑴에 κ΅¬ν˜„λœ 클래슀λ₯Ό μƒμ†λ°›μ•„μ„œ 속성 (λ³€μˆ˜), κΈ°λŠ₯(λ©”μ„œλ“œ)이 ν™•μž₯λ˜λŠ” 것

기쑴의 클래슀λ₯Ό κ°€μ Έλ‹€κ°€ 쑰금 더 ν™•μž₯의 κ°œλ…

μ°Έμ‘° )java μ›Ή 개발 λ§ˆμŠ€ν„° μ˜¬μΈμ› νŒ¨ν‚€μ§€

  • uml λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ 상속을 ν‘œν˜„ μ‹œ μƒμ†λ°›λŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό μžμ‹ ν΄λž˜μŠ€κ°€ ν™”μ‚΄ν‘œλ‘œ κ°€λ¦¬ν‚€κ²Œ λœλ‹€.
  • 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μƒμ†μ˜ νšŸμˆ˜μ— μ œν•œ 두지 μ•ŠλŠ”λ‹€.

2. super ν‚€μ›Œλ“œ

λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘° μ‹œ μ‚¬μš©ν•˜λŠ” μ°Έμ‘° λ³€μˆ˜

λΆ€λͺ¨ 클래슀의 멀버와 μžμ‹ 클래슀의 멀버 이름이 같을 경우 super ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ별 κ°€λŠ₯

 

class Parent{
  int a = 10;
}

class Child extends Parent{
  int a = 20;

  void display(){
      System.out.println(a);//20
      System.out.println(this.a);//20
      System.out.println(super.a);//λΆ€λͺ¨ν΄λž˜μŠ€μ˜ λ³€μˆ˜ a 10
   }
}

public class inheritance{
   public static void main(String[] args){
       Child ch = new Child();
       ch.display();
    }
}

3. λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© (κΈ°μ‘΄ λ©”μ†Œλ“œ μž¬μ •μ˜)

상속관계에 μžˆλŠ” λΆ€λͺ¨μ˜ ν΄λž˜μŠ€μ—μ„œ 이미 μ •μ˜λœ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œλ‘œ μ—¬λŸ¬ 개 μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것

(λΆ€λͺ¨μ—μ„œ private μ ‘κ·Ό μ œν•œμžλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μš”μ†Œ 상속이 κ°€λŠ₯)

 

 

μ˜€λ²„ 라이딩 쑰건

  1. μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œμ˜ λ™μž‘λ§Œ μž¬μ •μ˜ ν•˜λ―€λ‘œ, μ„ μ–ΈλΆ€λŠ” 기쑴의 λ©”μ„œλ“œμ™€ 동일해야 ν•œλ‹€.

  2. λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ μ ‘κ·Ό μ œν•œμž 보닀 적은 λ²”μœ„λ‘œ λ³€κ²½ λΆˆκ°€

  3. λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ μ˜ˆμ™Έλ³΄λ‹€ 더 큰 λ²”μœ„μ˜ μ˜ˆμ™Έ μ„ μ–Έ λΆˆκ°€

public class Test {
        public static void main(String[] args) {

            Parent pa = new Parent();
            pa.display();

            Child ch = new Child();
            ch.display();
            ch.display("hello World");

            Parent pc = new Child();
            pc.display();
        }

}
   
   

class Parent {
    void display() { System.out.println("λΆ€λͺ¨ν΄λž˜μŠ€μ˜ displayλ©”μ†Œλ“œμž…λ‹ˆλ‹€"); 	}
}

class Child extends Parent {
    //μ˜€λ²„ λ‘œλ”©λœ λ©”μ†Œλ“œ
    void display() { System.out.println("μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λœ displayλ©”μ†Œλ“œμž…λ‹ˆλ‹€"); 	}
    //μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œ
    void display(String str) { System.out.println("μžμ‹ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λœ λ©”μ†Œλ“œμž…λ‹ˆλ‹€  : "+str);}
}

4. 닀이내믹 λ©”μ„œλ“œ λ””μŠ€νŒ¨μΉ˜ (Dynamic Method Dispatch)

μž¬μ •μ˜ν•œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, λ©”μ„œλ“œμ˜ 객체 μœ ν˜•μ„ 컴파일 νƒ€μž„μ΄ μ•„λ‹Œ λŸ°νƒ€μž„ μ‹œ ν•΄μ„λ˜λŠ” 과정을 λœ»ν•œλ‹€.

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
   
      Animal a = new Animal(); // Animal reference and object
      Animal b = new Dog(); // Animal reference but Dog object

      a.move(); // Animals can move 
      b.move(); // Dogs can walk and run
   }
}

컴파일 μ‹œ μ°Έμ‘° νƒ€μž…μ„ λ§Œλ“€μ§€λ§Œ, λŸ°νƒ€μž„ μ‹œ μ—λŠ” jvm이 b의 객체 νƒ€μž…κ³Ό  move()κ°€ μ‹€μ œλ‘œ μ†ν•œ 객체λ₯Ό ν•΄κ²°ν•œλ‹€.

κ·ΈλŸ¬λ―€λ‘œ 컴파일 μ‹œ κΉŒμ§€λŠ” bλΌλŠ” μ°Έμ‘° λ³€μˆ˜λŠ” Animal 클래슀의 moveλ©”μ„œλ“œμ§€λ§Œ, λŸ°νƒ€μž„ μ‹œμ—λŠ” jvm이 μ‹€μ œλ‘œ μ†ν•œ 객체 Dog클래슀의 move()λ₯Ό 가리킨닀.


5. 좔상 클래슀

좔상 클래슀 μ„ μ–Έ ν˜•μ‹

abstract λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„();

κ΅¬ν˜„λœ λ©”μ„œλ“œλŠ” ν•˜μœ„ ν΄λž˜μŠ€κ°€ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯의 λ©”μ„œλ“œ , ν•˜μœ„ ν΄λž˜μŠ€μ— 따라 μž¬μ •μ˜κ°€ κ°€λŠ₯

좔상 ν΄λž˜μŠ€λŠ” new (μΈμŠ€ν„΄μŠ€ν™”)κ°€ λΆˆκ°€ν•˜λ‹€ → λ©”μ„œλ“œμ˜ λ°”λ””κ°€ μ—†μœΌλ―€λ‘œ

μ˜ˆμ‹œ) 자주 μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆμ˜ κ³΅ν†΅λ˜λŠ” 뢀뢄을 미리 λ§Œλ“€κ³  , λ°›μ•„ μ‚¬μš©ν•˜λŠ” μͺ½μ—μ„œ μžμ‹ μ΄ ν•„μš”ν•œ λΆ€λΆ„λ§Œ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©, 생산성이 ν–₯상

 

λͺ¨λ“  λ©”μ„œλ“œκ°€ κ΅¬ν˜„λ˜μ—ˆλ‹€κ³  해도 ν΄λž˜μŠ€μ— abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 좔상 클래슀

→ jdk 내뢀에도 쑴재, μ˜€λ‘œμ§€ 상속을 μœ„ν•œ 좔상 클래슀

2020/12/20 - [β˜•οΈJava] - [ JAVA ] μΆ”μƒν΄λž˜μŠ€


6. final ν‚€μ›Œλ“œ

finalν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μƒμ„±ν•˜λŠ” ν…œν”Œλ¦Ώ λ©”μ„œλ“œ

  좔상 λ©”μ„œλ“œλ‚˜ κ΅¬ν˜„λœ λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ μ „μ²΄μ˜ 흐름을 μ •μ˜ν•΄ λ†“λŠ” λ©”μ„œλ“œ, μ•„λž˜ μ˜ˆμ‹œμ²˜λŸΌ finalν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ runλ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λ―€λ‘œ runλ©”μ„œλ“œμ—μ„œ μ„ μ–Έλœ λ©”μ„œλ“œ μˆœμ„œκ°€ κ³ μ •ν•˜μ—¬ 상속받은 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ ν…œν”Œλ¦Ώμ²˜λŸΌ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

 

final둜 μ„ μ–Έν•˜μ—¬ μž¬μ •μ˜ ν•  수 μ—†κ²Œ 함

  • finalλ³€μˆ˜ : 값이 변경될 수 μ—†λŠ” μƒμˆ˜
  • final λ©”μ„œλ“œ : ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ λΆˆκ°€
  • final 클래슀 : 더 이상 μƒμ†λ˜μ§€ μ•ŠμŒ ex ) java의 string 클래슀
package template;

public abstract class Car {
    public abstract void drive();
    public abstract void stop();

    public void startCar(){
        System.out.println("μ‹œλ™μ„ μΌ­λ‹ˆλ‹€.");
    }

    public void turnOff(){
        System.out.println("μ‹œλ™μ„ λ•λ‹ˆλ‹€.");
    }

    final public void run(){//finalν‚€μ›Œλ“œλ‘œ ν•˜μœ„ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜κ°€ λΆˆκ°€ ν•˜λ„λ‘ μ„€μ •
        startCar();
        drive();
        stop();
        turnOff();
    }

}

7. Object 클래슀 (java.lang.Object)

λͺ¨λ“  클래슀의 μ΅œμƒμœ„ 클래슀, λͺ¨λ“  ν΄λž˜μŠ€λŠ” object 클래슀λ₯Ό μƒμ†λ°›λŠ”λ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μžλ™ import ν•œλ‹€.

μ‚¬μš©μžκ°€ 직접 extendsν•˜μ§€ μ•Šμ•„λ„ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ λ„£μ–΄μ€€λ‹€.

java.langνŒ¨ν‚€μ§€λŠ” μžλ°”μ—μ„œ κ°€μž₯ 기본적인 λ™μž‘μ„ ν•˜λŠ” 클래슀

java.langνŒ¨ν‚€μ§€λŠ” λ”°λ‘œ importν•˜μ§€ μ•Šμ•„λ„ ν΄λž˜μŠ€μ— μ΄λ¦„λ§ŒμœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯

ex) String, Void , System

  • java.lang.Object클래슀

λͺ¨λ“  클래슀의 졜고 쑰상 클래슀, λͺ¨λ“  ν΄λž˜μŠ€κ°€ object클래슀의 λͺ¨λ“  ν•„λ“œμ™€ λ©”μ„œλ“œ 상속 λ°›μŒ

λ”°λ‘œ extends ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©μ΄ κ°€λŠ₯ λ°”λ‘œ toString () λ©”μ„œλ“œλ₯Ό μ“Έ 수 μžˆλŠ” 이유

Object ν΄λž˜μŠ€λŠ” ν•„λ“œλ₯Ό 가지지 μ•ŠμœΌλ©°, 총 11개 λ©”μ„œλ“œλ‘œλ§Œ ꡬ성

  • toString()- toString() λ©”μ„œλ“œλŠ” 기본적으둜 apiν΄λž˜μŠ€λ§ˆλ‹€ 자체적으둜 μ˜€λ²„ 라이딩을 톡해 μž¬μ •μ˜λœλ‹€.
  • - 객체의 정보λ₯Ό stringν˜•νƒœλ‘œ λ°”κΎΈμ–΄ μ‚¬μš©ν•  λ•Œ μœ μš©ν•˜λ‹€.
  • - μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 정보λ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜, λ¬Έμžμ—΄μ€ 클래슀 이름@16μ§„μˆ˜ 해쉬 μ½”λ“œλ‘œ 좜λ ₯λœλ‹€.
  • clone()
  • filnalize()
  • getClass()
  • hashCode()
  • notify()
  • notifyAll()
  • wait() / wait(long timeout) / wait(long timeout, int nanos)
  • equals두 객체의 동일함을 λ…Όλ¦¬μ μœΌλ‘œ μž¬μ •μ˜ν•  수 있음
    • 물리적 동일함 : 같은 μ£Όμ†Œλ₯Ό κ°€μ§€λŠ” 객체
    • 논리적 동일함 : 같은 ν•™λ²ˆμ˜ 학생, 같은 μ£Όλ¬Έ 번호의 μ£Όλ¬Έ
    • 물리적으둜 λ‹€λ₯Έ λ©”λͺ¨λ¦¬μ— μœ„μΉ˜ν•œ 객체라도 λ…Όλ¦¬μ μœΌλ‘œ 동일함을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” λ§€μ„œλ“œ

 

m.blog.naver.com/PostView.nhn?blogId=piece1990&logNo=110166214610&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[JAVA] μƒμ†μ˜ κ°œλ… 및 νŠΉμ§•

[JAVA] JAVA κ³΅λΆ€ν•˜κΈ°! λ…ν•™μœΌλ‘œ λΉ„ν–‰κΈ° 배우기! λ³΄λ‹€λŠ” 쉽지 γ…‹: 세상에 μ‰½κ²Œ λ„˜μΉœλ‹€λ©΄, λ…Έλ ₯ν•˜μ§€...

blog.naver.com

www.tutorialspoint.com/Dynamic-method-dispatch-or-Runtime-polymorphism-in-Java

728x90
λ°˜μ‘ν˜•

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

[ JAVA ] μΈν„°νŽ˜μ΄μŠ€  (0) 2021.01.08
[ JAVA ] package  (0) 2021.01.01
[ JAVA ] μΆ”μƒν΄λž˜μŠ€  (0) 2020.12.20
[ JAVA ] 기본클래슀 ( Object, String, Wrapper)  (0) 2020.12.13
[ JAVA ] λ‹€ν˜•μ„± polymorphism  (0) 2020.12.06