Written by
Amy
on
on
클래스 만들기 연습 v0.1
학점을 구하기 위해서는 어떤 CLASS가 있어야 할까?
- 과목 클래스 : Name, Score, Grade, Grade Point
- 학생 클래스 : Name, [Subject], Total Score / Grade / Grade Point
- 연산 클래스 : 학생 이름을 입력하면 평균 점수를 반환하는 메소드
- 과목 클래스
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
- 만약 Subject의 Score를 수정(Write)만 할 수 있고, 접근(Read)는 할 수 없게 구현하고 싶다면?
- Class 내에서 변수 score를 선언할 때 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이 초기화 되고, 추후에 바꿀 수도 없음
}