32YB SOPT/swift 문법 스터디

[SOPT] 야우쓰_7주차 (메소드, 상속)

신_이나 2023. 6. 18. 23:57

 

 

야우쓰란? "야 우리도 스위프트 할 수 있어"

in SOPT iOS

 

 

 

 

 

 

 

 

7주차의 키워드는 메소드와 상속이다. 

 

 

 

- 메소드

 

 메소드부터 알아봐야겠죠? 메소드란 특정 타입의 클래스, 구조체, 열거형과 관련된 함수를 메소드라고 한다. 저번 시간에 공부한 프로퍼티가 "값"이라면 메소드는 "함수"를 의미한다.

 

 

1. 인스턴스메소드와  타입 메소드

 인스턴스 메소드는 말 그대로 인스턴스에 속한 메소드다. 매소드를 통해 인스턴스 내의 값을 제어하거나 변경할 수 있다. 자주 쓰는 self 가 그 예시다.

 

//아래와 같이 클래스를 선언한 뒤 인스턴스 메소드를 사용할 수 있다.
class Jiwon {
	var shin = 0
    
    func Pretty() {
     	shin += 1
     }
     
     func Gorgeous() {
     	shin += 2
     }
     
     func reset() {
     	shin = 0
     }
}

//이렇게!
let jiwon = Jiwon()
jiwon.Pretty()
jiwon.Gorgeous()
jiwon.reset()

예시로 언급하였듯, self 인스턴스 프로퍼티가 대표적인 예인데, 본인 스스로를 가리키는 것으로 파라미터와 프로퍼티의 모호함을 명확하게 해줄 수 있다.

 

타입메소드는 특정 타입의 인스턴스에서 호출되는 인스턴스 메소드와 달리, 특정 타입 자체에서 호출되는 메소드다. 호출 방법은 func 앞에 static, class 의 키워드를 추가하면 된다. 

//아래와 같이 클래스를 선언한 뒤 타입 메소드를 사용할 수 있다.
class Jiwon {
	var shin = 0
    
    func Pretty() {
     	shin += 1
     }
     
     func Gorgeous() {
     	shin += 2
     }
     
     func reset() {
     	shin = 0
     }
}

//이렇게!
Jiwon.Pretty()
Jiwon.Gorgeous()
Jiwon.reset()

 

딱봐도 인스턴스 메소드와 타입 메소드가 다른 것이 보인다! 우왕 신기해~

 

 

Q1. 해당 코드에서 왜 에러가 나는지 분석하고 어떻게 해결할 수 있을지 고민해보세요!

 

struct Sopt {
    var name: String = "누구누구"
    
    init(name: String) {
        self.name = name
    }

    func changeName() { // Cannot assign to property: 'self' is immutable
        name = "희재"
    }
}

let hidi: Sopt = .init(name: "희디")
hidi.changeName()

A1. 

mutating 메소드 내에서 self 를 할당하지 않았기 때문이다. 값 타임 메소드에서 인스턴스 메서드를 통해 값을 변경하고 싶을 때 사용할 수 있는 것이 바로 mutating 이다. 위는 func 안에서 name 이라는 값을 변경하고자 하기 때문에, mutating 을 사용하면 해결할 수 있다.

++ 그리고 이제 hidi 값이 let 으로 설정되어 있어 값이 변하지 않기 때문에 이도 var 로 바꿔주어야 한다.

struct Sopt {
    var name: String = "누구누구"
    
    init(name: String) {
        self.name = name
    }

    mutating func changeName() { // Cannot assign to property: 'self' is immutable
        name = "희재"
    }
}

var hidi: Sopt = .init(name: "희디")
hidi.changeName()

 

 

-상속

컴퓨터언어 는 정말 상속의 언어라고 생각하는데 ,,, 아무튼 시작해보자. 상속은 CLASS 에서만 가능하다. 저장된 프로퍼티와 계산된 프로퍼티와 상관없이 상속받은 프로퍼티에 프로퍼티 옵저버를 설정해서 값 설정에 반응할 수 있다. ,,, 라는 것이 공식 문서고 우선 보기나 하자

 

기반클래스

다른 어떤 클래스로부터 상속받지 않은 클래스

 

서브클래싱 = 상속

부모로 부터 성격을 상속받을 수 있음

class babyclass : momclass {
}

이런 느낌 ,,, 

 

오바라이딩

부모클래스에서 상속받은 성격을 재정의 하는 것. 재정의 하고 싶을 때는 앞에 override 로 적어주면 된다. (이제야 이 뜻을 알았다)

 

상속 끝 = final

final 붙인 class 는 더이상 상속할 수 없어요!

 

 

2. 구조체와 열거형의 상속

 

상속은 CLASS 에서만 가능하다. 따라서 구조체와 열거형에서 상속 불가능하다. 근데 왜?

이건 같이 이야기해보자 !

 

 

Q2. 저번 주에 만든 SOPT 구조체/클래스에 더 추가해봅시다.

  • 조체를 클래스로 바꿔주세요! (상속을 위해서)
  • 자기소개를 하는 인스턴스 메소드를 작성해주세요
  • ex) 안녕하세요~ 저는 몇살 어디파트 누구입니다~
  • 솝트 멤버 클래스를 상속받는 솝트 파트장 클래스를 만들어주세요!
  • super 키워드 활용해서 자기소개 메소드를 오버라이딩 해주세요 ex) 원래 자기소개 + “그리고 저는 어디파트~ 파트장입니다”
  • 간단하게 파트장과 관련된 프로퍼티 추가해주세요! ex) 별명, 인스타 아이디..등

A2. 

//
//  main.swift
//  3week
//
//  Created by 신지원 on 2023/05/09.
//

import Foundation

class GoSOPT { //모두  initializer 해줘야 함
    var name : String = ""
    var part : String = ""
    var age : Int = 24 {
        willSet {
            print("현재 \(age)살이지만 6월부터 \(newValue)살이 될 예정입니다.\n")
        }
    }
    var haveMac : Bool = true
    
    func Print(){
        print("제 이름은 무려 \(self.name) 입니다. 파트는 \(self.part) 이며, 당연히 맥북 가지고있다? \(self.haveMac) 입니다!")
    }
    
    func introduce() -> String {
        var start = "안녕하세요. 이름은 \(self.name) 이고 나이는 \(self.age) 살입니다. 하하 \n파트는 당연히 \(part) 아니겠어요? 하하 \n그럼 이만"
        return start
    }
}

class partleader : GoSOPT {
    override  var name : String {
        get {
            return "김승찬"
        }
        set {
        }
    }
    
    override var part: String {
        get {
            return "iOS"
        }
        set {
        }
    }
    
    override var age: Int {
        get {
            return 999
        }
        set {
        }
    }
    
    override var haveMac: Bool {
        get {
            return true
        }
        set {
        }
    }
}

print(partleader().introduce())