1. class 써서 학생 점수
▼ 나
ㅋㅋㅋㅋ ㅠ 출력 안됨 ㅠ
---- class에서 배열 선언만 하고 생성을 안함. >> class에서도 똑같이 써야함. int[] score = new int[5];
---- 배열을 출력하려면 루프 써야 함.
---- 배열 초기화 코드는 선언 시에만 가능하고, 그 이후에는 안 됨.
int[] score = new int[5];
s2.score = { 1, 70, 80, 40, 0 } //error!!
class Student {
String name;
int[] score; // 번호, 국, 영, 수, 총합
float avg;
}
public class Oop_student {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s1 = new Student();
s1.name = "우장춘";
s1.score[0] = 1;
s1.score[1] = 90;
s1.score[2] = 89;
s1.score[3] = 78;
s1.score[4] = s1.score[1] + s1.score[2] + s1.score[3];
s1.avg = (float) s1.score[4] / 3;
String[] title = { "name", "num", "kor", "eng", "math", "total", "avg" };
System.out.println(title);
System.out.println(s1.name + "\t" + s1.score + "\t" + s1.avg);
}
}
▼ 강사님
//학생 1명 정보를 담을 클래
class Student1 {
String name;
int num, kor, eng, math, total;
float avg;
}
class Student2 {
String name;
int[] score = new int[5];
float avg;
}
public class Oop_s_teach {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student1 s1 = new Student1();
s1.name = "aaa";
s1.num = 1;
s1.kor = 98;
s1.eng = 30;
s1.math = 87;
s1.total = s1.kor + s1.eng + s1.math;
s1.avg = (float) s1.total / 3;
System.out.println("name: " + s1.name);
System.out.println("num: " + s1.num);
System.out.println("kor: " + s1.kor);
System.out.println("eng: " + s1.eng);
System.out.println("total: " + s1.total);
System.out.println("avg: " + s1.avg);
Student2 s2 = new Student2();
s2.name = "bbb";
s2.score[0] = 2; // num
s2.score[1] = 50; // kor
s2.score[2] = 78; // eng
s2.score[3] = 95; // math
for (int i = 1; i < 4; i++) {
s2.score[4] += s2.score[i]; // 총점 계산
}
s2.avg = (float) s2.score[4] / 3;
System.out.println("name: " + s2.name);
for (int i = 0; i < 5; i++) {
System.out.println("score[" + i + "] = " + s2.score[i]);
}
System.out.println("avg: " + s2.avg);
}
}
===========================================
(print)
name: aaa
num: 1
kor: 98
eng: 30
total: 215
avg: 71.666664
name: bbb
score[0] = 2
score[1] = 50
score[2] = 78
score[3] = 95
score[4] = 223
avg: 74.333336
2. 3명의 이름/전화번호/주소 입력 받아서 저장, 출력
- 스페이스바가 포함된 값을 저장하려면 복잡해지니까 --> 스페이스 없이 next()로 단어하나로 처리하기
- 배열 / 변수3개 상관없음. 배열 써서 for문으로 처리하는게 더 편할거임.
▼ 나
- 짝꿍 왈) 윗부분이 지저분하고 main{}은 깔끔한 것이 좋다!!!
class 안에서 다 처리하고 main{} 에서는 호출만!
import java.util.Scanner;
class Students {
String name, num, address;
String[] s = { "name", "num", "address" };
Scanner sc = new Scanner(System.in);
void setData() {
System.out.println("이름을 입력하시오");
s[0] = sc.next();
System.out.println("전화번호를 입력하시오");
s[1] = sc.next();
System.out.println("주소를 입력하시오");
s[2] = sc.next();
}
void printData() {
System.out.println("이름: " + s[0]);
System.out.println("전화번호: " + s[1]);
System.out.println("주소: " + s[2]);
}
}
public class OopAssignment {
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 3; i++) {
Students si = new Students();
si.setData();
si.printData();
}
}
}
▼ 강사님
- 입력 받는 setter 는 따로 빼는게 재사용성에 유리함
- 입력 3번 쭉 받고 3개 연달아 출력.
import java.util.Scanner;
class Member {
String name, tel, addr;
void setData(String n, String t, String a) {
name = n;
tel = t;
addr = a;
}
void printData() {
System.out.println("name: " + name);
System.out.println("tel: " + tel);
System.out.println("addr: " + addr);
}
}
public class ArrAssignTeach {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
//키도브 입력 받은 값을 임시 저장.
String name = "", tel = "", addr = ""; //main에 선언한 지역변수.
// 코드 안정성 & 오류 해결을 위해 초기화
//크기가 3인 배열 생성
Member[] arr = new Member[3];
int i;
//배열 크기 만큼 반복
for (i = 0; i < arr.length; i++) {
System.out.println("name: ");
name = sc.next();
System.out.println("tel: ");
tel = sc.next();
System.out.println("addr: ");
addr = sc.next();
arr[i] = new Member();
arr[i].setData(name, tel, addr);
}
for (i = 0; i < arr.length; i++) {
arr[1].printData();
}
}
}
3. 3개의 상품정보
class: Product
정보: 제품번호(int), 제품명(String), 수량(int), 가격(int)
- Product 타입의 배열을 생성해서 제품정보 3개 저장하고 출력.
- 제품정보는 Scanner로 입력을 받되,
- 제품번호는 자동할당. (객체 카운팅 생성과 유사)
▼ 나
- 메인 창에 선언한 arr[3]은 class Product가 3개의 방에 마련되어있다는 뜻.
즉, 상품 3개의 정보를 받을 준비가 이미 되어있는 것.
그러므로 for 문으로는 각 방에 상품의 정보를 받기만 하면 됨.
- 제품 번호 카운팅과 상품 정보 출력은 마지막에 3번 연달아 하면 되기 때문에 따로 for 문으로 받음.
- setData 처리를 함수(void)로 할 수 있고 생성자로 할 수 있음
하지만 생성자로 할 경우 main에서 다시 값을 할당하는 2중 처리를 해야 함
함수(void)로 할 경우 main에서 변수.setData()로 불러오면 되기 때문에 간편.
- 제품 번호 카운팅은 static 변수로 해서 main 에서 class명.static변수명++; 로 처리하면 간편함.
import java.util.Scanner;
class Product {
static int num;
String name;
int qty;
int price;
void setData(String name, int qty, int price) {
this.name = name;
this.qty = qty;
this.price = price;
}
void printData() {
System.out.println("제품 번호: " + num);
System.out.println("제품 이름: " + name);
System.out.println("제품 수량: " + qty);
System.out.println("제품 가격: " + price);
}
}
public class OopAssignment3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
Product[] arr = new Product[3];
int i;
for (i = 0; i < 3; i++) {
arr[i] = new Product();
System.out.println("제품 이름: ");
String name = sc.next();
System.out.println("제품 수량: ");
int qty = sc.nextInt();
System.out.println("제품 가격: ");
int price = sc.nextInt();
arr[i].setData(name, qty, price);
}
for (i = 0; i < 3; i++) {
Product.num++;
arr[i].printData();
}
System.out.println();
}
}
▼ 강사님
- 앞으로 VO 는 자동으로 생성자와 출력문을 Source > Generate... 로 만들기!
--- 입력문은 알아서 만들기 ^^..
class Product {
int num;
String name;
int price;
int amount;
static int cnt; // num 카운트 할 static 변수 새로 생성
public Product() {
}
// Source > Generate Constructor using Fields...
public Product(String name, int price, int amount) {
super(); // (상속관계) 부모클래스의 생성자 //지워도 되고 있어도 됨.
num = ++cnt; //cnt는 모든 객체가 공유하니까 자동할당 될 수 있음.
this.name = name;
this.price = price;
this.amount = amount;
}
// Source > Generate toString()...
@Override
public String toString() {
return "Product [num=" + num + ", name=" + name + ", price=" + price + ", amount=" + amount + "]";
}
}
public class ProductMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 배열 초기화해서 생성
Product[] arr = { new Product("aaa", 1000, 5), new Product("bbb", 2000, 10), new Product("ccc", 3000, 2) };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
================================================
(print)
Product [num=1, name=aaa, price=1000, amount=5]
Product [num=2, name=bbb, price=2000, amount=10]
Product [num=3, name=ccc, price=3000, amount=2]
그래서 생성자로 값 할당했을 때 입력받는 버전을 해보았음
import java.util.Scanner;
class Product {
int num;
String name;
int price;
int amount;
static int cnt; // num 카운트 할 static 변수 새로 생성
public Product() {
}
// Source > Generate Constructor using Fields...
public Product(String name, int price, int amount) {
super(); // (상속관계) 부모클래스의 생성자 //지워도 되고 있어도 됨.
num = ++cnt; //cnt는 모든 객체가 공유하니까 자동할당 될 수 있음.
this.name = name;
this.price = price;
this.amount = amount;
}
// Source > Generate toString()...
@Override
public String toString() {
return "Product [num=" + num + ", name=" + name + ", price=" + price + ", amount=" + amount + "]";
}
}
public class ProductMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 배열 초기화해서 생성
Scanner sc = new Scanner(System.in);
Product[] arr = new Product[3];
for (int i = 0; i < 3; i++) {
System.out.println("제품 이름: ");
String name = sc.next();
System.out.println("제품 가격: ");
int price = sc.nextInt();
System.out.println("제품 수량: ");
int amount = sc.nextInt();
arr[i] = new Product(name, price, amount); //생성자 값 할당
System.out.println(arr[i]);
System.out.println("-------------------");
} //이렇게 할 경우 값 입력 > 상품정보1 출력 > 값 입력 > 출력 번갈아 됨.
}
}