자바에서 접근 제한을 두는 이유
캡슐화 개념을 구현하기 위해서
캡슐화 : 객체 지향 프로그래밍의 중요한 원칙 중 하나로 객체의 내부 상태를 숨기고 외부에서는 제공된 메서드를 통해서만 접근할 수 있도록 제한하는 것. 코드를 더 안전하게 만들고 유지보수를 쉽게 할 수 있다.
클래스 접근 제한자
1. public 접근 제한자
- 어느 패키지에서나 접근이 가능
- 프로젝트 내의 모든 코드에서 해당 클래스를 사용할 수 있다.
2. default 접근 제한자
- 접근 제한자를 명시하지 않으면 default 접근 제한자를 갖는다.
- 같은 패키지 내에서만 접근이 가능하다.
public 이 자주 사용되어 해당 클래스가 다른 패키지에서도 사용될 수 있도록 한다.
하지만 내부적인 처리를 위한 클래스는 default로 설정하여 외부에서의 접근을 제한할 수 있다.
멤버변수, 메소드 접근 제한자
1. public
접근 범위 : 모든 클래스에서 접근 가능
- 다른 패키지에 있는 클래스에서도 이 변수나 메서드에 접근할 수 있다.
2. protected
접근 범위 : 같은 패키지 내의 클래스와 상속받은 클래스 에서 접근 가능
- 주로 상속 관계에서 활용된다.
- 다른 패키지에 있는 상속받지 않은 클래서에서는 접근할 수 없다.
3. default
접근 범위 : 같은 패키지 내의 클래스에서만 접근 가능
- 접근 제한자를 명시하지 않았을 때 기본적으로 적용된다.
- 패키지 외부에서는 접근할 수 없다.
- 상속 관계에서도 다른 패키지에 있는 자식 클래스는 접근할 수 없다.
4. private
접근 범위 : 같은 클래스 내에서만 접근 가능
- 외부에서 절대로 접근할 수 없다.
- 클래스의 내부 상태를 완전히 감출 수 있다.
멤버 변수와 메서드에서의 활용 (캡슐화)
맴버 변수를 private 으로 선언하고 이를 수정하는 메서드(getter, setter) 를 public 으로 제공하는 방식이 일반적이다.
-> 외부에서 직접 변수를 변경하는 것을 막고 데이터의 무결성을 유지한다.
private 접근 제한자 사용 예
public class PersonInfo {
private String name;
private String telNo;
private int age;
// 생성자 작성
public PersonInfo(String name, String telNo, int age) {
this.name = name;
this.telNo = telNo;
this.age = age;
}
// Setters() : write
// Getters() : read
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelNo() {
return telNo;
}
public void setTelNo(String telNo) {
this.telNo = telNo;
}
public int getAge(){
return age;
}
public void setAge(int age) {
this.age = age;
}
}
-> private 으로 변수를 설정하고 메소드를 통해 접근 가능하도록 구현한 모습
public class PersonInfoTest_01 {
public static void main(String[] args) {
// 생성자를 통해서 초기값을 전달
PersonInfo pi = new PersonInfo("소유진","010-3333-0000",25);
String telNo = pi.getTelNo();
int age = pi.getAge();
System.out.println(pi.getName() + " : " + telNo + " : " + age);
// 부모 클래스내의 private 멤버변수는 자식 클래스에서 직접 접근 불가
// pi.name = "백종원";
// pi.age = 33; //이렇게 접근 불가
// 부모 클래스내의 멤버변수가 private인 경우는 자식 클래스에서 메소드를 통해서 접근 가능
// setXX() 메소드를 통해거 write
pi.setName("백종원");
pi.setTelNo("010-1111-2222");
pi.setAge(45);
// getXX() 메소드를 통해서 멤버변수에 저장된 값을 읽어옴(read)
String name = pi.getName();
telNo = pi.getTelNo();
age = pi.getAge();
System.out.println(name + " : " + telNo + " : " + age);
}
}
-> 위의 클래스에 정의해둔 메소드를 사용하여 private 변수에 접근하여 값을 읽고 쓴다.
-> pi.name 처럼 직접 접근하는 경우 에러가 발생한다.
protected 접근 제한자 사용 예
public class PersonInfo_01 {
protected String name;
protected String telNo;
protected int age;
// 생성자
public PersonInfo_01(String name, String telNo, int age) {
this.name = name;
this.telNo = telNo;
this.age = age;
}
// Setters() 와 Getters() 작성
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelNo() {
return telNo;
}
public void setTelNo(String telNo) {
this.telNo = telNo;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
-> 멤버변수를 protected로 작성하고 getter,setter 를 만들어 메소드를 통해서 값에 접근 가능하도록 한 모습
public class PersonInfoTest_02 {
public static void main(String[] args) {
// 생성자를 통해서 초기값을 전달
PersonInfo_01 pi = new PersonInfo_01("소유진","010-3333-4444",25);
String telNo = pi.getTelNo();
int age = pi.getAge();
System.out.println(pi.getName() + " : " + telNo + " : " + age);
// 부모 클래스 내의 멤버변수가 protected 인 경우는 직접 접근하여 값을 저장 가능
pi.name = "안성재";
pi.telNo = "010-1234-5678";
pi.age = 33;
// 멤버변수에 저장된 값을 직접 접근하여 출력
System.out.println(pi.name + " : " + pi.telNo + " : " + pi.age);
// 부모 클래스 내의 멤버변수가 protected 이므로 메소드를 통해서도 접근하여 값을 저장 가능
pi.setName("조은주");
pi.setTelNo("010-1212-3434");
pi.setAge(44);
System.out.println(pi.getName() + " : " + pi.getTelNo() + " : " + pi.getAge());
}
}
-> protected 는 같은 패키지 내에서 접근 가능하기 때문에 바로 pi.name 처럼 접근이 가능하며 메소드로도 접근이 가능하다.
'JAVA > 기초공부' 카테고리의 다른 글
[JAVA] 추상 클래스 (5) | 2024.10.09 |
---|---|
[JAVA] 형 변환, static, final (2) | 2024.10.09 |
[JAVA] 메소드 오버라이딩 (0) | 2024.10.01 |
[JAVA] 패키지 (3) | 2024.09.29 |
[JAVA] String 클래스 (1) | 2024.09.29 |