관리 메뉴

공부한것들을 정리하는 블로그 입니다.

접근제한자 protected는 언제, 어떻게 사용해야 할까 본문

경력 실무경험/생각해볼만한 주제

접근제한자 protected는 언제, 어떻게 사용해야 할까

호 두 2023. 4. 25. 18:17
반응형

* 해당 글은 계속 수정 예정입니다.
최초 작성일 2022.04
마지막 수정일 2023.04

 

 

 

# 자바와 접근제한자

자바는 객체지향 언어입니다. 객체(object)란 실생활에서 우리가 인식할 수 있는 사물로 정의할 수 있고 
이러한 객체의 상태와 행동을 구체화하는 형태의 프로그래밍이 바로 객체지향 프로그래밍입니다. 

이때 객체를 만들어내기 위한 설계도와 같은 개념을 클래스라고 합니다. 

클래스는 객체의 상태를 나타내는 필드와 행동을 나타내는 메소드라는 멤버들로 구성되어 있으며 
모든 클래스는 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스라고 할 수 있습니다.

따라서 어떤 클래스의 객체의 생성은 결국 외부 클래스에서 진행이 되고
외부 클래스에서 접근이 가능한 멤버와 접근이 제한된 멤버로 구분하여 필드, 생성자, 메소드를 설계해야 합니다.

이렇게 외부 클래스에서 객체생성을 막는데 사용하기 위해 자바에서 제공하는 것이 접근제한자입니다.
접근제한자의 상세한 설명은 아래 내용 참고 바랍니다.

 


* 참고 : 본인 블로그

- 접근제한자 : https://drsggg.tistory.com/529

- 자바 및 객체, 객체지향 : https://drsggg.tistory.com/534

 


# 접근제한자 protected는 언제, 어떻게 사용해야 할까

접근제한자를 사용하여 객체생성을 막는것은 결국 
생성자를 호출하지 못하게 막거나
객체의 특정 데이터를 보호하기 위해 해당 필드에 접근하지 못하게 막는 것
또는 외부에는 불필요한 내부적으로만 사용되는 부분을 감추기 위해서입니다.

이러한 설계를 통해 테스트 범위를 제한 할 수 있고 캡슐화 할 수 있으며

경우에 따라서는 여러클래스의 다른 기능을 하나의 메소드로 제어하는 다형성도 얻을 수 있습니다.

여기서 접근제한자 protected는
패키지에 관계없이 상속관계에 있는 자손 클래스에서 접근할 수 있도록 하는것이 제한목적이지만 

같은 패키지 내에서도 접근이 가능합니다.

따라서 상속을 통해 확장될 것이 예상되는 클래스라면 멤버(필드, 메서드)에 접근 제한을 주되 자손클래스에서 접근하는 것이 가능하도록 하고자 할 때 private 대신 protected를 사용하게 됩니다.


마지막으로 protected의 사용예시와 함께 글을 마치겠습니다.

protected를 통해 여러클래스의 다른 기능을 하나의 메소드로 제어하는 다형성을 얻을 수 있습니다.

 


# protected의 사용예시

1. PayInstance클래스의 doEwalletPay 함수를 호출한다.

doEwalletPay 함수의 내부는 다음과 같다.

Class PayInstance {
    public void doEwalletPay(){
        PayInstance pay = PayFactory.getInstance(지불수단);
        this.setEwallet();
    }
}

 

2. PayFactory클래스의 getInstance 메서드에서는 지불수단에 따른 객체를 매핑해준다.

getInstance 함수의 내부는 다음과 같다.

Class PayFactory {
    public PayInstance getInstance(지불수단){

        mPay = new PayInstance();
        if(지불수단==카카오) return new PayInstance카카오();
        else if (지불수단==토스) return new PayInstance토스();
        else return new PayInstance();
    }
}

 

3. PayInstance카카오와 PayInstance토스는 PayInstance를 상속받고 있으며
PayInstance는 setEwallet 함수를 가지고 있다.

PayInstance.setEwallet 함수의 내부는 다음과 같다.

Class PayInstance {
    public void doEwalletPay(){
        PayInstance pay = PayFactory.getInstance(지불수단);
        this.setEwallet();
    }

    protected void setEwallet(){
        logger(간편결제 셋팅완료);
        return success;
    }
}

 

4. PayInstance카카오에서 setEwallet함수를 오버라이딩하여 재정의 후 사용한다.

PayInstance카카오에 .setEwallet 함수의 내부는 다음과 같다.

Class PayInstance카카오 extends PayInstance{
    @Override
    protected void setEwallet(){
        logger(카카오페이 간편결제 셋팅완료);
        return success;
    }
}

 

5. 여기서 setEwallet 함수를 protected로 사용한다.

테스트 결과는 다음과 같습니다.


=> 요청된 지불수단이 카카오인 경우

Class PayInstance {
    public void doEwalletPay(){
        PayInstance pay = PayFactory.getInstance(지불수단);
        this.setEwallet();  //카카오페이 간편결제 셋팅완료
    }
}


=> 요청된 지불수단이 토스인 경우

Class PayInstance {
    public void doEwalletPay(){
        PayInstance pay = PayFactory.getInstance(토스);
        this.setEwallet();  //간편결제 셋팅완료
    }
}


=> 요청된 지불수단이 네이버인 경우

Class PayInstance {
    public void doEwalletPay(){
        PayInstance pay = PayFactory.getInstance(네이버);
        this.setEwallet();  //간편결제 셋팅완료
    }
}

 

 

 

반응형
Comments