1.접근제한자


public : 클래스 안과 밖, 패키지 안과 밖 구분없이 모든 클래스들이 접근 가능


protected : 같은 패키지나 상속 관계일 경우 접근 가능


default : 같은 패키지에 속한 클래스만 접근 가능, 따로 접근제한자를 명시하지 않으면 default로 설정 됨


private : 클래스 안에서만 접근 가능 객체화.변수같이 사용할 수 없음, 캡슐 구조의 핵심





다음은 컴퓨터의 상태(실제 상태가 아니고 임의의 값을 넣음)를 출력하는 클래스 입니다.


예제를 보고 private으로 선언된 변수를 다루는것을 확인해보자.

package chap04.exam12.prv;

import java.util.Scanner;

// Private 접근제한자를 쓰는 이유
public class Computer {
	Scanner scanner = new Scanner(System.in);	
	private boolean power; // 외부에서 보기/수정 가능
	private int panSpeed;    // 외부에서 보기/수정 가능
	private int temp;           // 외부에서는 조절 불가, 보기는 가능

	
	public boolean isPower() {
		return power;
	}

	public void setPower(boolean power) {
		this.power = power;
		if(this.power) {
			this.panSpeed = 50;
			this.temp = 60;
		}else {

		}
	}

	public int getPanSpeed() {
		return panSpeed;
	}

	public void setPanSpeed(int panSpeed) {
		this.panSpeed = panSpeed;
		this.temp = 110 - this.panSpeed;
	}

	public int getTemp() {
		return temp;
	}

	public Computer() {
		System.out.println("컴퓨터 전원을 키시겠습니까? (y/n)");
		char state = scanner.nextLine().charAt(0);

		if(state == 'y') {
			System.out.println("전원이 켜졌습니다.");
			this.power = true;
			this.temp = 30;
		}else {
			System.out.println("전원이 꺼집니다.");
			this.power = false;
		}
		
	}
	
	boolean powerState() {
		return power;
	}
	
	void powerstate() {
		if(power) {
			System.out.println("전원이 켜져있습니다.");
		}else {
			System.out.println("전원이 꺼져있습니다.");
		}
	}
	
	int panSpeedState() {
		return panSpeed;
	}
	
	void changePanSpeed(int speed) {
		this.panSpeed = speed;
		System.out.println("팬 속도가 " + panSpeed + "로 바뀌었습니다.");
		
		if(panSpeed >= 10) {
			this.temp = 20;
		}else {
			this.temp = 30;
		}
	}
	
	int tempState() {
		return temp;
	}
	
	void powerOff() {
		this.power = false;
		System.out.println("컴퓨터가 종료됩니다.");
	}
}


다음은 Main 이 computer 클래스를 불러와 각종 private 정보에 접근하는 프로그램입니다.

package chap04.exam12.prv;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// 전원 켜기
		// 전원 상태 보기
		// 팬 속도 보기
		// 팬 속도 조절
		// 온도 확인
		Scanner scan = new Scanner(System.in);
		int a = 0;
		int result = 0;
		
		Computer com = new Computer();
		
		if (com.powerState()) {
			while(true) {
				System.out.println("\n어떤 처리를 하시겠습니까? (1~5 사이의 숫자 입력)");
				System.out.println("\n1. 전원 상태보기");
				System.out.println("2. 팬 속도 보기");
				System.out.println("3. 팬 속도 조절");
				System.out.println("4. 온도 확인");
				System.out.println("5. 컴퓨터 종료");
				result = scan.nextInt();
				
				switch (result) {
					case 1:
						com.powerstate();
						break;
						
					case 2:
						System.out.println("팬의 속도는 " + com.panSpeedState() + "입니다.");
						break;
						
					case 3:
						System.out.println("원하시는 속도를 입력해주세요.");
						a = scan.nextInt();
						com.changePanSpeed(a);
						break;
						
					case 4:
						System.out.println("현재 컴퓨터의 온도는 " + com.tempState() + "도 입니다.");
						break;
				}
				if(result == 5) {
					com.powerOff();
					break;
				}
			}
		}
		scan.close();
	}

}


2.Final 상수


final 키워드는 더 이상 변경이 불가능하게 설정하는 키워드이다.


즉, 변수의 값을 변경할 수 없으므로 상수라고 부른다.


그러므로 상수는 생성과 함께 초기화도 해주어야 한다.


메소드에 Final을 붙일 경우에는 상속시에도 오버라이딩이 불가능한데 이 경우는 상속에서 다시 설명한다.


다음 예제를 보고 확인해보자.



package chap04.exam09.readOnly;

public class Person {
	final String nation;
	final static String ssn; // 변경이 불가능하므로 상수(CONSTANT)
	final String name;
	
	public Person(String nation, String name) {
		this.nation = nation;
		this.name = name;
	}
	
	static { // 사실상 초기화가 불가능
		System.out.println("호오추울");
		ssn = "205938-984327";
	}
	
}


package chap04.exam09.readOnly;

public class Main {

	public static void main(String[] args) {
		Person pp = new Person("한국",  "이름");
		/* final이 붙어 있어 오류발생, 주석처리
		pp.name = "홍길동";
		*/
		System.out.println(pp.name);
		System.out.println(pp.nation);
		System.out.println(Person.ssn);
	}

}


+ Recent posts