접근제어자
변수나 메소드의 사용 권한은 다음과 같은 접근제어자를 사용하여 설정한다.
(클래스 멤버에 대한 접근제어자)
- private : private가 붙은 변수, 메소드는 해당 클래스 안에서만 접근이 가능하다. 외부에서는 보여지지 않는 접근제어자
- default : 접근 제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메소드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능하다.
- protected : 접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메소드는 동일 패키지 내의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능하다.
- public : public 접근제어자가 붙은 변수, 메소드는 어떤 클래스에서라도 접근이 가능하다.
+22.01.24
구분 | 같은 클래스 | 같은 패키지 | 다른 패키지 서브 클래스 |
관계 없음 |
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
여기서 클래스의 접근 제어자는 총 2개로 public과 default가 있다.
default 클래스는 직접 코드를 작성하지 않으면 기본적으로 default로 적용된다.
default 클래스는 다른 패키지에 있는 클래스에서 사용하려고 하면 에러가 발생한다.
public 클래스가 포함된 소소코드는 public 클래스의 클래스 명과 소스코드의 파일명이 같아야 한다.
아래 코드를 보면 코드의 이름은 PublicNameDemo.java이다.
주석처리된 부분은 오류가 발생한다. 퍼블릭 클래스의 이름과 소스코드의 이름이 일치하지 않기 때문이다.
그 말은 하나의 소스 코드에는 하나의 public 클래스가 존재 할 수 있다는 의미이다.
아래 코드는 현재 쓰고 있는 Person 클래스의 매우 간소화된 버전이다.
Person.java
public class Person {
int age;
}
Driver.java
public class Driver {
public static void main(String[] args) {
Person p1 = new Person();
p1.age = 28;
System.out.println(p1.age);
}
}
접근제어자 사용
아무나 쉽게 접근을 할 수 있으면 위험이 생기기 때문에 접근제어자를 사용하여 코드를 변경해 보자.
Person.java
public class Person {
private int age;
}
인스턴스 변수 앞에 private이라는 접근 제어자를 써주면 그 변수는 해당 클래스 내에서만 접근 가능하다. 이제 Driver는 age에 대한 권한이 없기 때문에 Driver에서 p1.age = -10;을 해주려고 하면 오류가 나올 것이다. 마찬가지로 System.out.println(p1.age);도 불가능하다. 그러면 이제는 age에 대한 권한이 아예 없는걸까?
아니다. private 변수라도 그 클래스 내에서는 사용이 가능하기 때문에, 그 클래스에 age를 사용하는 메소드를 쓰면 된다.
Person.java
public class Person {
private int age;
public void setAge(int newAge) {
if (newAge > 0) {
age = newAge;
}
}
public int getAge() {
return age;
}
}
이제 setAge와 getAge 메소드를 이용해서 age 변수를 바꿔주고 받아올 수 있다. setAge와 getAge같은 메소드를 흔히 'setter' 메소드와 'getter' 메소드라고 부른다. 두 메소드 앞에는 public이라는 접근 제어자를 써주고있다. 변수 age는 숨기고 싶어서 private으로 설정했지만, setAge와 getAge는 다른 클래스에서도 사용하고 싶기 때문에 어디서든 접근 가능하게 해주는 public을 썼다. 이제 드라이버를 이렇게 바꿀 수 있습니다:
Driver.java
public class Driver {
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(28);
p1.setAge(-10);
System.out.println(p1.getAge());
}
}
28
배운 것을 토대로 은행 시뮬레이션 프로그램 코드에 실제로 적용해보았다.
'TIL > Java' 카테고리의 다른 글
[Java] 생성자(Constructor) (0) | 2022.01.03 |
---|---|
[Java] 은행 시뮬레이션 프로그램_계좌 이체 메소드 작성하기 (0) | 2022.01.02 |
[Java] 은행 시뮬레이션 프로그램_입금, 출금 메소드 작성하기 (0) | 2021.12.31 |
[Java] 인스턴스 (0) | 2021.12.30 |
[Java] 메소드(Method) (0) | 2021.12.29 |