package accessModifier;
class Test1 {
private int n1 = 10;
int n2 = 20; // package는 기본 값이므로, 접근제한자를 작성하지 않는다
protected int n3 = 30;
public int n4 = 40;
public void showN1() {
System.out.println(this.n1); // private이라도 내부에서는 접근 가능
}
}
public class Ex01 {
public static void main(String[] args) {
Test1 ob = new Test1();
// System.out.println(ob.n1); The field Test1.n1 is not visible
ob.showN1(); // 필드에 직접적으로 접근할 수는 없지만, 메서드를 통하여 출력을 할 수는 있다
// 출력은 가능하지만, 값을 변경할 수는 없다
// 클래스에서 메서드를 통하여 허용한 작업만 수행할 수 있다
System.out.println(ob.n2);
System.out.println(ob.n3);
System.out.println(ob.n4);
// ob.n1 += 5; // The field Test1.n1 is not visible
ob.n2 += 5; // 서로 다른 클래스이지만, 같은 패키지 내에 속해있다
ob.n3 += 5; // 상속은 아니지만 같은 패키지
ob.n4 += 5; // 동일 클래스 여부에 상관없이 누구에게나 접근을 허용한다
}
}
package reference;
// 두 아이가 하나의 공을 던지고 받는 상활을 코드로 표현하기
class Kid {
String name;
Ball ball; // 공을 참조할 수 있는 참조변수 (초기상태에서는 대상이 없는 상태)
Kid(String name) {
this.name = name;
}
void takeBall(Ball ball) { // 공을 전달받아서, 가지게 하는 함수
this.ball = ball;
}
void throwBall(Kid other) { // 다른 아이를 지정하여 대상에게 공을 넘겨주고, 자신의 공은 사라지는 함수
other.ball = this.ball; // 대입 연산은 복사이기 때문에
this.ball = null; // 자신의 ball을 null로 바꾼다
System.out.printf("%s가 %s에게 공을 던졌다\n",this.name, other.name);
}
}
class Ball { // 아무 내용도 없을때는 기본 생성자가 만들어진다
}
public class Ex08 {
public static void main(String[] args) {
Kid ob1 = new Kid("찬혁이");
Kid ob2 = new Kid("지용이");
Ball b = new Ball(); // 오직 표현을 위해서 사용하는 객체가 된다
ob1.takeBall(b); // 찬혁이가 공을 주웠다
ob1.throwBall(ob2); // 찬혁이가 들고 있던 공을 지용이에게 던졌다
ob2.throwBall(ob1); // 지용이가 들고 있던 공을 찬혁이에게 던졌다
// 실체가 없는 사람이 들고 있던 공을 지용이에게 던졌다(?)
// null.throwBall(ob2);
// Kid ob3 = null;
// ob3.throwBall(ob2); // NullPointerException
}
}
package tv;
public class Main {
public static void main(String[] args) {
TV tv = new TV();
// TV 클래스를 구성하여 실제 현실의 TV기능을 모두 구현해보세요
// main에서는 TV의 메서드만 호출합니다
tv.powerBtn();
tv.channelDown();
tv.channelDown();
tv.volumeUp();
tv.volumeUp();
tv.volumeUp();
tv.mute();
tv.mute();
tv.channelUp();
tv.powerBtn();
tv.channelUp();
tv.channelUp();
tv.powerBtn();
}
}
package tv;
public class TV {
// TV 클래스를 구성하세요
// 필드는 속성을 저장합니다 : ex) 전원, 채널, 볼륨, 음소거 상태 등...
// 메서드는 기능을 정의합니다 : 채널 올림/내림, 볼륨 올림/내림, 전원 on/off, 음소거 기능 등...
// 생성자는 객체 생성 시 초기 작동을 담당합니다. (생성된 TV의 초기 채널은 2로 설정한다)
// 접근제한자는 필드에 대해 private, 메서드에 대해 public을 적용합니다
// getter/setter는 사용해도 되고, 생략해도 됩니다
private boolean power;
private int channel = 2; // 2 ~ 10
private int volume = 10; // 0 ~ 20
private int muteVolume = 0;
public void powerBtn() {
power = !power; // 저장된 값이 true이면 false를 대입하고, false이면 true를 대입한다
show();
}
public void channelUp() {
if(power) {
channel++;
if(channel > 10)
channel = 2;
}
show();
}
public void channelDown() {
if(power) {
channel--;
if(channel < 2)
channel = 10;
}
show();
}
public void volumeUp() {
if(power && volume < 20) {
volume++;
}
show();
}
public void volumeDown() {
if(power && volume > 0) {
volume--;
}
show();
}
public void mute() {
if(power) {
int tmp = volume;
volume = muteVolume;
muteVolume = tmp;
}
show();
}
private void show() {
if(power) {
System.out.println("전원 : " + power);
System.out.println("채널 : " + channel);
System.out.println("음량 : " + volume);
System.out.println();
}
else {
System.out.println();
System.out.println("전원 off 상태");
System.out.println();
}
}
}
위의 코드를 보며 어떻게 더 효율적으로 사용할 수 있는지 잘 생각해본다.