목차
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 |