본문 바로가기
  • Jetpack 알아보기
Java & Kotlin/ʕ•ᴥ•ʔ

자바의 객체 지향적 특징 (1) - 상속(Inheritance)

by 새우버거♬ 2021. 7. 14.

INTRO

객체 지향 언어의 특징 중 하나는 상속(Inheritance)입니다. 이것만큼 워딩 그대로 그 뜻을 잘 표현하는 것은 없는 것 같습니다. 상속은 말 그대로 한 클래스가 다른 클래스의 속성(메서드 및 필드)을 획득하는 것입니다. 보통 다른 클래스의 속성을 받는 클래스를 하위 클래스(자식 클래스), 특성을 주는 클래스를 상위 클래스(부모 클래스)라고 합니다.

 

상속을 이용하면  상위 클래스의 속성을 재사용하여 반복된 코드 중복을 줄일 수 있습니다. 하지만 객체 간의 속성과 관계를 잘 고려하여 상속을 이용하고, 구조를 설계하는 것이 중요합니다. 무분별한 상속은 오히려 객체 간의 결합도를 높여 유지보수와 수정이 어려워질 수 있습니다. 


extends 키워드

extends는 클래스의 속성을 상속하는 데 사용되는 키워드입니다. 하위 클래스가 상위 클래스의 속성을 상속하고 싶을 경우, 다음과 같이 작성할 수 있습니다.

class Super {
   .....
}

class Sub extends Super {
   .....
}

계산기 클래스를 이용해 간단하게 상속을 구현해봅니다. 먼저, 간단하게 '더하기' 기능이 있는 Caculation 클래스가 있습니다.

class Calculation {
   int z;
	
   public void addition(int x, int y) {
      z = x + y;
   }
}

여기서 우리는 '빼기' 기능이 추가해서 나만의 계산기를 만들고 싶습니다. 이미 Caculation 클래스에서 '더하기' 기능을 구현했으니 굳이 또 구현할 필요가 없습니다. 우리는 extends 키워드를 이용해 Caculation 클래스의 메서드와 필드를 받는 MyCaculation 클래스를 생성할 수 있습니다.

public class MyCalculation extends Calculation {
   public void Subtraction(int x, int y) {
      z = x - y;
   }
}

super 키워드

super는 this 키워드와 유사합니다. 상위 클래스의 메서드 및 필드에 접근하기 위한 키워드입니다. 대표적으로 다음과 같은 경우에 사용하는 키워드입니다.

  

1. 동일한 이름을 가진 하위 클래스의 속성과 상위 클래스의 속성을 구별하기 위해

2. 하위 클래스에서 상위 클래스의 생성자를 호출하기 위해

 

아래 코드처럼 super 키워드를 이용해 상위 클래스의 생성자로 파라미터 값을 넘겨줄 수 있습니다.

class Superclass {
   int age;

   Superclass(int age) {
      this.age = age; 		 
   }

   public void getAge() {
      System.out.println("The value of the variable named age in super class is: " +age);
   }
}

public class Subclass extends Superclass {
   Subclass(int age) {
      super(age);
   }

   public static void main(String args[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}

IS-A / HAS-A 관계

IS-A 관계

IS-A 관계는 'A는 B이다' 관계입니다. 이 객체가 해당 객체의 타입이라는 것을 표현합니다. 

public class Animal {}
public class Mammal extends Animal {}

public class Dog extends Mammal {}

 

HAS-A 관계

HAS-A 관계는 'A는 B를 가지고 있다' 관계입니다. 이 관계는 코드의 중복과 버그를 줄이는 데 도움이 됩니다.

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
}

Overriding

Overriding은 '재정의'라는 뜻입니다. 객체 지향 개념에서 Overriding 이란, 기존 메서드의 기능을 재정의하는 것을 의미합니다. 클래스가 상위 클래스에서 메서드를 상속하는 경우, 메서드를 재정의할 수 있습니다. Overriding을 이용하면 하위 클래스만의 고유한 동작을 정의할 수 있습니다.

 

아래 코드를 보면 하위 클래스 Dog는 상위 클래스 Animal의 move() 메서드를 재정의(Overriding)하고 있는 것을 알 수 있습니다.

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();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}

※ 참고자료