Java vs Ruby: 성적표 프로그램

Tags:

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} 점입니다."