Question:
안녕하세요. 17살부터 자바웹프로그래머를꿈꾸고온 18살 홍승민이라합니다.
다만 제가지금 자바공부를하면서 List종류에막혔거든요.
그래서 질문드립니다. 답장꼭해주세요ㅠ.ㅠ
1.
List list = new ArrayList(); 와
ArrayList list = new ArrayList(); 는 뭐가 다른것인가요?
2.
List list = new ArrayList(); 와
List list = new ArrayList(); 는 뭐가다른것인가요?
- 소스질문드립니다.
성적관리 프로그램을 만들고 있는데 소트에서 막혔습니다.
총점에따라 성적을 나누려고하는데요.
이름 국어 영어 총점
홍 100 10 110
승 100 90 190
민 100 100 200
로 입력한다면
이름 국어 영어 총점
민 100 100 200
승 100 90 190
홍 100 10 110
이렇게 소트하고싶은데, 도저희 어디서부터 소트를해야하며 어디서부터 소트를만들어야하는지 모르겠습니다.
class Student
{
String name;
double total;
double avg;
double[] score;
public Student(String name,double[] score)
{
this.name = name;
this.score = score;
}
public void list()
{
calculateTotal();
calculateAverage();
System.out.print(name+"t");
for(int x = 0;x < score.length;x++)
{
System.out.print(score[x]+"t");
}
System.out.print(total+"t");
System.out.print(avg);
}
public void calculateTotal()
{
for(int x = 0;x < score.length;x++)
{
total += score[x];
}
}
public void calculateAverage()
{
avg = total/score.length;
}
}
import java.io.*;
import java.util.*;
public class Exam_01
{
public static void main(String[] ar) throws IOException
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
ArrayList list = new ArrayList();
System.out.print("과목 겟수 :: ");
int sub = Integer.parseInt(in.readLine());
String[] subject = new String[sub];
for(int x = 0;x < subject.length;x++)
{
System.out.print(x+1+"번 과목의 이름 :: ");
String s = in.readLine().toString();
subject[x] = s;
}
System.out.print("학생 수 :: ");
int stu = Integer.parseInt(in.readLine());
int i = 0;
for(int x = 0;x < stu;x++)
{
System.out.print(x+1+"번 학생의 이름 :: ");
String name = in.readLine().toString();
double[] sco = new double[sub];
for(int z = 0;z < subject.length;z++)
{
boolean test = false;
while(!test)
{
System.out.print(subject[z]+" 과목의 점수 :: ");
double score = Double.parseDouble(in.readLine());
if(score 100)
{
System.out.println("0보다작거나 100보다 큽니다. 다시입력해주세요.");
test = false;
}
else
{
sco[x] = score;
test = true;
}
}
}
Student data = new Student(name,sco);
list.add(data);
}
System.out.print("이름"+"t");
for(int y = 0; y < subject.length;y++)
{
System.out.print(subject[y]+"t");
}
System.out.print("총점t평균");
System.out.println();
for(int x = 0;x < stu;x++)
{
Student target = (Student)list.get(x);
target.list();
System.out.println();
}
}
}
입니다.
무엇을서야하며 어디서 고쳐야하는지 , 답을 알려주시면 감사드리겠습니다.
부탁드립니다
Answer:
1.
List list = new ArrayList(); 와
ArrayList list = new ArrayList(); 는 뭐가 다른것인가요?
간단하게 예를 들어 설명하도록 하겠습니다.
List list = new ArrayList() 는
도형 list = new 정사각형();
ArrayList list = new ArrayList();
정사각형 list = new 정사각형();
위의 예처럼 List는 interface입니다. 인터페이스는 공통되는 메소드를 추출해놓은 클래스로 생각하시면 됩니다. 클래스를 생성할때 도형 타입으로 생성하게 되면 정사각형이 아닌 다른 직사각형, 삼각형등 도형 인터페이스를 구현한 클래스에서 사용 될 수 있습니다. 그렇지만 정사각형 클래스로 생성하게 되면 직사각형, 삼각형등에서는 사용할 수 없게 됩니다. 자바의 특징중 다형성을 참조 하십시오.
2.
List list = new ArrayList(); 와
List list = new ArrayList(); 는 뭐가다른것인가요
이 부분은 위와 비슷한 부분인데 간단하게 List에 담겨질 객체의 타입을 정해 준 겁니다. 기본적으로 자바의 Collection 은 Object 타입으로 추가가 됩니다.
List list = new ArrayList();
Object obj = list.get(1); // 이런식으로 Object 타입으로 리턴이 됩니다.
그렇지만
List list = new ArrayList<Student)();
Student stu = list.get(1); // 이런식으로 return 타입이 Student 객체로 출력 됩니다.
그리고 타입을 설정하게 되면 Student 객체가 아닌 다른 타입은 add를 할 수 없기 때문에
오류를 예방 할 수 있습니다.
- 코드 수정 및 정렬
저는 BufferedInputStream이 아닌 Scanner를 사용해서 작성했습니다.
형변환을 피하기 위해서 변경 해봤습니다. 붉게 표시된 부분이 질문자님의 코드와
다른 부분입니다.
이 부분은 리스트를 정렬하기 위해 사용합니다. 뒤에 있는 StudentComparator() 클래스를 정렬할 기준을
정해주기 위해 사용했습니다.
예를 들어
int a = 0;
int b = 1;
위와 같이 정수형 변수 a,b 에서는 어떤것이 크고 작다를 알 수 있습니다.
그렇지만 Student 클래스 a,b 를 비교하기 위해서 기준을 알 수 없습니다. 국어 과목을 기준으로 정렬할 것인지 수학을 기준으로 정렬할 것인지 총점으로 정렬할 것인지…
그래서 기준을 정의 하기 위해 작성했습니다.
package sort;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Exam_01 {
public static void main(String[] ar) throws IOException {
Scanner scanner = new Scanner(System.in, "euc-kr");
// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
ArrayList list = new ArrayList();
System.out.print("과목 겟수 :: ");
int sub = scanner.nextInt();
// int sub = Integer.parseInt(in.readLine());
String[] subject = new String[sub];
// for (int x = 0; x < subject.length; x++) {
// System.out.print(x + 1 + "번 과목의 이름 :: ");
// String s = in.readLine().toString();
// subject[x] = s;
// }
System.out.println("과목명을 입력하세요.");
for(int i=0; i<sub; i++) {
subject[i] = scanner.next();
}
System.out.print("학생 수 :: ");
// int stu = Integer.parseInt(in.readLine());
int stu = scanner.nextInt();
int i = 0;
for (int x = 0; x < stu; x++) {
System.out.print(x + 1 + "번 학생의 이름 :: ");
// String name = in.readLine().toString();
String name = scanner.next();
double[] sco = new double[sub];
for (int z = 0; z < subject.length; z++) {
boolean test = false;
while (!test) {
System.out.print(subject[z] + " 과목의 점수 :: ");
// double score = Double.parseDouble(in.readLine());
double score = scanner.nextDouble();
if (score 100) {
System.out.println("0보다작거나 100보다 큽니다. 다시입력해주세요.");
test = false;
} else {
sco[z] = score; // x는 학생 수 이므로 z로 변경 필요
test = true;
}
}
}
Student data = new Student(name, sco);
list.add(data);
}
System.out.print("이름" + "t");
for (int y = 0; y < subject.length; y++) {
System.out.print(subject[y] + "t");
}
Collections.sort(list, new StudentComparator());
System.out.print("총점t평균");
System.out.println();
for (int x = 0; x < stu; x++) {
Student target = (Student) list.get(x);
target.list();
System.out.println();
}
}
}
class Student {
String name;
double total;
double avg;
double[] score;
public Student(String name, double[] score) {
this.name = name;
this.score = score;
}
public void list() {
calculateTotal();
calculateAverage();
System.out.print(name + "t");
for (int x = 0; x < score.length; x++) {
System.out.print(score[x] + "t");
}
System.out.print(total + "t");
System.out.print(avg);
}
public void calculateTotal() {
for (int x = 0; x < score.length; x++) {
total += score[x];
}
}
public void calculateAverage() {
avg = total / score.length;
}
}
/**
* Student 클래스를 비교 하기 위한 비교 조건
*/
class StudentComparator implements Comparator {
@Override
public int compare(Student student1, Student student2) {
// 총점이 높은 사람을 조건으로 하여 정렬하도록 합니다.
if(student1.total >= student2.total) {
return 1;
} else {
return 0;
}
}
}