접근제어자

p_chan.log·2023년 2월 3일

접근제어자란?

접근 제어자는 클래스나 변수, 메서드의 접근을 제어하기 위해 적어주는 예약어

접근제어자 사용 이유

  • 외부로부터 데이터 보호
  • 외부에서 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서 => 데이터 감추기(data hiding)이고 캡슐화(encapsulation)에 해당
  • 값의 유효성 검사의 기능도 함

대상에 따른 사용 가능한 접근 제어자

  • 클래스 -> public ,default
  • 메서드, 멤버변수 -> public, protected, default, private (모두)
  • 지역변수 -> X

범위

private -> default -> protected -> public 순으로 보다 많은 접근을 허용한다.

private

private이 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능

default

접근 제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메서드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능

protected

protected가 붙은 변수, 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능하다.

public

public 접근제어자가 붙은 변수, 메서드는 어떤 클래스에서라도 접근이 가능하다.

제어자의 조합 주의사항

  • 메서드 (static, abstract) 함께 사용 불가 -> static은 몸통 있어야 사용 가능
  • 클래스 (abstract, final) 동시 사용 불가 -> final은 확장x, private면 자손 클래스에서 접근 불가
  • abstract의 메서드는 private 불가 -> abstract메서드는 자손에서 구현해야함. private면 자손에서 접근 불가
  • 메서드 (private, final) 같이 사용 불가 -> private는 오버라이딩 안되기 때문에 하나만 사용해도 의미 같음

스터디 개인 출제문제

  1. 다른 클래스 , 패키지에서도 private 변수에 접근할 수 있도록 해주는 메서드는??
    답 : getter / setter

  2. protected로 구현된 메소드는 반드시 자식클래스가 override를 해야한다?
    답 : X

  3. abstract메서드의 접근 제어자는 private일 수 있다/없다
    답 : X

  4. 접근제어자를 사용하는 궁극적 목표는 캡슐화이다 그렇다면 spring을 이용한
    개발 중 사용했던 캡슐화의 대표적 예시는?
    답 : DTO, model, domain, JPA entity

  5. public 메소드는 private 멤버와 프로그램 사이의 ( ) 역할을 수행한다고 할 수 있습니다.
    ( )안에 답을 넣으시오.
    답 : 인터페이스(interface)

  6. 네모에 들어갈 수 있는 접근제어자는?

    답 : protected, public


class Calculator{
    int left, right;

    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }

    private int _sum(){
        return this.left+this.right;
    }

    public void sumDecoPlus(){
        System.out.println("++++"+_sum()+"++++");
    }
    
    public void sumDecoMinus(){
        System.out.println("----"+_sum()+"----");
    }
}

class Main {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        
        c1.setOprands(10, 20);
        c1.sumDecoPlus();
        c1.sumDecoMinus();
    }
}

1. 위 코드는 캡슐화된 코드인가?

답 : NO
이유 : 멤버변수가 private로 지정되어 있어야 함

2. Main 클래스 실행 결과는?

답 : ++++30++++
----30----



1  class Hello{
2      protected static void hello(){
3          System.out.println("HELLO!");
4      }
5  }
6 
7  class Hi{
8     private static void hi(){
9         System.out.println("HI!");
10     }
11 }
12 
13 class Main02{
14     public static void main(String[] args) {
15         Hello.hello();
16         Hi.hi();
17     }
18 }

3. 위 코드는 정상적으로 실행되는가?

답 : 에러

4. 3번의 이유는?

답 : 16번에서 에러
이유 : private 로 지정되어있어서 호출 불가능

profile
개발자 박찬의 노트

0개의 댓글