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); } }
'개념 및 코딩 > 04.클래스' 카테고리의 다른 글
[JAVA]04-03.Static (0) | 2018.08.24 |
---|---|
[JAVA]04-02.생성자, 오버로드 (0) | 2018.08.24 |
[JAVA]04-01.클래스, 객체 지향 프로그래밍, 접근제한자, 클래스 다이어그램 (0) | 2018.08.23 |