(1) TV프로그램

/*
TV의 최대 채널이 999이고, 볼륨은 99입니다.
class : TV
field : 
	-power
	-channel 0으로 시작
	-volume  0으로 시작
	-maker
	-inch
constructor
	-args가 2개(maker랑 inch)
method :
	-powerOn
	-PowerOff
	--------------volume은 +1, -1씩 증감
	-volumeUp
	-volumeDown
	--------------channel은 +1, -1씩
	-channelUp
	-channelDown
	--------------channel은 x로 변경 (한방에 이동)
	-changeChannel
*/

public class TV{
	boolean power;
	int channel;
	int volume;
	String maker;
	int inch;
	
	
	
	TV(String maker,int inch){ //명확히 밝혀주는 것이 좋다.
		power = false;
		channel = 0;
		volume = 0;
		this.maker = maker;
		this.inch = inch;
	}

	void powerOn() {  //전원만 켜면 그만이기 때문에 리턴값이 없다.
		power = true;
		//System.out.println("TV 전원을 켜세요!!");
	}
	
	void powerOff() {
		power = false;
		//System.out.println("TV 전원을 끄세요!!");
	}

	/*void volumeUp(int volume) { //여기서 for문을 쓰면 비효율적! 사람이 리모컨을 누를 때마다, 변경되는 것이기 때문에 고유값으로 만드는 것보다 실행 클래스에서 만드는 것이 좋다.
		this.volume = volume;
			if (power){
			for (int i=0;i<100 ;i++ )
			volume ++;
			} else {
				System.out.println("TV 전원을 켜세요!!");
			}
	}

	void volumeDown(int volume) {
		this.volume = volume;
			for (int i=0;i<100 ;i++ )
			volume --;
			if (volume<0){
			volume = 0;
			}
		}	
		
	void channelUp(int channel) {
		this.channel = channel;
			if (power){
			for (int i=0;i<1000 ;i++ )
			channel ++;
			} else {
				System.out.println("TV 전원을 켜세요!!");
			}
	}

	void channelDown(int channel) {
			this.channel = channel;
			for (int i=0;i<1000 ;i++ )
			channel -= 1;
			if (channel<0){
				channel = 0;
			}
	}*/

	void volumeUp(){
		if (checkPower())
			volume ++;
	}
	
	void volumeDown(){
		if (checkPower()){
			if (volume <0){
				volume = 0;
			} else {
				volume --;
			}
		}
	}

	void channelUp(){
		if (checkPower()){
			if (channel > 999){
				channel = 1;
				
			}
			channel ++; 
		}
	}
	
	void channelDown(){
		if (checkPower()){
			if (channel < 1){
				channel = 999;
				channel --;
			}
			
		}
	}

	int changeChannel(int channel) { //현재 채널을 갖고 오고 싶다면 int로 리턴타입 잡기
		if (!checkPower()){//false라면
			return -1; //말도 안되는 더미값(없는 채널)로 리턴하기 , break는 반복문일 때만 사용~~
		}
		if (channel > 999){
			return this.channel; //현재 자신의 채널로 남아 있기
		}
		this.channel = channel;
		return this.channel;
	}

	boolean checkPower() {
		if (!power){
			System.out.println("TV 전원을 켜세요!!!");
			return false; 
		}
		return true;
	}

	void tvInfo(){ //중복을 줄이기 위해서..
		if (power)
		System.out.println("tv1의 채널 : " + channel + "번이고 볼륨은 " + volume + "입니다.");
	}
}
public class TvWatcher {  
	public static void main(String[] args) {
	//tv1의 객체 생성.
	TV tv1 = new TV("LG",75); //기본생성자가 생성되지 않았다는 오류가 나오니까 ()안에 값 넣어주기!

	//print : LG에서 만든 75인치 TV
	System.out.println(tv1.maker + "에서 만든 " + tv1.inch + "인치 TV");
	
		System.out.println("channel을 11번으로 변경!!!"); 
		int ch = 11; // 변수를 잡는 것이 좋다.
        int channel = tv1.changeChannel(ch); //리턴값이 있는 메소드 호출
		// print : TV전원을 켜세요!! ----TV의 고유속성이기 때문에 class에 만들기
        System.out.println("channel을 " + ch + "번으로 변경!!!");		

		
		System.out.println("channel을 3회 증가");
		int cnt = 3;
		for (int i=0;i<cnt ;i++ ){
			tv1.channelUp();
		}
		
		// print : TV전원을 켜세요!!

		System.out.println("volume을 10회 증가!!");
		cnt = 10;
		for (int i=0;i<cnt ;i++ ){
			tv1.volumeUp();
		}
		// 전원 on
		tv1.powerOn();

		System.out.println("channel을 11번으로 변경!!!");
			ch = 11;
			channel = tv1.changeChannel(ch);
		// print : 현재 tv의 채널은 11번이고 볼륨은 0입니다.
		tv1.tvInfo();

		
		System.out.println("volume을 15회 증가!!!");
		cnt = 15;
		for (int i=0;i<cnt ;i++ ){
			tv1.volumeUp();
		}
		// print : 현재 tv의 채널은 11번이고 볼륨은 15입니다.
		tv1.tvInfo();

		System.out.println("channel을 1001번으로 변경!!!");
			ch = 1001;
			channel = tv1.changeChannel(ch);
			tv1.tvInfo();
		// print : 현재 tv의 채널은 11번이고 볼륨은 15입니다.
		
		System.out.println("volume을 25회 감소!!!");
		cnt = 25;
		for (int i=0;i<cnt ;i++ ){
			tv1.volumeDown();
		}
		tv1.tvInfo();
		// print : 현재 tv의 채널은 11번이고 볼륨은 0입니다.
		

		System.out.println("channel을 999번으로 변경!!!");
			ch = 999;
			channel = tv1.changeChannel(ch);
		// print : 현재 tv의 채널은 999번이고 볼륨은 0입니다.
		tv1.tvInfo();

		System.out.println("channel을 3회 증가!!!");
		cnt = 3;
		for (int i=0;i<cnt ;i++ ){
			tv1.channelUp();
		}
		// print : 현재 tv의 채널은 3번이고 볼륨은 0입니다.
		tv1.tvInfo();

		// 전원 : off
		tv1.powerOff();
		
		System.out.println("channel을 7번으로 변경!!!");
		ch = 7;
		channel = tv1.changeChannel(ch);
		
		// print : TV전원을 켜세요!!
		tv1.tvInfo();

	}
}
---------- run ----------
LG에서 만든 75인치 TV
channel을 11번으로 변경!!!
channel을 11번으로 변경!!!
TV 전원을 켜세요!!!
channel을 3회 증가
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
volume을 10회 증가!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
TV 전원을 켜세요!!!
channel을 11번으로 변경!!!
tv1의 채널 : 11번이고 볼륨은 0입니다.
volume을 15회 증가!!!
tv1의 채널 : 11번이고 볼륨은 15입니다.
channel을 1001번으로 변경!!!
tv1의 채널 : 11번이고 볼륨은 15입니다.
volume을 25회 감소!!!
tv1의 채널 : 11번이고 볼륨은 0입니다.
channel을 999번으로 변경!!!
tv1의 채널 : 999번이고 볼륨은 0입니다.
channel을 3회 증가!!!
tv1의 채널 : 3번이고 볼륨은 0입니다.
channel을 7번으로 변경!!!
TV 전원을 켜세요!!!

(2) 스타크래프트 소스

/*
class : Marine
field 
	-hp (100)
	-power (10) //한 번 때리면 hp가 10 감소
	-mode (0:일반모드, 1:흥분모드)
method
	-attack : 적 체력 감소
	-changeMode 
	 -- 흥분모드 변경시 : power25 증가, 내 체력 : 35감소
	 -- 내 체력이 50미만이면 흥분모드변경 불가 

*/

public class Marine {
	int hp;
	int power;
	int mode;

	Marine (){
		hp = 100;
		power = 10;
		mode = 0;
	}

	void attack(Marine enemy){ //call by references라고 한다.
		enemy.hp -= power; // 적의 hp를 감소시키기 위해서
	}
	
	void changeMode(){
		if (hp < 50){
			System.out.println("체력이 50미만이므로 모드 변경 불가능!!");
			return;
		}
		mode = 1;
		hp -= 35;
		power = 25; //power += 25;아닌가????????
		
	}
	/*void info() {
		 System.out.println(");
	} */ //hp 필드명이 똑같기 때문에 나와 컴을 둘 다 표현할 수 있는 방법이 없다. 따라서, 여기에 사용 x

	String status() {//die를 찍기 위해서
		return hp <= 0 ? "die" : hp + ""; //(숫자+문자열 = 문자열), 삼항연산자 사용
	}
}
public class StarCraft{
	public static void main(String[] args) {
		//내마린(my), 컴마린(com) 생성
		Marine my = new Marine();
		Marine com = new Marine();

		//1. 체력 >> 나 : 100, 컴 : 100
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status());
		
		System.out.println("내가 컴을 2회 공격!!!!!!"); 
		// 2. 체력 >> 나 : 100, 컴 : 80
		int cnt = 2;
		for (int i=0;i<cnt ;i++ )
			my.attack(com); //my.attack()만 썼을 경우 내 체력을 감소시키고 있다... com을 공격하라
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status());
		

		System.out.println("컴이 나를 3회 공격!!!!!!");
		//3. 체력 >> 나 : 70, 컴 : 80
		cnt = 3;
		for (int i=0;i<cnt ;i++ )
			com.attack(my); //컴이 나를 공격한다. 
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status());

		System.out.println("내마린을 흥분모드로 변경!!!!!!");
		// 4. 체력 >> 나 : 35, 컴 : 80
		my.changeMode();
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status()); //changeMode 완성시키러 gogo~

		System.out.println("내가 컴을 2회 공격!!!!!!");
		// 5. 체력 >> 나 : 35, 컴 : 30
		cnt = 2;
		for (int i=0;i<cnt ;i++ )
			my.attack(com);
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status());


		System.out.println("컴이 나를 3회 공격!!!!!!");
		// 6. 체력 >> 나 : 5, 컴 : 30
		cnt = 3;
		for (int i=0;i<cnt ;i++ )
			com.attack(my); 
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status());

		System.out.println("내마린을 흥분모드로 변경!!!!!!");
		// 7. 체력이 50미만이므로 모드 변경 불가능!!
		my.changeMode();
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status());

		System.out.println("내가 컴을 2회 공격!!!!!!");
		// 8. 체력 >> 나 : 5, 컴 : die
		cnt = 2;
		for (int i=0;i<cnt ;i++ )
			my.attack(com);
		System.out.println("체력 >> 나 : " + my.status() + ", 컴 : " + com.status());
	}
}

/* 사용하기
Call by value
Call by Reference
*/
---------- run ----------
체력 >> 나 : 100, 컴 : 100
내가 컴을 2회 공격!!!!!!
체력 >> 나 : 100, 컴 : 80
컴이 나를 3회 공격!!!!!!
체력 >> 나 : 70, 컴 : 80
내마린을 흥분모드로 변경!!!!!!
체력 >> 나 : 35, 컴 : 80
내가 컴을 2회 공격!!!!!!
체력 >> 나 : 35, 컴 : 30
컴이 나를 3회 공격!!!!!!
체력 >> 나 : 5, 컴 : 30
내마린을 흥분모드로 변경!!!!!!
체력이 50미만이므로 모드 변경 불가능!!
체력 >> 나 : 5, 컴 : 30
내가 컴을 2회 공격!!!!!!
체력 >> 나 : 5, 컴 : die

 

(3) call by value : primitive type일때, 메소드의 인자값으로 전달되면 값이 전달

call by reference : reference type일때, 메소드의 인자값으로 전달되면 주소가 전달, 서로 관계가 있다.

 

public class RefValue {
	int x;

	void changeX(int x) {
		x = 100;
	}

	void changeRv(RefValue rv) {
		rv.x = 777;
	}
}
public class ValueTest {
	public static void main(String[] args) {
		RefValue rv = new RefValue();

		int x = 25; //RefValue 클래스의 x와는 전혀 다른 객체
		System.out.println("1. x : " + x); // 25
		//call by value : primitive type일때, 메소드의 인자값으로 전달되면 값이 전달
		rv.changeX(x);
		System.out.println("2. x : " + x); // 25
		
		System.out.println("3. rv.x : " + rv.x);
		//call by reference : reference type일때, 메소드의 인자값으로 전달되면 주소가 전달, 서로 관계가 있다.
		rv.changeRv(rv);
		System.out.println("4. rv.x : " + rv.x);
	}
}
---------- run ----------
1. x : 25
2. x : 25
3. rv.x : 0
4. rv.x : 777

 

(4) getter, setter : 클래스를 선언할 때 필드는 일반적으로 private 접근 제한을 한다. (public 사용)

- getter의 필요성 : 때에 따라서 외부에서 필드를 읽을 수 있도록 하기 위해서 필요로 한다.(읽기전용)

public 리턴타입 getFieldName(), boolean일 때는public boolean isFieldName()

- setter의 필요성 : 외부에서 엉뚱한 값으로 변경할 수 없도록 한다.(올바른 값만 저장 - 유효성 검사)

public void setFieldName(매개변수) : 매개변수의 타입은 필드타입과 동일 (void : 값만 변경하고 끝나면 되니까)

 

Q. getter와 setter 모두 사용하면 private 필드를 잡은 의미가 없다. 따라서 필드를 읽기 전용만 나타내고 싶다면?

>> getter만 사용!!

Q. setter가 꼭 필요한 경우는?

>> 유효성 검사가 필요한 경우!! ex) speed 등을 음수(-) 값이 올 수 없도록, 0으로 설정하는 경우

 

-- eclipse에서 private 필드를 선언한 후, Source에서 Generate Getter and Setters...클릭

 

/*
id
name
pass
age
*/


public class Member {

	private String id;
	private String name;
	private String pass;
	private int age;
	private boolean check;

	//getter : 가져와라 /setter : 지정 (항상 public)
	public String getId() { //String : 리턴타입
		return id; //id를 리턴해라
	}

	public void setId(String id) { 
		this.id = id;
	}

	public String getName() { 
		return name;
	}

	public void setName(String name) { 
		this.name = name;
	}

	public String getPass() { 
		return pass;
	}

	public void setPass(String pass) { 
		this.pass = pass;
	}

	public int getAge() { 
		return age;
	}

	public void setAge(int age) { 
		this.age = age;
	}

	public boolean isCheck() { //리턴타입이 boolean일때는, get이 아닌 is로 붙인다.
		return check;
	}

	public void setCheck(boolean check) { 
		this.check = check;
	}
}
public class Site {
	
	int register(Member member) { //method호출
		//db랑 연동해서 insert...
		System.out.println(member.getId());
		System.out.println(member.getName());
		System.out.println(member.getPass());
		System.out.println(member.getAge());
		System.out.println(member.isCheck());
		return 1;
	}

	public static void main(String[] args) {
		//java2, 홍길동, 1234, 25
		Site site = new Site();//객체 생성
		Member member = new Member(); //call by reference
		//member.id = "java2"; 
		member.setId("java2");
		member.setName("홍길동");
		member.setPass("1234");
		member.setAge(25);
		member.setCheck(true);
		int cnt = site.register(member);
	}

+ Recent posts