프로그래밍/JAVA

2023-06-28 학습일지

뚜또꾸뭉 2023. 6. 29. 08:39
반응형

목차

1. 복습하기

2. 배우기

3. 이해하기

1.복습하기

 

package day09;

import java.util.Scanner;

public class 복습 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner (System.in);
		
		// 반복하면서 입력받는데 정답보다 크면 down, 정답보다 작으면 up, 같으면 정답
		
		int answer = (int)(Math.random()*31)+1;
		System.out.println(answer);
		while(true) {
			
		
		System.out.print("숫자를 입력하세요> ");
		int a = sc.nextInt();
		
		if (a>answer) {
			System.out.println("DOWN!");
		}else if (a<answer) {
			System.out.println("UP!");
		}else if (a==answer) {
			System.out.println("정답입니다!");
			break;
		}
		
		
		
		
		}
		
		
	}

}

 

업앤다운 게임

 

package day09;

import java.util.Scanner;

public class 복습 {

	public static void main(String[] args) {

		// 자판기 만들기

		Scanner sc = new Scanner(System.in);
		int balance = 10000;

		while (true) {

			System.out.println("======자판기======" + "현재잔액: " + balance + "원");
			System.out.println("1.콜라 2.사이다 3.우유 0.종료");
			System.out.print("메뉴선택> ");

			int menu = sc.nextInt();
			if (menu == 1) {
				if (balance >= 1000) {
					balance -= 1000;
					System.out.println("콜라제공");
				}

			} else if (menu == 2) {
				if (balance >= 1200) {
					balance -= 1200;
					System.out.println("사이다제공");
				}
			} else if (menu == 3) {
				if (balance >= 1500) {
					balance -= 1500;
					System.out.println("우유제공");
				}
			} else if (menu == 0) {
				System.out.println("종료합니다.");
				break;
			} else {
				System.out.println("0~3까지의 숫자를 입력해 주세요.");
			}

		}

	}

}

이제는 눈 감고도 할 수 있는 자판기

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. 배우기

 

 

package day09;

public class Animal {

	private String name;
	private String sound;
	//같은 클래스에서만 접근 가능.
	private int leg;
	
	public void meet(String b) {
		System.out.printf("%s는 %s를 만났습니다!\n",name,b);
	}
	//여기서 같은 클래스 내에서는 name에 접근이 가능하기 때문에, 
	//메서드 (get/set) 이게 셋 메서드다. 이게 뭐냐면, String name은 private라서 직접접근이 불가
	//그래서 퍼블릭 해놓고 setName을 메서드로 name에 접근하는 메서드를 만든거임.
	//default 접근제한자는 같은 패키지 내부에서 접근 가능하다는 말임. 없으면 그냥 다 디폴트인거임
	
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	
	public void setSound(String sound) {
		this.sound = sound;
	}
	public String getSound() {
		return sound;
	}
	
	
	public void setLeg(int leg) {
		this.leg = leg;
	}
	public int getLeg() {
		return leg;
	}
	
}

private는 이 클래스 내부에서만 접근이 가능하다는 뜻이고 void는 반환값이 없다는 것을 의미한다.

그래서 외부에서 private값에 접근하려면 public 값이 들어있는 메서드로 접근을 해야 한다.

 

그래서 외부 클래스인 AnimalMain에서 Animal클래스에 접근하려면;

 

package day09;

public class AnimalMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
		Animal dog = new Animal();
		
		dog.setName("멍멍이");
		System.out.println(dog.getName());
		
		dog.setLeg(4);
		System.out.println(dog.getLeg());
		
		dog.setSound("왈왈");
		System.out.println(dog.getSound());
		
		
		Animal elephant = new Animal();
		elephant.setName("코다리");
		System.out.println(elephant.getName());
		elephant.setLeg(4);
		elephant.setSound("뿌우우");
		System.out.println(elephant.getLeg());
		System.out.println(elephant.getSound());
		
		
		
		//여기서 getName()가 리턴값이 있기 때문
		dog.meet(elephant.getName());
		System.out.println(dog.getName()+"은 반가워서 "+dog.getSound()+" 소리를 내었습니다.");
		elephant.meet(dog.getName());
		System.out.println(elephant.getName()+"은 반가워서 "+elephant.getSound()+" 소리를 내었습니다.");

//		dog.sound = "왈왈";
//		dog.leg = 4;
		
//		System.out.println(dog.name+"\t"+dog.sound+"\t"+dog.leg);
		
		
		
	}

}

 

이런식으로 하면 된다. 

 

출력값;

멍멍이

4

왈왈

코다리

4

뿌우우

멍멍이는 코다리를 만났습니다!

멍멍이은 반가워서 왈왈 소리를 내었습니다.

코다리는 멍멍이를 만났습니다!

코다리은 반가워서 뿌우우 소리를 내었습니다.

 

그럼 이렇게도 가능할까 했는데

 

package day09;

public class AnimalMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
		Animal dog = new Animal();
		
		dog.setName("멍멍이");
		System.out.println(dog.getName());
		
		dog.setLeg(4);
		System.out.println(dog.getLeg());
		
		dog.setSound("왈왈");
		System.out.println(dog.getSound());
		
		
		Animal elephant = new Animal();
		elephant.setName("코다리");
		System.out.println(elephant.getName());
		elephant.setLeg(4);
		elephant.setSound("뿌우우");
		System.out.println(elephant.getLeg());
		System.out.println(elephant.getSound());
		
		
		
		//여기서 getName()가 리턴값이 있기 때문
		dog.meet(elephant.getName());
		System.out.println(dog.getName()+"은 반가워서 "+dog.getSound()+" 소리를 내었습니다.");
		elephant.meet(dog.getName());
		System.out.println(elephant.getName()+"은 반가워서 "+elephant.getSound()+" 소리를 내었습니다.");

		//객체를 하나 만든다. 객체이름 cat , 이름은 야옹이, 울음소리 야옹, 다리 4,
		//
		Animal cat = new Animal();
		cat.setName("야옹이");
		cat.setLeg(4);
		cat.setSound("야옹");
	
		
		Animal chicken = new Animal();
		chicken.setLeg(2);
		chicken.setName("하림");
		chicken.setSound("꼬꼬댁");
		
		Animal snake = new Animal();
		snake.setLeg(0);
		snake.setName("뱀돌이");
		snake.setSound("스르륵");
		
		Animal [] a = new Animal[3];
		a[0] = cat;
		a[1] = chicken;
		a[2] = snake;
		
		for(int i = 0;i<a.length;i++) {
			System.out.printf("우리 %s는요 종류는 %s고 이름이 %s고 다리가 %d개고 소리는 %s소리를 내어요.\n",a[i],a[i].getName(),a[i].getLeg(),a[i].getSound());

		}
		
		
		
//		dog.sound = "왈왈";
//		dog.leg = 4;
		
//		System.out.println(dog.name+"\t"+dog.sound+"\t"+dog.leg);
		
		
		
	}

}

 

올바른 값이 안뜬다. 

멍멍이

4

왈왈

코다리

4

뿌우우

멍멍이는 코다리를 만났습니다!

멍멍이은 반가워서 왈왈 소리를 내었습니다.

코다리는 멍멍이를 만났습니다!

코다리은 반가워서 뿌우우 소리를 내었습니다.

우리 day09.Animal@1be6f5c3는요 종류는 야옹이고 이름이 4고 다리가 Exception in thread "main" java.util.IllegalFormatConversionException: d != java.lang.String

at java.base/java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4442)

at java.base/java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2963)

at java.base/java.util.Formatter$FormatSpecifier.print(Formatter.java:2918)

at java.base/java.util.Formatter.format(Formatter.java:2689)

at java.base/java.io.PrintStream.format(PrintStream.java:1209)

at java.base/java.io.PrintStream.printf(PrintStream.java:1105)

at day09.AnimalMain.main(AnimalMain.java:60)

보니까

day09.Animal@1be6f5c3는요 이런식으로 뜨는데, 이 값은 string 이 아닌값인것 같다.

 

그럼 이걸 해결하기 위해서는 어떻게 해야하지?

 

객체명을 뽑을 수는 없을까?

 

위에것은 아직 해결 못하고 그냥 사실 클래스에 변수추가 하나 해서 하면 간단하긴 하다.

 

public void print() {
		System.out.println(name+"\t"+sound+"\t"+leg);
	}

이렇게 클래스단에  print() 메서드를 추가해 두면

 

메인단에서 

야옹이 야옹 4

뽀삐 멍멍 4

양념이 꼬끼오 2

방울이 스스 0

 

이렇게 실행이 된다.

 

 

OVERLOADI 생성자

 

package day09;

public class Fruits {
	
	//필드(인스턴스 변수)
	
	String name;
	String color;
	boolean isSeed;
	
	
	
	//생성자 - 객체를 생성할 때 사용하는 것
	//아래것은 기본생성자인데, 아무것도 없으면 기본생성된다.
	//특징 1. 클래스 이름과 동일
	// 2.리턴타입이 없다. 
	public Fruits() {
		
	}
	//생성자인데 값 세팅할라고 쓰는거임. 
	//코드줄이려고 쓰거나 
	//오버로딩 - 매개변수를 다르게 해서 동일한 이름을 가질 수 있는것.
	//오버로딩 하는 이유 ->매개변수가 들어가야만 확인할 수 있는 조건이 있다.
	//두번째 생성자 사용하여 melon 객체 생성 
	//세번째 생성자 사용하여 orange 객체 생성
	
	public Fruits(String name) {
		
	}
	
	public Fruits(String name,String color) {
		this.name = name;
		this.color = color;
	}
	
	public Fruits(String name,String color, boolean isSeed) {
		this.name = name;
		this.color = color;
		this.isSeed = isSeed;
	}
	
	
	//메서드
	public void print() {
		System.out.println(name+"\t"+color+"\t"+isSeed);
	}
	
	
}

일반적으로, Fruits()를 여러 번 사용할 수 없다. 하지만 괄호 내부에 매개변수를 지정해 주면 사용할 수 있다.

오버로딩을 사용하는 이유는 매개변수가 들어가야지만 확인할 수 있는 경우가 있기 때문이다.

 

package day09;

public class PeopleMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		People a = new People("홍길동",90);
		People b = new People("이순신",80);
		
		a.ageUp();
		b.ageUp1(11);
		a.print();
		b.print();
		
		//홍길동 나이 90인 객체 생성 ageUp메서드 사용(호출), 프린트사용.
		//이순신 나이 80인 객체 생성, ageUp1메서드 사용, 프린트사용.
		
	}

}

 

 

홍길동 90살과 이순신 80살 객체 생성하기.

출력해보면

 

홍길동의 나이는 91 살입니다.

 

이순신의 나이는 91 살입니다.

이렇게 나오는데, 이를 나오게 하기위한 클래스 People클래스는 다음과 같다.

 

package day09;

public class People {
	
	private String name; //이름
	private int age; // 나이
	
	public People() {
		
	}
	
	public People(String name,int age) {
		this.name = name;
		this.age = age;
		
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
	
	public void print() {
		System.out.println();
		System.out.printf("%s의 나이는 %d 살입니다.\n",name,age);
	}
	public void ageUp() {
		age+=1;
	}
	public void ageUp1(int age) {
		this.age+=age;
	}
	
//	//생성자
//	
//	//기본생성자
//	public People() {
//		
//	}
//	//전체필드를 다 받는 생성자
//	public Peoole(String name, int age) {
//		this.name = name;
//		this.age = age;
//	}
//	//모든 필드 get / set메서드   메서드는 리턴타입이 추가된다.
//	public void setName(String name) {
//		this.name = name;
//		
//	}
//	public String getName() {
//		return name;
//	}
//	
//	public int getAge() {
//		return age;
//	}
//	
//	public void setAge(int age) {
//		this.age = age;
//	}
	//모든필드를 출력하는 print 메서드
	//메서드명:ageUP, 매개변수 없음, 리턴타입 없음, 실행문구는 age를 매개변수만큼 증가.
	
}

 

항상 염두에 두어야 할 점은, private로 설정하면 같은 클래스 내부에서만 접근이 가능하다는 점. 따라서 private로 설정된 것은 public으로 설정된 것을 경유해서 접근해야 한다는 것이다.

 

 

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

2023-07-03 수업일지  (0) 2023.07.03
2023-06-29 수업일지  (0) 2023.06.29
2023-06-27 학습일지  (0) 2023.06.28
2023-06-26 학습일지  (0) 2023.06.27
2023-06-23 학습일지  (0) 2023.06.23