맛동산이

스위프트 스터디 12탄) 상속 (Inheritance) 본문

앱/Swift 문법

스위프트 스터디 12탄) 상속 (Inheritance)

진ddang 2023. 7. 9. 02:41

 

스위프트 공식문서를 참조하였습니다.



정의

클래스는 메소드, 프로퍼티와 다른 특징을 가지고 있는데, 이는 다른 클래스로부터 상속을 받을수 있는것이다. 상속받은 프로퍼티에 프로퍼티 옵저버를 설정해서 값 설정에 반응을 해줄수도 있다.

  • single inheritance : 스위프트에서는 단 하나의 부모 클래스만 상속 받을수 있다.

 

정의

import UIKit  class Man{     var age: Int = 1     var weight: Double = 3.5     func display(){         print("나이=\(age), 몸무게 =\(weight)")     }     init(age:Int ,weight:Double){         self.age=age         self.weight=weight     } }  class Student:Man{      }  var kim = Man(age: 30, weight: 95) kim.display() var lee:Student = Student(age: 15, weight: 44.3) lee.display() print(lee.age)

위와 같이 클래스를 생성할때 상속받을 클래스 명을

: 상속

을 통해서 받을수 있다.

 

Super

super은 부모 메서드를 호출할때 사용한다. 예를들어 새로운 함수를 만들때, 부모클래스에 사용했던 초기화 함수나, 혹은 다양한 메소드를 사용할때 super을 이용해 간단히 작성할수 있다.

class Man{     var age: Int = 1     var weight: Double = 3.5     func display(){         print("나이=\(age), 몸무게 =\(weight)")     }     init(age:Int ,weight:Double){         self.age=age         self.weight=weight     } }  class Student:Man{     var name: String = "김소프" 	func displayS(){ 		print("이름=\(name), 나이=\(age), 몸무게=\(weight)") 	} 	init(age: Int, weight: Int, name : String){ 		super.init(age:age,weight:weight) 		self.name=name } 

즉 위의 예제에서는 super = Man 이 되는것이다.

 

오버라이드(override)

오버라이드는 부모 클래스의 매소드를 자식클래스에서 재정의 해주기 위해서 사용하는 문법이다.

부모와 자식의 메소드 사이에서 동일한 이름의 메소드가 존재하는 경우 자식이 만든 메소드를 우선시 한다는 것이다. (부모 클래스의 인스턴스에서 호출하게 되면, 당연하게도 부모클래스의 메소드를 사용한다.)

class Student : Man{ 	var nam : String = "김소프" 	override func display() {  		print("이름=\(name), 나이=\(age), 몸무게=\(weight)") 	}

이렇게

override

라는 실행명을 사용해서 오버라이드를 할수 있다.

 


오버로딩(overloading) vs 오버라이딩(overriding)

매우 중요한 부분이다.

오버로딩(overloading)

오버로딩의 경우에는 동일한 이름의 함수혹은 메소드가 있을때, 매개인자로 받는것을 기준으로 함수와 같은 것을 구분하는 방법을 의미한다.

오버라이딩(overriding)

오버라이딩은 부모와 자식관계에서 동일한 이름의 메서드가 존재할 경우 자식 메소드를 우선시 한다는 것이다.

 


 

call by reference

클래스의 경우에는 구조체와 달리 참조를 한다. 따라서 다음과 같은 현상이 발생한다.

class Man { 	var height : Int 	var weight : Int 	init(height : Int, weight : Int){ 		self.height = height 		self.weight = weight 	 	func tall(){ 		print("height : \(height), weight : \(weight)") 	}  	func minusHeight(){ 		height = height - 10  	} }  var jinyong = Man(height : 160, weight : 65) var jinsu = jinyong jinyong.minusHeight() print(jinsu.tall())  //height: 150, weight : 65

이렇게 된다.

왜 jinyong의 키를 줄였음에도, jinsu의 키가 작게 나온걸까?

답은 참조값을 통해서 값이 변경되기 때문이다.

jinsu는 jinyong과 동일한 Man() 인스턴스를 참조하고 있기 때문에 jinyong의 값을 변경햇음에도 jinsu도 동일하게 변경된것이다. 이를 해결하기 위해서는 새로운 인스턴스를 생성하는게 맞다.

var jinyong = Man(height : 160, weight : 65) var jinsu = Man(height : 150 , weight : 65) jinyong.minusHeight() jinyong.minushHeight() print(jinsu.height) // 150 print(jinyong.height) // 140

Uploaded by

N2T
반응형