우당탕탕 개발_𝒍𝒐𝒈

접근 제어자 본문

𝐬𝐭𝐮𝐝𝐲/𝐉𝐚𝐯𝐚

접근 제어자

hojeong01 2024. 2. 10. 14:43
- 4가지의 접근제어자를 알아보고 실제 코드로 작성해 보며 언제, 어떻게 사용되는지 알아보자
- 접근제어자를 가미한 '캡슐화'에 대해 다시 정의해보자

접근제어자


#1 접근제어자의 종류

  • private : 모든 외부의 호출을 막는 접근제어자 
  • default(package - private) : 같은 package 안에서만 호출을 허용하는 접근제어자 
  • protected : 같은 package 안에서만 호출을 허용함과 동시에 package가 달라도 상속관계의 호출은 허용한다.
  • public : 모든 외부 호출을 허용하는 접근제어자

#2 접근제어자의 사용 위치

  • 메서드, 필드, 생성자, 클래스에 사용된다. 

(지역변수에는 사용되지 않는다.)

<이유> : 지역변수는 자신이 속한 메서드 안에서만 접근이 가능하며 메서드의 종료에 따라 함께 종료되기 때문에 별도의 접근제어자를 필요로 하지 않는다. 또한 대상의  데이터/ 기능을 정의하는 메서드, 필드는 다른 곳에 접근이 가능해야 하지만 지역변수의 경우 특정 메서드 에서의 임시적인 값을 저장하는 용도이기 때문에 접근제어자를 필요로 하지 않는다.

 


 

#3 접근제어자의 사용 - (필드, 메서드)

- access package 생성 후 a, b 두 가지의 package 생성하기 

- a package에 AccessData 클래스 생성 후 필드에 4가지의 접근제어자를 데이터 작성

public class AccessData {
    public int publicField;
    int defaultField;
    private int privateField;
    protected int protectedField;

- 해당 데이터를 호출하는 메서드 생성

public void publicMethod(){
    System.out.println(" publicMethod 호출:"+ publicField);
}

void defaultMethod(){
    System.out.println(" defaultMethod 호출:"+ defaultField);
}

private void privateMethod(){
    System.out.println(" privateMethod 호출:"+ privateField);
}

protected void  protectedMethod(){
    System.out.println(" protectedMethod 호출:"+ protectedField);
}

- 내부호출 메서드 생성

public void innerAccess(){
    System.out.println("내부호출");
    publicField = 100;
    defaultField = 200;
    privateField = 300;
    protectedField = 400;
    publicMethod();
    defaultMethod();
    privateMethod();
    protectedMethod();
}

 

  • 4가지의 접근제어자 모두 '내부호출'은 가능하다. 

- a package에 AccessInnerMain 클래스 생성 

- 인스턴스를 생성하여 해당 데이터로 접근해 보기

public class AccessInnerMain {
    public static void main(String[] args) {
        AccessData data = new AccessData();

        data.publicField=3;
        data.publicMethod(); //가능

        data.defaultField=3;
        data.defaultMethod();//가능

        data.protectedField = 4;
        data.protectedMethod();//가능

        data.privateField=3;
        data.privateMethod();//오류

        data.innerAccess();//가능
        
        }

<호출 결과>

- 외부 호출을 막는 private 접근 제어자 외 모두 호출을 성공했다.

 

내부호출(innerAccess()) 속에 있는 privateMethod가 호출 성공한 이유

  public void innerAccess(){

innerAccess() 접근 제어자가 public이기 때문이다. 

 

<접근과정 그림 추가>

 

 


#3 접근제어자의 사용 - (클래스)

접근제어자는 클래스 레벨에서도 사용가능하며 아래와 같은 규칙을 가진다.

  • public, default 두 가지의 접근 제어자만 사용이 가능하다.
  • 하나의 파일 속에는 한 개의  public 클래스만 가능하며 이때 클래스의 이름이 파일명과 동일해야 한다.

즉 클래스는 하나의 자바파일에서 여러 개를 생성할 수 있지만 public 클래스는 단 한 개만 존재해야 한다. 

<이유>

자바 컴파일러는 파일의 이름과 public 클래스의 이름이 일치하길 기대한다. 

클래스 로더가 클래스를 찾고 일관성을 유지하고, 코드구조를 명확하게 유지하기 위한 일종의 관례이다.

만약 파일 내에 public 클래스가 두 개 이상 작성된다면 컴파일 시 클래스 이름과 public 선언이 일치하지 않는다는 오류가 발생하게 된다. 

 

오류 예시

//MyClass1.java 파일

public class MyClass1 {
    // 클래스 내용
}

public class MyClass2 {
    // 다른 클래스 내용
}

- 파일명과 클래스명의 불일치

- public 클래스가 두 개 작성


# 4 캡슐화 

지난번 '객체지향'에 대해 공부 중

'데이터와 기능을 하나의 캡슐 안에 모으는 것'을 중심으로 '캡슐화'에 대해 이해하였다. 

접근제어자까지 학습 후 어떤 것이 좋은 캡슐화일까? 에 대한 질문의 답을 찾을 수 있었다.

 

"데이터는 모두 숨기고 기능은 반드시 필요한 기능만 노출하는 것이 좋은 캡슐화이다"

 

이로 사용자의 데이터 직접적인 변경을 방지, 제한한다. 

사용자는 객체가 제공하는 기능인 메서드를 통해 객체의 데이터에 접근해야 한다. 

그렇지 않으면 보안문제, 유지보수의 어려움등의 문제가 발생할 수 있다. 

 

1. 데이터는 필수적으로 숨기며 2. 기능 또한 사용자의 입장에서 꼭 필요한 것만 열기를 기억하여 

적절한 접근제어자를 사용하여 캡슐화를 하는 것이 중요하다. 

(예시)

오디오

[외부 사용] : on/off , volume up/down

[내부 사용] : volume 기초 값 / 만약 100을 넘으면 안 되는 조건이 있다면 사용자가 볼륨데이터를 200으로 지정하지 못하도록 private 접근제어자를 사용하여 막아야 한다.

 

<그림 추가>


접근 제어자와 캡슐화를 통해 데이터를 안전하게 보호하고 이를 사용하는 개발자의 입장에서 해당 기능을 사용하는 복잡도를 낮출 수 있다.(public - 가져다 사용해도 됨)

 

좋은 프로그램은 무한한 자유가 주어지는 프로그램이 아닌 적절한 제약을 제공하는 프로그램이다.

'𝐬𝐭𝐮𝐝𝐲 > 𝐉𝐚𝐯𝐚' 카테고리의 다른 글

객체 지향 프로그래밍  (1) 2024.02.04