'Inheritance'에 해당되는 글 1건

[Java] 자바 상속 (inheritance)과 Object 클래스


상속 (inheritance)


상속이라는 게 대체 무엇일까? 

상속에 대해 알아보기 전에 먼저 다음 예제를 천천히 확인해보자.



BasicCalculator 계산기 예제


public class BasicCalculator {

  int result;
 
  void plus(int value) {
    this.result += value;
  }
 
  void minus(int value) {
    this.result -= value;
  }

} 




BasicCalculator 인스턴스 생성 및 plus(), minus() 호출 코드


public class Test01 {

  public static void main(String[] args) {
    BasicCalculator calc = new BasicCalculator(); // 인스턴스 생성
    calc.plus(100); // -> 100
    calc.plus(20); // -> 120
    calc.minus(30); // -> 90
    System.out.println(calc.result);
  }

}


BasicCalculator 클래스에는 plus 메서드와 minus 메서드가 있고 위 호출 코드와 같은

방식으로 메서드를 사용할 수 있다. 그러나 만약 '원본'을 손상시키지 않는

방식으로 multiple이라는 곱하기 메서드를 추가하고 싶다면 어떻게 해야 할까?


처음에 사람들은 BasicCalculator 클래스의 소스 코드를 복사해 아래 예제와 같은 

새로운 클래스를 만들었다.




BasicCalculator 소스를 복붙해 만든 AdvancedCalculator 계산기 예제


public class AdvancedCalculator {

  int result;
 
  void plus(int value) {
    this.result += value;
  }
 
  void minus(int value) {
    this.result -= value;
  }
 
  // 새 곱하기 기능 추가
  void multiple(int value) {
    this.result *= value;
  }
}


그리고 다음과 같이 위에서 만든 AdvancedCalculator 클래스의 인스턴스를 새롭게 

생성해서 사용했다.




AdvancedCalculator 인스턴스 생성 및 plus(), minus(), multiple() 메서드 호출 코드


public class Test02 {

  public static void main(String[] args) {
    AdvancedCalculator calc = new AdvancedCalculator();
    calc.plus(100);
    calc.plus(20);
    calc.minus(30);
    calc.multiple(2);
    System.out.println(calc.result);
  }

}



원인 :

'상속'이라는 문법을 사용하기 전에는 이와 같이 기존에 있던 코드를 복붙해 추가

하고 싶은 메서드(기능)를 새롭게 작성하고, 이렇게 만들어진 class의 인스턴스를 생성

함으로써 유지보수를 했다. 그러나 점차 문제점이 드러나기 시작하는데, 회사의 

규모가 커지거나 해당 class를 공유하는 고객사가 많아질수록 소스 코드를 유지보수

하기 어려워진 것이다. 



결과 :

지속적인 복사 붙여넣기를 통해 발생된 낭비를 방지하기 위해

도입된 것이 '상속'이라는 문법이다.



해결방법


 1) 새 클래스를 만들어 곱하기 기능을 추가한다.

 2) BasicCalculator의 기능을 사용하겠다고 선언한다.




상속 예제


public class AdvancedCalculator extends BasicCalculator{
  int result;
  
  void multiple(int value) {
    this.result *= value;
  }

}


위와 같이 extends를 적고, 가져다 쓰고 싶은 메서드를 가진 class 이름을

적어주면 기능을 상속받을 수 있게 된다.



.이때 BasicCalculator를 parent class (부모 클래스) / super class

AdvancedCalculator를 child class (자식 클래스 / sub class 라고 부른다.


* 참고 : 

  super 클래스를 지정하지 않으면 자동으로 Object가 수퍼 클래스로 선언된다.

  

Object 클래스가 하는 일

  - 객체가 기본적으로 갖춰야 할 변수와 메서드를 제공한다.

  - 주요 메서드

     - toString()    : 클래스이름과 인스턴스 ID를 리턴한다. 

=> 프로그램을 실행할 때 인스턴스의 내부 값을 간단히 

살펴볼 수 있도록 서브 클래스들이 이 메서드를 재정의 

하기도 한다. 


     - equals()      : 인스턴스의 주소를 비교하여 true/false 값을 리턴한다.

=> 인스턴스 내부의 값을 비교하도록 서브 클래스에서 이

메서드를 재정의하기도 한다.


     - hashCode()  : 인스턴스를 구별할 때 사용하는 4 byte 숫자로 된 ID 값.

=> 인스턴스 변수의 값이 같을 때 같은 ID 값을 리턴

하도록 서브 클래스에서 이 메서드를 재정의하기도 한다.


     - getClass()    : 클래스 설계도를 리턴한다.    


     - finalize()     : 쓰레기 수집기(garbage collector)가 가비지를 메모리에서

     제거하기 전에 호출하는 메서드이다.

     => 쓰레기 수집기가 언제 호출되는지 알 수 없기 때문에 

  자주 쓰이지는 않는다.


  - 참조 문서 : http://docs.oracle.com/javase/8/docs/api/index.html







블로그 이미지

필로그래머

,