이 글을 쓰는 목적은 이제 막 iOS와 "이해하기"위한 공부를 시작한 사람 입장으로서 헷갈리는 개념들이기에 이렇게 글을 쓴다.
글을 시작하기 앞서 이 블로그는 주인장이 이해하기 쉽게 설명을 풀이 하고 궁금할 때 이 블로그를 켰을 때 "아 이거였지 !"를 할 수 있는 글을 만드는 것이다.
이 두 단어는 iOS의 "객제지향 프로그래밍 언어"의 "클래스"를 기반으로 하는 개념들이다.
다른 많은 언어를 했을 땐 이해가 되지 않았지만 swift에서는 흥미가 생겼다!
아래 두 클래스들은 모든 예시를 만들 때 사용할 코드이다.
class Parents{
var math : Int = 0
var english : Int = 0
func grade(){
let grade = math + english
print("두 과목의 점수 합은 =\(grade)")
}
init(math : Int , english : Int){
self.math = math
self.english = english
}
}
class Children{
}
override는 부모 클래스에서 자식 클래스로 상속한 뒤 함수를 만들 때 부모 클래스에서 사용했던 함수를 같은 이름의 함수로 "재정의"하고 싶을때 사용한다.
주요 키워드
1. override
2. 재정의
3. 같은 이름의 함수
//부모 클래스
class Parents{
var math : Int = 0
var english : Int = 0
func grade(){
let grade = math + english
print("두 과목의 점수 합은 =\(grade)")
}
init(math : Int , english : Int){
self.math = math
self.english = english
}
}
//자식 클래스
class Children : Parents{
}
//값 대입 , 함수 호출
let child = Children(math: 34, english: 45)
//인스턴스 상수 child를 생성 후 값을 초기화하고
child.grade()
//child 인스턴스에 grade 메서드를 호출하여 값을 출력한다.
이 코드는 자식 클래스를 만들고 상속까지 한 코드이다
자식 클래스 내부에는 아무 코드가 없지만 " : Parents "로 상속을 하였기 때문에 정상적으로 Parents 클래스 내부의 함수를 사용할 수 있다.
오버라이딩을 통해 부모 클래스의 함수를 재정의 할 수 있다.
같은 내용의 함수지만 오버라이딩을 사용하면 추가만 하여도 더욱 완성도 있는 함수, 다향성을 만들 수 있다.
1. // 부모 클래스
2. class Parents {
3. var math: Int = 0
4. var english: Int = 0
5. func grade() {
6. let grade = math + english
7. print("두 과목의 점수 합은 = \(grade)")
8. }
9. init(math: Int, english: Int) {
10. self.math = math
11. self.english = english
12. }
13. }
14. // 자식 클래스
15. class Children: Parents {
16. var korean: Int = 0
17. override func grade() {
18. let grade = math + english + korean
19. print("세 과목의 점수 합은 = \(grade)")
20. }
21. init(math: Int, english: Int, korean: Int) {
22. super.init(math: math, english: english)
23. self.korean = korean
24. }
25. }
26. // 값 대입 , 함수 호출
27. let child = Children(math: 34, english: 45, korean: 67)
28. // 인스턴스 상수 child를 생성 후 값을 초기화하고
29. child.grade()
30. // child 인스턴스에 grade 메서드를 호출하여 값을 출력한다.
16번째 줄 = korean이라는 변수는 부모 클래스에서 정의, 초기화 되어있지 않아 새롭게 선언한다.
17번째 줄 = override를 사용하여 grade()함수를 재정의 하고 추가적인 내용을 포함한 새로운 구현을 제공한다.
22번째 줄 = 부모 클래스에서 선언된 메서드를 자식클래스 내 호출하기 위해 super.init를 사용하여 선언해준다
이렇게 오버라이딩 하면 함수를 재사용하여 3줄을 추가, 수정하여 코드의 재사용성과 유연성을 높일 수 있다.
overloading은 같은 함수의 이름을 사용하면서 매개변수의 수나 타입만 변경하여 여러가지의 함수를 정의하는 법이다
class Parents {
var math: Int = 0
var english: Int = 0
func grade() {
let grade = math + english
print("두 과목의 점수 합은 = \(grade)")
}
func grade(science: Int) {
let grade = math + english + science
print("세 과목의 점수 합은 = \(grade)")
}
func grade(science: Int, history: Int) {
let grade = math + english + science + history
print("네 과목의 점수 합은 = \(grade)")
}
init(math: Int, english: Int) {
self.math = math
self.english = english
}
}
let student = Parents(math: 80, english: 90)
student.grade()
student.grade(science: 85)
student.grade(science: 85, history: 70)
이렇게 overloading을 하게 되면 grade()라는 한개의 함수로 매개변수를 변경, 추가하여 여러가지의 함수를 만들 수 있다.
추가된 science, history등을 추가하여 출력 할 땐 이미 초기화된 math와 english는 제외하고 선언해준다.
하지만
let student = Parents(math: 80, english: 90) student.grade(science: 85, history: 70)이 부분에서
student.grade(math: 90, science: 85, history: 70)이렇게 사용하게 되면 더 많은 인자를 넣었기 때문에 오류가 나게된다.