본문 바로가기

Study/Java Study

8장. 상속과 다형성

1. 상속

: 기존 클래스의 기능을 사용하여 새 클래스를 만드는 기술

  • 자식 클래스는 부모 클래스에 없는 새 필드를 가질 수 있음
  • 자식 클래스는 부모 클래스로부터 상속받은 필드를 직접 사용할 수 있음.
  • 부모 클래스에 있는 메서드와 이름이 같은 메서드를 자식 클래스에서 재정의 또는 추가 모두 가능.
  • 부모 클래스의 메서드를 호출하기 위해 별도의 객체 선언 필요 없음
  • 부모 클래스의 생성자를 호출하는 생성자를 정의할 수 있음. * super *
  • 자식 클래스는 부모 클래스에 없는 메서드를 가질 수 있으므로 부모 클래스의 보다 나은 버전이 됨.

 

부모 클래스 : 다른 클래스에 멤버 요소(메서드와 변수)를 상속하는 클래스 

= 상위 클래스 = 슈퍼 클래스 = 기본 클래스

 

자식 클래스 : 다른 클래스의 멤버 요소를 상속받은 클래스

= 하위 클래스 = 서브 클래스 = 파생 클래스

 

class 자식클래스 extends 부모클래스 {
         \\ 멤버 요소
}

+ Is-A 관계

: ~는 ~이다 라는 의미로 상속을 나타내며, 부모-자식 관계라고도 불림

  • extends 와 implements 키워드로 구현됨
  • 상속은 단방향으로만 이루어짐

 

2. 상속의 유형

 

㉮ 단일 상속

: 클래스가 하나의 클래스에 의해서만 확장되는 것 

 

즉,  부모 클래스 하나, 자식 클래스도 하나뿐!!

클래스 간의 단일 상속

 

 

                                                                         

㉯ 다단계 상속

: 클래스가 하나의 클래스에 상속하고, 상속받은 자식 클래스가 또 다른 클래스에 상속하는 것

클래스 간의 다단계 상속

 

 

㉰ 계층적 상속

: 단일 부모 클래스의 값과 메서드를 여러 자식 클래스에 전달하는 것

 

즉, 한 클래스가 부모클래스, 나머지가 자식 클래스

 

클래스 간의 계층적 상속


※ super를 이용한 부모 클래스 참조 ※

자식 클래스는 부모 클래스를 참조하기 위해  super 키워드를 사용!!

 

super를 이용한 변수와 메서드 접근 >

public class SuperCat {
   String breed = "샴고양이";
   String age = "15살";
   
   void printInfo() {
     System.out.println("부모 고양이입니다.");
   }
}
public class SubKitten extends SuperCat {
  String age = "2살";
  
  void printInfo() {
     System.out.println("아기 고양이입니다.")
  }
  
  void printDetail() {
     super.printInfo();
     System.out.println("품종은" + breed + ", 나이는 " + age);
  }
}
public class Example {
  public static void main(String[] args) {
     SubKitten objCat = new SubKitten();
     objCat.printDetail();
  }
}

실행결과 >

부모 고양이입니다.
품종은 샴고양이, 나이는 15살
아기 고양이입니다.
품종은 샴고양이, 나이는 2살

 

super()를 이용한 생성자 접근 > 

 

super() : 부모 클래스의 생성자를 호출하는 명령

public class Parent2 {
  String name = "홍길순";
  
  Parent2() {
    System.out.println("부모 이름 : " + name);
  }
}
public class Child2 extends Parent2 {
   String name = "홍길동";
   
   Child2() {
     super();
     System.out.println("자식 이름 : " + name)
   }
}
public class Inheritance {
   public static void main(String[] args) {
       Child2 objChild = new Child2();
   }
}
부모 이름 : 홍길순 
자식 이름 : 홍길동

 

3. 다형성

: 하나의 객체가 여러가지 유형을 띠는 것

 

다형성의 이점
1. 단일 메서드를 다른 클래스에서 다르게 작동 가능
2. 동일한 구현에 대해 다른 메서드명을 선언할 필요 없음
3. 상속을 더 쉽게 구현 가능

다형성의 유형

  • 메서드 오버로딩

: 메서드명이 같지만 다른 매개변수를 사용하는 프로세스

 

인수의 개수나 유형을 변경함으로써 오버로딩될 수 있음

class CalculateSquare {
   public void square() {
      System.out.println("No Parameter Method Called");
   }
   
   public int square(int width, int height) {
      int area = width * height;
      return area;
   }
   
   public double square(double width, double height) {
      double area = width * height;
      return area;
   }
   
   public double square(int width, double height) {
      double area = width * height;
      return area;
   }
}
public class Polymorphism01 {
   public static void main(String[] args) {
      CalculateSquare myArea = new CalculateSquare();
      System.out.println("가로:10, 세로:5 사각형의 넓이는 " + myArea.square(10,5));
      System.out.println("가로:2.5, 세로:4.5 사각형의 넓이는 " + myArea.square(2.5,4.5));
   }
}

실행 결과 >

가로:10, 세로:5 사각형의 넓이는 50
가로:2.5, 세로:4.5 사각형의 넓이는 11.25
  • 메서드 오버라이딩

: 부모 클래스로부터 상속받은 메서드를 자식 클래스에서 특정한 형태로 재정의하는 것

 

public class Animal {
   void eat() {
      System.out.println("먹이를 먹다");
   }
   
   public void animalSound() {
      System.out.println("동물이 소리를 낸다.");
   }
}
public class Pig extends Animal {
   public void animalSound() {
      System.out.println("돼지는 꿀꿀꿀");
   }
}
public class Dog extends Animal {
   void bark() {
      System.out.println("멍멍하고 짖다.");
   }
   
   public void animalSound() {
      System.out.println("개는 멍멍멍");
   }
}
public class Polymorphism02 {
   public static void main(String[] args) {
      Animal myAnimal = new Animal();
      Animal myPig = new Pig();
      Animal myDog = new Dog();
      myAnimal.animalSound();
      myPig.animalSound();
      myDog.animalSound();
   }
}

실행 결과 >

동물이 소리를 낸다. 
돼지는 꿀꿀꿀
개는 멍멍멍

 

'Study > Java Study' 카테고리의 다른 글

10장. 패키지  (0) 2023.05.28
9장. 추상 클래스와 인터페이스  (0) 2023.05.22
7장. 클래스와 객체  (0) 2023.05.20
6장. 배열과 문자열  (0) 2023.05.20
5장. 메서드  (1) 2023.04.09