iOS의 Overloading VS Overring

김제형·2024년 10월 14일

이 글을 쓰는 목적은 이제 막 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

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 메서드를 호출하여 값을 출력한다.
  1. 16번째 줄 = korean이라는 변수는 부모 클래스에서 정의, 초기화 되어있지 않아 새롭게 선언한다.

  2. 17번째 줄 = override를 사용하여 grade()함수를 재정의 하고 추가적인 내용을 포함한 새로운 구현을 제공한다.

  3. 22번째 줄 = 부모 클래스에서 선언된 메서드를 자식클래스 내 호출하기 위해 super.init를 사용하여 선언해준다

이렇게 오버라이딩 하면 함수를 재사용하여 3줄을 추가, 수정하여 코드의 재사용성과 유연성을 높일 수 있다.

overloading

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)

이렇게 사용하게 되면 더 많은 인자를 넣었기 때문에 오류가 나게된다.

profile
개발자 지망생

0개의 댓글