2021.11.18 | java 성적처리예제, ArrayList, LinkedList, equals(), 향상된 for문

5621 단어 JavaJava

개인 공부의 필요성을 느껴서 그날 알게된 내용이나 공부한 내용들을 꾸준히 적어보려고한다.
매일 1시간씩 꾸준히 공부하는 것이 목표이다.
과연 가능할지는 모르겠지만 해보려고 노력하려한다.

java 객체 지향 프로그래밍

1. 성적처리 예제

collection을 사용하여 이름과 아이디 국영수 점수를 받아서 평균과 총점등을 출력하는 프로그램

import java.io.*;
import java.util.*;

class Student{
	final String name;
  	final int id;
	final int kor, eng, math; //final을 모두 붙임. private으로 안해도 외부에서 바꿀 수 없음
	
	public Student(String name, int id, int kor, int eng, int math){ //error: 생성자는 void 안붙임!!!!!!!
		this.name = name;
		this.id = id;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
}

class Main {
	public static void main(String[] args) throws Exception {
		Scanner scan = new Scanner(System.in); //학생입력
		List<Student> Slist = new ArrayList<Student>(); //Student 객체를 넣을 리스트 생성, 학생목록 LinkedList로 만들어도됨 
		String _name;
		int _id, _kor, _eng, _math;
		
		while(true){
			_name = scan.nextLine();
			if(_name.equals("Z")){ //의미적으로 같으려면 equal를 호출해야함
				break;
			}
		
			_id = scan.nextInt();
			_kor = scan.nextInt();
			_eng = scan.nextInt();
			_math = scan.nextInt(); // 입력받아서 변수에 저장하기
			scan.nextLine(); //다음 입력을 위해 띄워줘야함
		
			Slist.add(new Student(_name, _id, _kor, _eng, _math)); //객체를 생성하고 add.
		}
		System.out.println("학번       이름       국어   영어   수학     총점     평균");
		double sum = 0;
		double kor_sum = 0;
		double eng_sum = 0;
		double math_sum = 0;
		double count = 0;
		for(Student S: Slist){
			sum = S.kor + S.math + S.eng;
			kor_sum+=S.kor;
			eng_sum+=S.eng;
			math_sum+=S.math;
			count+=1;
			
			System.out.printf("%6d %6s %6d %6d %6d %8.2f %8.2f\n", S.id, S.name, S.kor, S.eng, S.math, sum, sum/3.0); //sum이 double 이니까 3.0으로 나눔
		}
		System.out.println("=======================================================");
		System.out.printf("전체평균             %6.2f %6.2f %6.2f           %6.2f ", kor_sum/count, eng_sum/count, math_sum/count, (kor_sum + eng_sum + math_sum)/(count*3.0));
		
		
	}
}

코드설명:

각 학생의 name, id, kor, eng, math 정보를 받기위해 Student class를 정의.
Student class의 객체를 저장할 ArrayList Slist를 선언하고 add함수로 저장.
name 대신 Z를 입력하면 add가 종료됨.
for문을 이용해서 점수를 출력한다.

입력:

seohyeon
2020125011 30 40 30
hannju22
2020106036 30 20 70
Z

결과는 이렇게 출력된다.

줄을 맞추기 위해서 포맷을 사용한다
포맷은 %2s처럼 가운데 숫자를 입력하면 입력한 숫자만큼의 공간을 할당한다.
숫자가 양수라면 문자열은 오른쪽으로 정렬되며, 음수라면 왼쪽에 정렬된다.

사실 글자수가 달라지면 포맷도 다시 다 바꿔야해서 무슨 소용인지 모르겠지만, 포맷을 적절하게 사용해서 줄을 맞추는 것이 과제의 일부여서 진행했다.

공부한내용

equals 함수

if(_name.equals("Z")){ //의미적으로 같으려면 equal를 호출해야함
	break;
}

이 부분을

if(_name == "Z"){ 
	break;
}

이렇게 바꾸면 오류가 난다.

equals 메소드는 두 객체가 의미적으로 같은지 비교하고 불리언으로 return해준다.
서로 다른 객체를 참조하고 있더라도 의미가 같으면 true를 반환한다.

반면 "=="은 서로 다른 객체를 참조하고 있으면 의미가 같아도 false를 반환한다.

ArrayList, LinkedList

나는 ArrayList를 사용했는데 교수님은 LinkedList를 사용하셨다.
java.util에서 import하여 사용가능하며 둘다 List를 구체화한 class이다.
주의할 점은 <>안에 객체만 들어갈 수 있다. 예를 들어 int는 reference변수가 아니므로 불가능하다. Integer는 가능하다.
사용방법은 아래와 같다.

List<Student> Slist = new ArrayList<Student>(); 
LinkedList<Student> students = new LinkedList<Student>();
LinkedList<Student> students

라고 쓰든

List<Student> students

라고 쓰든 new에서 LinkedList라고 쓰면 별 차이 없는 것 같다.

ArrayList - 배열을 사용한다. 검색이 잦을 시 유용하다.
LinkedList - 노드를 사용한다. 데이터의 추가, 삭제가 쉽다. 추가할때 항상 마지막에 추가되므로 시간면에서 유리하다.

둘다 List를 구체화한 class이므로 add()와 get() remove()사용이 가능하다.

Slist.add(new Student(_name, _id, _kor, _eng, _math)); //객체를 생성하고 add.

사용예시이다.

향상된 for문

java에서 일반적인 for문은

for(i=0; 조건; i++);

이런 형태이다.
파이썬에서는 조금 다른데 향상된 for문이 비슷한 형태를 띤다.

for(String obj: array)

이렇게 선언하면 array의 배열항목을 하나씩 obj에 저장해서 실행한다.
obj의 자료형인 String을 꼭 적어야한다.

다른 예로는

for(Student S: Slist)

자료형이 class Student이다.

오늘 공부한 내용은 이까지다.
처음 써보는거라 시간이 좀 걸렸다.
도움이 되길!!

좋은 웹페이지 즐겨찾기