국비 수업 13일차

김성수·2022년 11월 2일
0
post-thumbnail
post-custom-banner

1. 클래스의 구성요소와 접근제한자

  1. 필드 : 객체의 속성을 저장한다
  2. 메서드 : 객체의 기능을 정의한다
  3. 생성자 : 객체 생성 시 초기값 할당 및 초기작동을 지정한다
  4. 접근 제한자 : 객체 외부에서 내부로 접근하는 행위를 허용하거나 거부한다

  • private : 외부에서의 모든 접근을 허용하지 않는다 (내부에서는 자유롭게 접근 가능)
  • package : 같은 패키지 폴더 내에서의 접근을 허용한다 (접근 제한자를 딱히 지정하지 않았을 경우, 이곳이 기본값이 된다)
  • protected : 같은 패키지 + 상속 관계에서의 접근을 허용한다
  • public : 모든 접근을 허용한다

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;		// 동일 클래스 여부에 상관없이 누구에게나 접근을 허용한다
	}
}

2. 기본 생성자를 쉽게 이해하기 위한 공던지기 코드


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

3. 클래스를 이용하여 TV의 간단한 기능을 구현

1. 여기는 함수를 호출하는 메인 클래스

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

2. 여기는 TV의 초기 설정값을 생성하고 기능을 구현하는 TV클래스

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

위의 코드를 보며 어떻게 더 효율적으로 사용할 수 있는지 잘 생각해본다.

profile
다들 잘하는데 나만 못해?
post-custom-banner

0개의 댓글