클래스 만들기 연습 v0.1

학점을 구하기 위해서는 어떤 CLASS가 있어야 할까?

- 과목 클래스

class Subject {
    var name: String
    var score: Int = 0
    var grade: String = "F"
    var gradePoint: Double = 0.0
    
    init(name: String) {
        self.name = name
    } // instance를 생성할 때, 무조건 name 초기화
    
    
    func setScore(score: Int) {
        self.score = score
        changeGrade()
        gradeToGradepoint()
    } // method 함수 구현
    
    
    func changeGrade() {
        if score > 0 && score <= 100 {
            if score >= 95 {
                grade = "A+"
            }else if score >= 90 {
                grade = "A"
            }else if score >= 85 {
                grade = "B+"
            }else if score >= 80 {
                grade = "B"
            }else if score >= 75 {
                grade = "C+"
            }else if score >= 70 {
                grade = "C"
            }
        }
    }
    
    func gradeToGradepoint() {
        if grade == "A+" {
            gradePoint = 4.0
        }else if grade == "A" {
            gradePoint = 3.5
        }else if grade == "B+" {
            gradePoint = 3.0
        }else if grade == "B" {
            gradePoint = 2.5
        }else if grade == "C+" {
            gradePoint = 2.0
        }else if grade == "C" {
            gradePoint = 1.5
        }
    }
   
}

- 학생 클래스

class Student {
    var name: String
    var studentID: Int
    var subjects: [Subject] = []
    
    var totalScore: Int = 0
    var average: Double = 0
    
    var totalGrade: String = "F"
    var totalGradePoint: Double = 0.0
    
  
    init(name: String, id: Int) {
        self.name = name
        self.studentID = id
    }
    
    // 수강 과목들을 모두 받아서 넣어주는 Method
    // setSubjects에는 배열을 넣을거야. 배열안에는 Subject 타입의 인스턴스들이 들어있어.
    func setSubjects(subjects:[Subject]) {
        self.subjects = subjects
        // 학생이 듣는 과목을 SET하면, 동시에 total Score를 업데이트 한다.
        for sbj in subjects {
            totalScore += sbj.score
        }
        // 동시에 GradePoint의 합과 Grade를 업데이트 한다.
        getTotalGradePoints()
        gradepointToGrade()
    }
    
    
    func getTotalGradePoints() {
        var totalPoint: Double = 0.0
        for sbj in self.subjects {
            totalPoint += sbj.gradePoint
        }
        totalGradePoint = totalPoint/Double(subjects.count)
    }
    

    func gradepointToGrade() {
        if totalGradePoint >= 4.0 {
            totalGrade = "A+"
        }else if totalGradePoint >= 3.5 {
            totalGrade = "A+"
        }else if totalGradePoint >= 3.0 {
            totalGrade = "B+"
        }else if totalGradePoint >= 2.5 {
            totalGrade = "B"
        }else if totalGradePoint >= 2.0 {
            totalGrade = "C+"
        }else if totalGradePoint >= 1.5 {
            totalGrade = "C"
        }
    }
}

- 연산 클래스

class CreditCalculation {
    
    // 01. 학생 객체를 파라메터로 받아서 평균을 구해주는 함수
    func studentScoreAvg(student: Student) -> Int {
        let avgScore = avgSubjectScores(subjects: student.subjects)
        student.totalScore = avgScore
        return student.totalScore
    }
    
    // 02. Subject 객체들이 담긴 배열의 Score들을 모두 더해서 평균내주는 함수
    func avgSubjectScores(subjects:[Subject]) -> Int {
        var totalScore: Int = 0
        for sbj in subjects {
            totalScore += sbj.score
        }
        let avgScore: Int = totalScore / subjects.count
        return avgScore
    }
    
    // 03. Subject 객체들이 담긴 배열의 Score들을 모두 더해서 합만 구해주는 함수
    func addAllSubjectSocres(subjects: [Subject]) -> Int {
        var totalScore: Int = 0
        for sbj in subjects {
            totalScore += sbj.score
        }
        return totalScore
    }
    
    // 04. 평균 계산 함수 한방에 만들기
    func avgCalculation(student: Student) -> Double {
        var totalScore: Int = 0
        let subjects = student.subjects
        for sbj in subjects {
            totalScore += sbj.score
        }
        return Double(totalScore)/Double(subjects.count)
    }


}

- 위 3가지 클래스를 활용한 인스턴스 구현

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // super = 부모의 속성
        
        let math = Subject(name: "Math")
        let english = Subject(name: "English")
        let computer = Subject(name: "Computer")
        let science = Subject(name: "Science")
        let economy = Subject(name: "Economy")

        math.setScore(score: 90)
        english.setScore(score: 93)
        computer.setScore(score: 95)
        science.setScore(score: 89)
        economy.setScore(score: 88)
        
        let steve: Student = Student(name: "Steve", id: 2011111050)
        steve.setSubjects(subjects: [math, english, computer, science, economy])

        // Steve 학생의 average에 값 넣어주기
        let cal = CreditCalculation()
        steve.average = cal.avgCalculation(student: steve)
        
        print(steve)
    }
}

접근 지정자 : Private

class Subject {
    private var name: String
    private var score: Int = 0
    -> 외부에서 score에 setscore로 값을 할당은   있으나, 값을 직접 읽을 수는 없음

    func setScore(score: Int) {
        self.score = score
    } // method 함수 구현
    
    init(name: String) {
        self.name = name
    } // instance를 생성할 때, 무조건 name이 초기화 되고, 추후에 바꿀 수도 없음
}