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);
}
}