접근제한자

Mia Lee·2021년 11월 24일
0

JAVA

목록 보기
48/98
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("차량을 정지하겠습니다!");
//		}
		
	}
	
}

















0개의 댓글