점진적 과부하 개발 블로그

Swift 문법 정리 2 본문

Swift/문법

Swift 문법 정리 2

지용빡 2022. 1. 7. 02:06
반응형
computed property(계산 프로퍼티)
  • property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값 
  • 값을 리턴하는 게터(getter) 메서드
  • 값을 대입하는 세터(setter) 메서드
import Foundation

class Human {
    var age: Int = 20 // stored property
    var weight: Double = 70 // stored property
    var manAge: Int { // 메서드 같지만 computed property이다.
        get{
            return age-1
        }
        set(USAAge) {
            age = USAAge + 1
        }
    }
    func display() {
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double) {
        self.age = age
        self.weight = weight
    }
}
var park = Human(age: 24, weight: 70)
park.display()
print(park.manAge)
print(park.age)
park.manAge = 5 // setter 호출
print(park.age)
method overloading : 생성자 중첩
  • 매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러 개 정의
  • 매개변수가 다른 두 생성자를 통해 두 가지 방법으로 인스턴스를 만들 수 있다. 
import Foundation

class Human {
    var age: Int = 20 // stored property
    var weight: Double = 70 // stored property
    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 park = Human(age: 24, weight: 70)
var park1 = Human(age: 30)
park.display()
park1.display()
Failable Initializer
  • 실패 가능한 이니셜라이저, 실패하면 nil을 반환해준다. 그렇게 때문에? 옵셔널 타입으로 지정해 준다.
import Foundation

class Human {
    var age: Int = 20 // stored property
    var weight: Double = 70 // stored property
    func display() {
        print("나이=\(age), 몸무게=\(weight)")
    }
    init?(age: Int, weight: Double) {
        if age <= 0 {
            return nil
        }
        else {
            self.age = age
        }
        self.weight = weight
    } // failable initialize
}
failable initializer가 있는 클래스의 인스턴스 생성
var park = Human(age: 24, weight: 70)
park?.display() // 옵셔널 형으로 선언

if let park1 = park { // 1-2 옵셔널 바인딩
    park1.display()
}

// 인스턴스 생성과 동시에 옵셔널 바인딩
if let park2 = Human(age: 20, weight: 80) {
    park2.display()
}

// 인스턴스 생성하면서 바로 강제 언래핑
var park3 = Human(age: 30, weight: 90)!
park3.display()

// 옵셔널 인스턴스르 사용시 강제 언래핑
var park4 = Human(age: 40, weight: 100)
park4!.display()
상속
  • 상속된 클래스는 부모클래스의 모든 기능을 상속받으며, 자신만의 기능을 추가한다.
  • 상속받은 클래스들을 하위 클래스(subclass)또는 자식 클래스(child class)
  • 하위 클래스가 상속받은 클래스는 부모 클래스(parent class) 또는 상위 클래스(super class)
  • 상속은 클래스만 가능하다.
  • 단일 상속 (single inheritance)
    • 스위프트에서 하위 클래스는 단 하나의 부모 클래스만 상속받을 수 있다.
/*
 class 클래스 이름: 부모 클래스 이름 {
    //하위 클래스 정의
 */
import Foundation

class Human {
    var age: Int = 20 // stored property
    var weight: Double = 70 // stored property
    func display() {
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double) {
        self.age = age
        self.weight = weight
    }
}

class Student : Human {
    // Human의 모든 것을 가지고 있다.
}

var park = Human(age: 24, weight: 70)
park.display()
var kang = Student(age: 19, weight: 60)
kang.display()
print(kang.age)
override
  • 부모와 자식에 같은 메서드가 있으면 자식 우선
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 = "박지용"
    override func display() {
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight : Double, name : String){
        super.init(age:age, weight:weight)
        self.name = name
    }
}
var Park : Student = Student(age:23,weight:70.0,name:"인덕대")
Park.display() // 이름=인덕대, 나이=23, 몸무게=70.0
extension
  • 스위프트 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가한다.
  • 익스텐션은 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에 메서드, 생성자(initializer), 계산 프로퍼티 등의 기능을 추가하기 위하여 사용한다.
extension 기존타입이름 {
	// 새로운 기능
}

extension Double { // 표준 자료형 Double 구조체에 두 배의 값을 반환하는 프로퍼티를 추가
    var a : Double {
        return self * self
    }
}
let myValue : Double = 3.0
print(myValue.a) // 9.0
print(2.0.a) // 4.0
접근제어(access modifier)
  • 접근 속성(접근 수정자, 액세스 수정자, 액세스 지정자)는 클래스, 메서드, 멤버의 접근 가능성을 설정하는 객체 지향 언어의 키워드
  • 구성 요소를 캡슐화 하는 데 사용한다.
  • 노란색은 언어별 디폴트 접근 속성
public class Example {
	fileprivate var animal : String = "Dog"
    // 현재 소스 파일 내에서만 사용 가능
    private func play() {}
    // 현재 블럭 내에서만 사용 가능
    func display(){}
}

출처: iOS 프로그래밍 기초 한성현 교수님 강의 내용 변형및 요약

반응형

'Swift > 문법' 카테고리의 다른 글

Swift Array(배열) 정리  (0) 2022.02.08
Swift 프로토콜(Protocol)  (0) 2022.01.08
Swift initializer  (0) 2022.01.07
Swift 클래스(class)  (0) 2022.01.06
Swift 클로저(Closure)  (0) 2022.01.06