package ex_access_modifier;
public class Ex1 {
public static void main(String[] args) {
/*
* 접근 제한자(Access Modifier)
*
* 1. public : 외부의 모든 클래스에서 접근 가능하도록 지정
* 2. private : 자신의 클래스에서만 접근 가능하도록 지정
* (다른 클래스에서 접근 불가능하다록 지정)
* - 주로, 클래스 내의 멤버변수는 private 접근제한자를 사용하여
* 외부에서 접근할 수 없도록(내부에서만 접근 가능하도록) 제한하고
* public 으로 선언된 Getter/Setter 메서드를 통해 간접적으로 멤버변수에
* 접근할 수 있도록 한다.
* - 객체지향 특징 중 E(Encapsulation, 캡슐화 = 은닉성)에 해당
*
* 1. Getter 메서드 : 내부의 멤버변수에 저장된 값을 외부로 리턴
* => 매개변수는 없고, 리턴값만 있는 메서드로 정의
* => 메서드명은 주로 getXXX() 형식으로 지정
* (ex. int 타입 변수 num의 Getter 메서드 이름 : getNum())
*
* 2. Setter 메서드 : 외부로부터 데이터를 전달받아 멤버변수에 저장
* => 매개변수만 있고, 리턴값은 없는 메서드로 정의
* => 메서드명은 주로 setXXX() 형식으로 지정
* (ex. int 타입 변수 num의 Setter 메서드 이름 : setNum())
*
*
*/
// Person 클래스의 인스턴스(p) 생성
// 다음과 같이 데이터를 저장한 후 출력
// 이름 : 홍길동
// 나이 : 20
Person p = new Person();
// p.name = "홍길동"; // 오류 발생!
// => private 접근제한자로 지정된 멤버변수는 외부에서 접근 불가능!
// Setter 메서드(setName())를 호출하여 name에 저장할 이름을 전달
p.setName("홍길동");
// System.out.println(p.name); // The field Person.name is not visible
// Getter 메서드(getName())를 호출하여 name에 저장된 이름을 출력
System.out.println("이름 : " + p.getName());
// p.age = 20; // The field Person.age is not visible
p.setAge(20);
System.out.println("나이 : " + p.getAge());
System.out.println("=====================");
p.print();
} // Ex1 main() 끝
} // Ex1 클래스 끝
class Person {
// 주로, 멤버변수(인스턴스 변수)는 외부에서 함부로 접근할 수 없도록
// private 접근제한자를 사용하여 접근을 제한
private String name;
private int age;
// 인스턴스 변수 name에 접근할 Getter/Setter 메서드 정의
// => 누구나 접근할 수 있도록 접근제한자 public 사용
// 1) Getter 정의(매개변수는 없고, 리턴값만 있는 메서드)
public String getName() {
// 인스턴스 변수 name 값을 리턴
return name;
}
// 2) Setter 정의(매개변수는 있고, 리턴값은 없는 메서드)
public void setName(String newName) {
// 외부로부터 전달받은 newName값을 인스턴스 변수 name에 저장
name = newName;
}
// 변수 age에 대한 Getter/Setter
public int getAge() {
return age;
}
public void setAge(int newAge) {
age = newAge;
}
// private 으로 선언된 멤버도 같은 클래스 내에서 자유롭게 접근 가능
// => 같은 클래스 내에서 접근 시 참조변수명 없이 이름만 지정
public void print() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
} // Person 클래스 끝
연습
package ex_access_modifier;
public class Test1 {
public static void main(String[] args) {
Car myCar = new Car();
// 속도 변경
myCar.setSpeed(-50); // 잘못된 속도로 speed변수에 0을 저장
System.out.println("현재 속도 : " + myCar.getSpeed() + " km");
myCar.setSpeed(50);
System.out.println("현재 속도 : " + myCar.getSpeed() + " km");
myCar.setSpeed(100);
System.out.println("현재 속도 : " + myCar.getSpeed() + " km");
// 멈추는 메서드 호출
// => 차량이 움직일 경우에만 호출
if (!myCar.isStop()) { // 차량이 움직이는지 확인(isStop값이 false 일 경우)
myCar.setStop(true);
}
if (!myCar.isStop()) {
myCar.setStop(true);
}
System.out.println("현재 속도 : " + myCar.getSpeed() + " km");
}
}
/*
* Car 클래스 정의
* - 멤버변수
* 1) 속도(speed, int)
* 2) 정지상태(isStop, boolean)
*
* - 멤버 변수에 대한 Getter/Setter 작성
* 1) speed에 대한 Setter
* => 매개변수의 값이 0보다 작을 경우에는 speed 값을 0으로 초기화 하고
* isStop 변수에 true로 변경
* 2) isStop에 대한 Setter
* => 매개변수의 값을 isStop에 초기화 하고, 만약 true일 경우에
* speed 값도 0으로 초기화, "차량을 정지하겠습니다!" 출력
*
*/
class Car {
private int speed;
private boolean isStop;
// 멤버변수 speed에 대한 Getter
public int getSpeed() {
return speed;
}
// 멤버변수 speed에 대한 Setter
public void setSpeed(int newSpeed) {
if (newSpeed <= 0) {
speed = 0;
isStop = true;
} else {
speed = newSpeed;
isStop = false;
}
}
// 멤버변수 isStop에 대한 Getter
public boolean isStop() {
return isStop;
}
// 멤버변수 isStop에 대한 Setter
public void setStop(boolean newStop) {
// if (newStop) { // newStop == trun
isStop = newStop;
speed = 0;
System.out.println("차량을 정지하겠습니다!");
// }
}
}