♦ 자바의 접근 지정자(Access Modifier)
일반적으로 클래스는 독자적으로 사용되지 않고 여러 클래스들이 유기적으로 상호 작용하면서 하나의 프로그램으로 동작한다. 상호 작용시 잘못된 데이터의 저장을 방지하거나 보안을 위해서 접근을 제어할 필요성이 있는데, 이 경우 접근 지정자를 이용한다.
자바에서는 클래스, 메소드, 인스턴스 변수를 선언할 때 접근 지정자를 이용한다.
자바에서 제공되는 4가지 접근 지정자
접근지정자 | 같은 클래스 | 같은 패키지 | 상속 관계 | 다른 패키지 |
public | 가능 | 가능 | 가능 | 가능 |
protected | 가능 | 가능 | 가능 | 불가 |
default(friendly) | 가능 | 가능 | 불가 | 불가 |
private | 가능 | 불가 | 불가 | 불가 |
일반적으로 클래스와 메소드는 public 접근 지정자를 주로 사용한다.
인스턴스 변수는 private 접근 지정자를 주로 사용하는데, 이유는 외부에서 인스턴스 변수를 바로 접근 가능하게 제어하면 잘못된 데이터를 저장하거나 변경하는 등 데이터 무결성 문제가 발생할 수 있기 때문이다. 따라서 private 으로 직접 접근하지 못하게 제어하고 메소드를 통해서 데이터를 관리하는 방법을 권장한다.
여기서 객체지향의 캡슐화(Encapsulation)와 정보 은닉(Information Hiding)의 개념이 등장한다.
캡슐화(Encapsulation)
캡슐화란 데이터와 그 데이터를 처리하는 메소드를 하나로 묶는 것을 말한다.어떤 클래스를 사용함에 있어 그 클래스가 제공하는 메소드의 기능만을 알고 사용할 뿐 실제로 그 메소드가 어떻게 움직이는지는 외부에 드러나지 않도록 하는 것을 의미한다.
정보 은닉(Information Hiding)
은닉화란 클래스의 속성들을 private 으로 만들어 클래스 외부에서 함부로 건드리지 못하게 하는 것을 말한다. 클래스를 사용함에 있어 속성들에 직접 접근하는 것은 데이터 무결성에 치명적일 수 있기 때문에 getter/setter 메소드를 통해서만 접근이 가능하도록 한다.
public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class Test01 { public static void main(String[] args) { Student student = new Student(); student.setName("정대만"); student.setAge(23); String name = student.getName(); int age = student.getAge(); System.out.println(name); System.out.println(age); } }