[Java-OOP4] 상속

이용준·2022년 10월 31일
0

Java

목록 보기
16/29
  • 상속 : 부모 클래스의 기능을 자식 클래스가 물려 받는 것.
    1. 상속(extends)
    2. 확장
    3. Is-A관계
    4. 메소드 오버라이딩(overring)
    5. 메소드 오버로딩(overloading)
    6. 다중 상속(X)

1.상속

class Animal{
  String name;
  
  void setName(String name){
    this.name = name;
  }
}

class Dog extends Animal{  // 상속
}

public class Sample{
  public static void main(String[] args){
    Dog dog = new Dog();
    dog.setName("bob");
    System.out.println(dog.name); // bob 출력
  }
}  

클래스 상속을 위해 extends 키워드를 사용한다.
Dog은 Animal 클래스를 상속하므로 Animal클래스의 setName메소드 사용 가능하다.

2.확장

부모 클래스의 기능 확장

  • Dog 클래스의 sleep 메소드 추가하기
class Animal{
  String name;
  
  void setName(String name){
    this.name = name;
  }
}

//sleep 메서드 추가
class Dog extends Animal{
  void sleep(){
    System.out.println(this.name+" zzz");
  }
}  

public class Sampele{
  public static void main(String[] argd){
    Dog dog = new Dog();
    dog.setName("bob");
    System.out.println(dog.name);
    dog.sleep();  // bob zzz 출력
  }
}  

Dog 클래스는 Animal 클래스에 비해 기능이 많아졌다. 이처럼 보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 비해 좀 더 많은 기능을 갖도록 작성한다.

3.Is - A 관계

Dog 클래스는 Animal 클래스를 상속했다.
Dog는 Animal에 포함되기 때문에 "Dog is aAnimal"과 같이 말할 수 있는 관계를 Is-A 관계라 하며, 이렇게 Is-A 관계(상속관계)에 있을 때 자식 클래스 객체는 부모 클래스의 자료형인 것 처럼 사용할 수 있다.

Animal dog = new Dog; // Dog is a Animal

4. 메소드 오버라이딩(Metod Overriging)

이번에는 Dog 클래스를 더 구체화시키는 HouseDog 클래스를 생성한다.

class Animal{
  String name;
  
  void setName(String name){
    this.name = name;
  }
}

class Dog extends Animal{
  void sleep(){
  System.out.println(this.name+" zzzz");
  }
}

// Animal > Dog > HouseDog 생성
class HouseDog extends Dog{
}

public class Sample{
  public static vod main(String[] argd){
    HouseDog housedog = new HouseDog();
    housedog.setName("shop");
    housedog.sleep();  // shop zzzz출력
  }
}

dog를 상속받는 HouseDog을 생성했다. 그러나 Dog의 sleep 메소드를 변경하고 싶다면 HouseDog의 sleep 메소드에 다른 기능으로 덮어쓰는(변경) 오버라이딩(overriding)을 통해 변경하면 된다.

  • 변경 후
    class Animal{
     String name;
     
     void setName(String name){
       this.name = name;
       }
     }
     class Dog extends Animal{
       void sleep(){
         System.out.println(this.name + " zzz");
       }
     }
     // 메소드 오버라이딩
     class HouseDog extends Dog{
       void sleep(){
         System.out.println(this.name + " zzz home alone")
       }
     }
     
     public class Sample{
       public static void main(String[] args){
       HouseDog houseDog = new HouseDog();
       houseDog.setName("tom");
       houseDog.sleep(); // tom zzz home alone 출력
       }
     }
    이렇게 부모클래스의 메소드를 자식 클래스가 동일한 형태로 재구현하는 것을 메소드 오버라이딩이라 한다.

    5.메소드 오버로딩(method overloading)

    이번에는 HouseDog 클래스에 아래의 메소드를 추가해보자.
    void sleep(int hour){
      System.out.println(this.name+" zzz at home for "+hour+"hours");
    }
    입력 인자가 다른 경우 동일한 이름의 메소드 생성이 가능하다.(오버로딩)
    class Animal{
      String name;
      
      void setName(String name){
        this.name = name;
      }
    }
    
    class Dog extends Animal{
      void sleep(){
        System.out.println(this.name+" zzz");
      }
    }
    
    class HouseDog extends Dog{
      void sleep(){
        System.out.println(this.name+"zzz in house");
      }
      // 메소드 오버로딩
      void sleep(int hour){
        System.out.println(this.name+" zzz in house for "+hour+" hours");
      }
    }

    6.다중 상속

    자바는 다중 상속을 지원하지 않는다.
profile
뚝딱뚝딱

0개의 댓글