iOS 프로그래밍 기초 (6)

[iOS프로그래밍기초(21-2학기)한성현교수님 강의 내용 변형 및 요약]

 

클래스(class or type) 메소드

선언 : class 또는 static 키워드를 앞에 붙여서 선언

호출 : 클래스이름.클래스메소드()

class키워드로 만든 클래스메소드는 자식클래스에서 override 가능

class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
var kim : Man = Man()
kim.display() //인스턴스 메서드는 인스턴스가 호출
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM() //클래스 메서드는 클래스가 호출

 

인스턴스 초기화 : init( )

클래스, 구조체, 열거형 인스턴스가 생성되는 시점에서 해야 할 초기화 작업인스턴스가 만들어질 때 자동 호출designated initializer : 모든 프로퍼티를 초기화시키는 생성자* init()을 하나라도 직접 만들면 눈에 보이지않는 default initializer는 사라짐소멸자 : 인스턴스가 사라질 때 자동 호출, deinit{ }

class Man{
    var age : Int       
    var weight : Double
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(myAge: Int, myWeight : Double){
        age = myAge
        weight = myWeight
    }
}
var shim : Man = Man(myAge:23, myWeight:56)
shim.display() // 나이=23, 몸무게=56.0

 

self

현재 클래스 내 메소드나 프로퍼티를 가리킬 때 앞에 붙이는 키워드

class Man{
    var age : Int       
    var weight : Double
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight : Double){
        self.age = age
        self.weight = weight    // '프로퍼티 = 매개변수'
    }
}

var shim : Man = Man(age:23, weight:56)
shim.display()  // 나이=23, 몸무게=56.0

 

stored(저장) property, computed(계산) property

computed(계산) property는 프로퍼티가 설정되거나 검색되는 시점에서 계산 또는 파생된 값

계산 프로퍼티 안의 메소드 : 값을 리턴하는 getter 메소드, 값을 대입하는 setter 메소드

class Man{
    var age : Int       
    var weight : Double
    var manAge : Int {
        get{                //setter가 없으면 생략가능
            return age-1
        }                   //setter가 없으면 생략가능
        set(newValue){
            age = newValue + 1
        }
    }
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight : Double){
        self.age = age
        self.weight = weight    // '프로퍼티 = 매개변수'
    }
}

var shim : Man = Man(age:23, weight:56)
shim.display()  // 나이=23, 몸무게=56.0
print(shim.manAge)  // 22, getter 호출
shim.manAge = 14    // setter 호출
print(shim.age)     // 15

- setter가 없으면 get{ } 생략 가능하고 var로 선언해야 한다.

- setter의 매개변수명은 newValue가 기본 (다른 매개변수명도 가능)

 

method overloading : 생성자 중첩

매개변수의 개수와 자료형이 다른 같은 이름함수를 여러개 정의

class Man{
    var age : Int = 20  
    var weight : Double = 52.5
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight : Double){    // 생성자1
        self.age = age
        self.weight = weight 
    }
    init(age: Int) {        // 생성자2
        self.age = age
    }
}

var shim : Man = Man(age:23, weight:56) // 생성자1
var shimdu : Man = Man(age:23)  // 생성자2
shim.display()  // 나이=23, 몸무게=56.0
shimdu.display()    // 나이=23, 몸무게=52.5

 

Failable Initializers (실패 가능한 생성자 : init?)

ex) let myImage: UIImage = UIImage(named : "apple.png")!

출처 : https://developer.apple.com/documentation/uikit/uiimage

 

Apple Developer Documentation

 

developer.apple.com

  • apple.png 파일이 없으면 인스턴스를 만들 수 없음 = nil
  • nil값을 저장할 수 있으려면 init 다음에 '?'를 붙여 옵셔널 값이 리턴됨
  • init? 으로 만들어진 인스턴스는 옵셔널형이기 때문에, 사용하려면 옵셔널을 언래핑해야 해서 (ex)줄 마지막에 '!'가 있음
class Man{
    var age : Int
    var weight : Double
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    init?(age: Int, weight : Double){
        if age <= 0 || weight <= 0 {
            return nil
        }
        else {
        self.age = age
        self.weight = weight
        }
    }
}

var shim : Man? = Man(age:23, weight:0) // 옵셔널 형으로 선언
if let shim1 = shim {   // 옵셔널 바인딩
    shim1.display()     //
}

if let shim2 = Man(age:0, weight:58.0){ // 한번에 인스턴스 생성과 옵셔널 바인딩
    shim2.display()     //
}

 

클래스 상속

하위(sub) 클래스 = 자식(child) 클래스 : 상속받은 클래스

상위(super) 클래스 = 부모(parent) 클래스 : 하위 클래스가 상속받은 클래스

* Swift에서는 하위 클래스는 단 하나의 부모 클래스만 상속 가능

class 자식: 부모, 프로토콜1, 프로토콜2 {
}
// 부모가 있으면 부모 다음에 프로토콜을 표기
// 부모가 없으면 바로 표기 가능
  • 상속은 클래스만 가능
  • 클래스, 구조체, 열거형, extension에 프로토콜을 채택할 수 있다.
class Man{
    var age : Int = 20  
    var weight : Double = 56.2
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double){  
        self.age = age
        self.weight = weight 
    }
}

class Child : Man {
    var name : String
    func cDisplay() {
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double, name: String){  
        self.name = name
        super.init(age:age, weight:weight) 
    }
}

var shim : Child = Child(age:23, weight:54, name:"SDY")
shim.display()  // 나이=23, 몸무게=54.0
shim.cDisplay() // 이름=SDY, 나이=23, 몸무게=54.0

 

override : 부모와 자식에 같은 메소드가 있으면 자식 우선

class Man{
    var age : Int = 20  
    var weight : Double = 56.2
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double){  
        self.age = age
        self.weight = weight 
    }
}

class Child : Man {
    var name : String = "SDY"
    override func display() {
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double, name: String){  
        super.init(age:age, weight:weight)
        self.name = name
    }
}

var shim : Child = Child(age:23, weight:54, name:"Shim")
shim.display() // 이름=Shim, 나이=23, 몸무게=54.0
  • Child 클래스의 인스턴스 shim이 display( )를 호출할 때, 자식 클래스가 새로 만든 display( ) 메소드를 우선적으로 호출하게 하려면 Child 클래스의 fun diplay( ) 앞에 override 키워드를 써야 한다.

'Language > Swift 수업' 카테고리의 다른 글

iOS 프로그래밍 기초 (9)  (0) 2021.11.01
iOS 프로그래밍 기초 (7)  (0) 2021.10.15
iOS 프로그래밍 기초 (5)  (0) 2021.10.02
iOS 프로그래밍 기초 (4)  (0) 2021.09.25
iOS 프로그래밍 기초 (3)  (0) 2021.09.17