Java

[Java] 상속2

꽃달린감나무 2022. 1. 4. 15:56
728x90

접근 제어 지시자  protected

protected는  다른 패키지에 있다하더라도 상속관계에 놓이면 접근을 허용하는 접근 제어 지시자이다.
private 멤버도 마찬가지로 상속되지만 선언된 클래스 내에서만 접근이 가능하기 때문에 하위 클래스에서 접근이 불가능하다. 따라서 간접적인 접근 방식을 사용해야한다. 아래 예제 getAccVal()와 같이 접근을 할 수 있다.

class Accumulator{  //숫자를 누적하는 클래스
  
//선언된 클래스내에서만 접근이 가능하도록 private로 선언
  private int val;
  
  Accumulator(int num){ val = num; }
  
//상속관계에 놓인 클래스만 사용가능
  protected void accumulate(int num){
    
    if(num<0)
        return;
        
    val += num;
  }  
  
//private 멤버인 val을 간접적으로 접근할 수 있게 해주는 메소드
  protected int getAccVal(){return val;}
  
}

class SavingAccount extends Accumulator{ // 적금기능을 담당하는 클래스
  
  public SavingAccount(int num){super(num);} //통장을 만들 때 입금
  
  public void saveMoney(int money){accumulate(money);}
  
  public void showSavedMoney(){
  
      System.out.println("지금까지의 누적액 : ");
      System.out.println(getAccVal()); // 간접적으로 접근
  }
  
}

public class PrivateInhertiance {

  public static void main(String[] args) {
        
       SavingAccount account = new SavingAccount(3000);
      
       account.saveMoney(4000);
       account.saveMoney(5000);
      
       account.showSavedMoney();
  }

}

Component Based Development(CBD)

CBD패러다임은 클래스 단위에서 사용하면 들인 노력에 비해 얻는 것이 미미하지만,  패키지 단위에서 사용하게 되면 재활용의 의미가 크다. 예를 들어 수납업무를 담당하는 패키지가 존재한다고 하자 클래스 30개로 이루어져 있는 이 패키지를 병원 수납창구에서 사용할려면 클래스 30개 전부가 아닌 단 몇 개의 클래스를 이해하는 것만으로 이 패키지를 활용할 수  있다. 들인 노력에 비해 얻는 것이 많아진다.

static 변수의 상속

클래스 멤버라 불리는  static 멤버들은 생성되는 인스턴스 마다 독립적으로 존재하는 멤버가 아니고, 생성되는 인스턴스가 함께 공유하는 멤버이다. 그럼 상위 클래스에서 정의되어 있는 static 멤버는 하위 클래스에서도 그냥 접근이 가능한가?

public으로 생성시 모두 접근이 가능하다 따라서 접근이 가능한지는 접근 제어 지시자를 확인해야하므로 접근보다는 어떻게 접근 해야하는가를 중점으로 알아보자.

package package1;

import package1.AdderFriend;


class Adder{
  
  public static int val;
  
  public void add(int num) {
    
    val +=num;
  }
}

class AdderFriend extends Adder{
  
  public void friendAdd(int num){
    val += num; // 상속관계에 있다면 하위 클래스에서도 이름만으로 접근이 가능
  }
  public void showVal(){
    System.out.println(val);
  }
}

public class StaticInhertance {

  public static void main(String[] args) {
    
    Adder adder = new Adder();
    AdderFriend friend = new AdderFriend();
    
    adder.add(10);
    friend.friendAdd(20);
    AdderFriend.val +=5; // 하위 클래스의 이름을 통해서도 접근할 수 있다.
    Adder.val +=10; //선언된 클래스의 이름을 통해서도 접근이 가능하다.
    friend.showVal();
  }

}

위 예제를 통해 상속관계에 놓인 static 멤버의 접근 방법은

  • 하위 클래스의 이름을 통해서 접근이 가능
  • 선언된 클래스의 이름을 통해서 접근이 가능
  • 상속관계에 있다면 하위 클래스에서도 이름만으로도 접근이 가능

생성자도 상속이 가능할까?

package package1;

class AAA{
  
  int num;
  
  public AAA(int n){
      num = n;  
  }
  
}
class BBB{
  
  public BBB(){
    super(0);
  }

}

public class ConstructorInhertance {

  public static void main(String[] args) {
      
       BBB b1 = new BBB(); // 인스턴스 생성 가능
       BBB b2 = new BBB(1); // 인스턴스 생성 불가능
  }

}

"생성자는 상속되지 않습니다". 는 인스턴스 b2와 (적절한 생성자가 존재하지 않아 생성 불가능) 같은 상황을 말하는 것이다.  생성자의 상속은  

public AAA(int n){
      num = n;  
  }

  public BBB(int n ){
   num = n ;
  }

을 뜻한다. 관점에 따라 생성자의 상속은  바뀔 수 있다.

728x90