본문 바로가기

Dev.BackEnd/JAVA

[JAVA] 6. 접근제어자와 정보은닉




Chapter 6. 접근제어자(access modifier)과 정보은닉(information hiding)

자바를 공부하기 전에 C언어 공부를 선행했다면,

반환형 함수이름 매개변수 말고 앞에 하나씩 더 붙고 있다는 걸 알았을 것이다.

자바에서는 정의한 클래스 또는 메소드에 접근할 수 있는 범위를 설정해두어서,

정보를 은닉해두고 더 나아가 캡슐화 한다.


제어자(modifier)
제어자란 클래스. 변수 또는 메서드의 선언부에 함께 사용되어
부가적인 의미를 부여하는 역할을 한다.
밑에서 설명할 접근제어자 말고도 몇 가지 제어자라고 불리는 것들이 존재한다.

static
앞에서 static 클래스, static 변수(클래스 변수)를 설명할 때 다뤘다.
이 또한 제어자라고 할 수 있다.

final
변수에 사용되면 값을 변경할 수 없는 상수가 되며,
메서드에 사용되면 오버라이딩을 할 수 있게 되고
클래스에 사용하게 되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.
객체지향의 철학과는 반대되는 제어자이다

abstract
미완성인, 추상적인 이라는 의미를 갖고 있다.
메서드에 선언부만 작성하고
실제 수행 내용은 구현하지 않은 추상 메서드를 선언하는데 사용된다.
추상 메서드가 선언되어 있는 클래스에도 붙여줘야 하는 제어자이다.
추상 클래스는 아직 완성되지 않ㄴ은 메서드가 존재하는 미완성 설계도 이므로 인스턴스를 생성할 수 없다.
(뒤에 추상 클래스에서 저 자세히 다룰 예정이다.)



접근제어자(access modifier)
접근 제어자는 멤버 또는 클래스에 사용되어,
해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 규제의 역할을 한다.

class A {
     public String y(){
          return "public void y()";
     }
     private String z(){
          return "public void z()";
     }
     public String x(){
          return z();
     }
}

public class AccessDemo1 {
     public static void main(String[] args) {
          A a = new A();
          System.out.println(a.y());
          // 아래 코드는 오류가 발생한다.
          //System.out.println(a.z());
          System.out.println(a.x());
     }
}

메소드 z는 private로 선언이 되어 있기 때문에
자신이 정의된 클래스 내에서만 호출될 수 있다.
그래서 바로 메소드 z를 호출하면 에러가 발생하지만
클래스 내에서 z를 호출하고 있는 x를 통해서 호출하면 에러가 발생하지 않는다.

privat을 통해 접근을 제한한 것이다.
public을 통해 접근을 해야 하는 것이다.
개발자의 의도를 전달할 수 있다는 장점이 존재한다.

은행을 예로 들자면
public은 은행 접수원 같은 역할이고
private는 금고같은 역할이다.
이런 역할 분담을 통해서
private으로 선언된 메소드를 보다 안전하게 관리할 수 있다. 



정보은닉(information hiding)
인스턴스 변수에 private를 선언하는것
외부에서 인스턴스 변수에 대한 접근을 막을 필요가 있을 때 사용한다.
private은 접근성과 관련있는 동시에 프로그램의 안정성에 직접적인 영향을 미치게 된다.
그러므로 가급적 인스턴스 변수는 private 선언과 함께 선언하자.
자바가 제공하는 접근제어 지시자는 총 4가지
public , private, protected, 그리고 아무것도 선언하지 않는 경우

public으로 선언된 인스턴스 변수와 메소드는 어디서든 접근 가능하지만
private로 선언되는 인스턴스 변수와 메소드는 선언된 클래스 내부에서만 접근이 가능하다.
아무것도 선언하지 않는 경우(default 경우) 에는 동일 패키지 내에서의 접근을 허용한다.
public > protected > default > private
private < (default) < protected < public
순서로 공개의 범위(visible)이 넓어진다.
private : 같은 클래스
(default) : 같은 패키지
protected : 자손 클래스
public : 전체
cf) 정보제어자는 규제 static은 자유, 조금 다른 개념!


public class
어디서나 인스턴스 생성이 가능하도록 하기 위해 class 앞에 public을 붙인다.
하나의 소스파일에는 하나의 클래스만 public할 수 있다.
public 클래스 파일의 이름과 소스파일의 이름은 완전히 일치해야 한다.
일반적으로 메소드는 public으로 선언한다.




Chapter 6. The End