- 멤버변수나 메서드가 객체에 노출되지 않도록 설정하는 기법
- 객체를 사용하는 측의 실수로 인한 기능의 오작동을 방지하기 위해, 클래스 일부를 숨기는 처리를 말한다.
- 변수 이름이나 메서드 이름앞에 "접근 한정자"를 지정한다.
package hiding; class Student{ public String name = "자바학생"; private int weight = 100; } public class Main01 { public static void main(String[] args) { Student std = new Student(); // public 이므로 접근 가능 System.out.println(std.name); // private 이므로 접근 불가능 // System.out.println(std.weight } }
- 클래스에 접근 한정자를 지정한 경우
- 클래스의 분리
--> 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적 이므로, 기능단위로 소스코드를 분리해야 한다.
--> 소스코드가 분리된 클래스끼리는 public이 명시되어야만 서로 객체 생성이 가능하다.
--> 일반적으로 클래스 정의에는 public 접근 한정자만 사용한다.
--> 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다.
- 거의 대부분의 멤버변수는 은닉처리를 기본으로 한다.
- 멤버변수가 은닉된 형태로 선언된 경우 프로그램의 가장 근본적인 목적인 데이터에 접근하는 방법이 사라진다.
- 메서드를 통하여 간접적으로 접근하는 방법이 마련되어야 한다.
- getter, setter는 은닉된 멤버변수에 간접적으로 접근하기 위하여 정의된 메서드들을 의미하는 용어이다.
- 메서드 작성 예
- 'get', 'set' 접두사 뒤에 변수이름을 첫 글자가 대문자인 형태로 명시
- getter는 연결된 멤버변수의 데이터 타입을 리턴형으로 명시
- setter는 연결된 멤버변수의 데이터 타입을 파라미터 형으로 명시
package hiding; class StudentJava2{ // 은닉된 멤버변수 -> 현재 블록 안에서만 접근가능함 private String name; private int age; // getter 메서드 2개 // 은닉된 멤버변수의 값을 읽는 방법 public String getName() { return this.name; } public int getAge() { return this.age; } // setter 메서드 2개 // 은닉된 멤버변수에 값을 넣는 방법 public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } } public class Main03 { public static void main(String[] args) { // 객체생성 StudentJava2 sj = new StudentJava2(); // setter 임의의 데이터 세팅, name, age 모두 sj.setName("JAVA학생"); sj.setAge(20); // getter 출력, name, age 모두 System.out.println(sj.getName()); System.out.println(sj.getAge()) } }
- 자바 언어에서 사용하는 복합적인 데이터 표현의 최소 단위로서, 재사용 가능한 컴포넌트(구성요소)를 생성할 수 있다.
- 자바빈즈 클래스로서 작동하기 위해서, 객체 클래스는 명명법, 생성법 그리고 행동에 관련되어 일련의 관례를 따라야만 한다.
- 지켜야할 관례
-> 클래스는 생성자를 가지고 있어야한다.
-> 클래스 속성들은 getter, setter 메서드들을 사용해 접근할 수 있어야 한다.
- 접근 제한자는 객체지향의 캡슐화, 그리고 그를 통한 은닉화를 위한 도구이다.
- 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다.
- 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게하고 코드를 명확히 함
- 외부에서 멤버를 엑세스하는 방법을 지정할 수 있도록, 직접 접근을 막거나 접근 전
부가적인 처리를 요구함- 정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함
class Person{ int age; void howOld(){ system.out.println( age ); } } class Main{ public static void main( String[] args ){ Person p1 = new Person(); p1.age = -1; p1.howOld(); } } //------------------------------------------------------------------ // setter는 이렇게 변수의 값 대입이 여러 곳에서, 제한 없이 가능한 것을 접근 제한자로 막고, // 접근 범위에 한해서 메소드로 대입전 값을 처리 후 대입되게 하기 위해 사용된다. class Person{ private int age; public void setAge( int age ){ if( age >= 0 ){ this.age = age; } else { this.age = 0; } } void howOld(){ system.out.println( age ); } } class Main{ public static void main( String[] args ){ Person p1 = new Person(); p1.age = -1; p1.howOld(); } } /* 변수의 접근을 private로 처리해서 해당 클래스 안에서만 노출되게 바꾸고, 다른 사람들도 사용할 필요가 있는 변수들만 getter를 이용해서 드러냈다. 이렇게 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것이 getter */ class Person{ private int age; private String name; private String hobby; private String gender; public void setGender( String gender ){ this.gender = gender; } public void setAge( int age ){ if( age >= 0 ){ this.age = age; } else { this.age = 0; } } void howOld(){ system.out.println( age ); } }