접근제어자
목차
자바 클래스에는 접근제어자(Access Modifier)라는 것이 있습니다. 클래스, 멤버변수, 메소드에 모두 적용할 수 있는 키워드입니다.
접근제어자의 접근(Access)이 말하는 것 처럼 이 객체에 누가 접근할 수 있는 가를 결정합니다.
종류에는 public, private, protected, default 네가지가 있습니다. 이번 포스팅에서는 자바 private 접근제어자를 사용한 멤버변수에 대해 알아보겠습니다.
자바 private 접근제어자
그동안은 public 접근제어자를 사용했습니다. public 을 따로 설명하지 않는 것은 public 이 붙은 객체는 어디서든 사용할 수 있기 때문입니다. 접근에 제한이 없습니다.
반면 private 은 클래스 안에서만 사용가능합니다.
public class Main { public static void main(String[] args) { MyCar a1 = new MyCar(); a1.showInfo(); System.out.println(a1.carName); System.out.println(a1.carColor); System.out.println(a1.speed); // System.out.println(a1.password); } } class MyCar{ String carName; String carColor; private String password; int speed; MyCar(){ carName = "Sedan"; carColor = "Grey"; password = "1234!"; speed = 100; } void showInfo(){ System.out.println("Car name : " + carName + ", color : " +carColor + ", speed : " + speed); } }
Car name : Sedan, color : Grey, speed : 100 Sedan Grey 100
위 코드에서 private String password 는 이 클래스 안에서만 사용할 수 있습니다. 외부인 Main 클래스에서 값을 직접 사용하려고 하면 사용할 수 없다고 나옵니다.(주석처리)
왜 이렇게 불편하게 했냐는 질문을 한다면 굳이 외부에서 볼 필요가 없는 데이터라고 생각하기 때문입니다. 접근제어자를 활용해 보호해야할 데이터, 숨겨야할 데이터를 다루는 기술을 정보 은닉이라고 하며 객체지향 프로그래밍의 중요한 특징입니다.
이 클래스를 사용하는 사람도 마찬가지로 내부의 로직과 변수를 전부 다 알 필요가 없습니다. 소프트웨어 개발의 대규모화가 진행될 수록 중요합니다. 한 사람이나 부서에서 모든 일을 알기엔 너무 방대하므로 내가 만드는 로직과 다른 이가 만드는 로직에 대한 구분이 중요합니다.
그 첫번째 구분은 private 키워드의 사용에서 나타납니다. public 이 달려있는 클래스, 멤버변수, 메소드는 항상 열려있습니다. 어느 것을 닫을지 판단하는 것입니다.
getter 와 setter
private 멤버변수를 다룰때 이들에게 접근하기 위해 사용하는 메소드입니다.
위의 password 의 getter와 setter 를 만들어 보겠습니다. 직접 코딩해도 되지만 이클립스나 인텔리제이에는 코드 generator 가 있어서 클릭 한번이면 만들어줍니다.
public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
IDE가 만들어준 것인 만큼 getter 와 setter 의 기본 형태입니다. (게터와 세터)
a1.setPassword("bobakin7"); System.out.println(a1.getPassword()); [실행값] bobakin7
이렇게 하면 바깥에서 password에 접근할 수 있습니다. 그냥 멤버변수를 직접 사용하는 것보다 메소드 안에서 사용하기 때문에 생길 수 있는 오류들을 미리 사전에 방지할 수 있습니다. 예를 들어 숫자만 사용하는 규칙을 넣는다거나 특수문자를 넣을 수 없게 방지할 수 있습니다.
사용자는 여전히 값에 접근할 수 있지만 제한적 범위내에서 사용할 수 있습니다.
자바 접근제어자
정리하면 아래와 같습니다.
접근제어자 | 접근범위 |
---|---|
public | 제한없음 |
private | 클래스 내부에서만 |
protected | 같은 패키지 내부와 상속 관계 클래스 |
기본(default) | 같은 패키지 내부에서만 |
같은 패키지는 디렉토리라는 말이 생소한데 package com 같이 같은 패키지를 말합니다. public 과 default 의 특징을 이용하면 복잡한 클래스간의 연관성을 만들 수도 있습니다. 상하관계가 차이나면 (package com 과 com.kin 같이) 접근이 안됩니다.
요약
자바 private 키워드와 접근제어자를 알아봤습니다.
여기서는 왜 데이터를 보호해야 하는지를 한번 생각해 보면 좋겠습니다.
가능한한 전역변수를 사용하지 말고 지역변수를 써라란 말과도 비슷하게 들립니다. 최대한 데이터를 모아놓고 은닉하는 것은 무분별한 접근 오류를 막는 장점이 있습니다.
이를 위해 getter 와 setter 가 있으니 다행입니다.
외부참조문서
자바 접근 제어자 | 자바 강좌 5-5 자바 private