CS101 과목의 성적표 프로그램의 답안을 전문적으로 보이게 수정하고 이를 루비와 비교해보았습니다. LoC에서의 차이점이나 루프를 돌거나 리스트를 다루는 방법 등에 대한 비교.
(generics 써서 캐스팅 없애는건 제외하고) 자바에서 더 짧게 짤 수 있으시다면, be my guest.
1. Subject.java
public class Subject { private String name; private int score; public Subject() { } public Subject(String name, int score) { setName(name); setScore(score); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } }
1′. subject.rb
class Subject def initialize(name, score) @name = name @score = score end attr_accessor :name, :score end
2. Scorecard.java
import java.util.Arrays; import java.util.Collections; import java.util.Comparator; public class Scorecard { private String studentName; private Subject[] subjectArray; public Scorecard(String studentName, Subject[] subjectArray) { this.studentName = studentName; this.subjectArray = subjectArray; } public double getTotal() { double result = 0; for (Subject s: subjectArray) result += s.getScore(); return result; } public double getAverage() { return getTotal() / subjectArray.length; } public String getStudentName() { return studentName; } public Subject findBestSubject() { return (Subject) Collections.max( Arrays.asList(subjectArray), new Comparator() { public int compare(Object o1, Object o2) { return ((Subject)o1).getScore() - ((Subject)o2).getScore(); } } ); } }
2′. scorecard.rb
class Scorecard def initialize(name, subjects) @name = name @subjects = subjects end def total @subjects.inject(0.0) { |total, s| total + s.score } end def average total / @subjects.size end def best_subject @subjects.max { |a, b| a.score <=> b.score } end attr_reader :name end
3. ScorecardMain.java
public class ScorecardMain { public static void main(String[] args) { Subject[] sub = new Subject[] { new Subject("Math",90), new Subject("English",86), new Subject("Physics",88), new Subject("Biology",97) }; Scorecard sCard = new Scorecard("철수",sub); System.out.println(sCard.getStudentName()+" 학생의 총점은 " +sCard.getTotal()+" 점 입니다."); System.out.println(sCard.getStudentName()+" 학생의 평균점수는 " + +sCard.getAverage()+" 점 입니다."); System.out.println("제일 잘한 과목은 " +sCard.findBestSubject().getName() +"로 "+sCard.findBestSubject().getScore()+"점 입니다."); } }
3′. scorecard_main.rb
require "subject" require "scorecard" subjects = [Subject.new("Math", 90), Subject.new("English", 86), Subject.new("Physics", 88), Subject.new("Biology", 97)] card = Scorecard.new("철수", subjects) puts "#{card.name} 학생의 총점은 #{card.total} 점입니다." puts "#{card.name} 학생의 평균점수는 #{card.average} 점입니다." puts "제일 잘한 과목은 #{card.best_subject.name} 로 #{card.best_subject.score} 점입니다."