[Swift] class

수진·2024년 3월 9일

Swift

목록 보기
3/3
post-thumbnail

Class

  • 클래스를 만들기 위해서는 클래스 이름과 함께 class 키워드를 사용
  • 메서드와 함수도 선언
  • new라는 키워드가 없다.

초기화자(생성자)

  • init 키워드 사용
class NamedShape {
	var numberOfSides: Int = 0 // nonoptional이나 초기화를 함
    var name: String           // nonoptional이나 초기화를 하지 않음
    
    init(name: String) {
    	self.name = name // 여기서 반드시 초기화 하여야 함, nonoptional
    }
    func simpleDescription() -> String {
    	return "A shape with \(numberOfSides) sides."
    }
}

파괴자

  • deinit 키워드 사용

override

  • override 키워드를 이용해 표시해줘야 함
  • 상위 클래스의 생성자를 호출 시에는 반드시 현재 클래스의 멤버를 초기화 한 후에 호출하여야 함
class Square: NamedShape { // 상속, 자바에서 extends와 동일
    var sideLength: Double
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name) // 이 함수의 호출 위치가 중요
        numberOfSides = 4
    }
    
    func area() -> Double {
        return sideLength * sideLength
    }
    
    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

getter/setter

  • 저장되어 있는 간단한 속성 외에도 속성은 getter와 setter를 가질 수 있음
var perimeter: Double { // perimeter을 연산 프로퍼티라고 함(computed properties)
	get {
    	return 3.0 * sideLength
    }
    set {
    	sideLength = newValue / 3.0
    }
}
// perimeter에는 값을 저장할 수 없음

열거형

  • enum 키워드를 사용하면 열거형을 만들 수 있음
  • 클래스나 모든 알려진 타입들의 경우 열거형에 메서드를 포함할 수 있음
  • 실제 값이 의미 있는 경우가 아니라면 굳이 첫번째 값을 제공할 필요 없음(기본값으로 0, 1, 2, ... 부여)

Struct

  • 메서드나 이니셜라이저 같은 클래스와 비슷한 기능들을 지원
  • 클래스와 구조체의 가장 중요한 차이점은 구조체의 경우 코드 내에서 전달될 때 값 복사 형태로 전달되지만 클래스의 경우에는 참조 복사 형태로 전달

Protocol

  • 자바에서 interface와 같음
  • 메소드 외 프로퍼티도 가능
  • {get} -> 하위 클래스 구조체에서 var, let을 모두 할 수 있음
  • {get set} -> 하위 클래스 구조체에서 var만 모두 할 수 있음

Extenstion

  • 기존의 타입들에 새로운 메서드나 속성들을 추가할 수 있음
  • 기존 존재하는 기능을 재정의 할 수 없음
  • 연산 프로퍼티, 메소드, 이니셜라이저 등을 추가할 수 있음
  • 저장 프로퍼티는 추가 불가(static 저장 프로퍼티는 가능): 필요하다면 상속받아서 해야 함

옵셔널

  • 어떤 변수는 컴파일 순간에 값이 정해지지 않는 경우가 있다. 이 변수를 Optional 변수라고 함
  • 변수/상수 선언의 3가지
    - 일반: nil 제외 일반 값 저장
    - Optional: 일반 값과 nil 저장
    - Implicit Unwrapping Optional: 일시적으로 nil을 가질 수 있으나 read 되기 전에 반드시 일반 값이 저장되어야 한다. 아니면 죽음
  • Forced Unwrapping(강제 언래핑)
    - Optional 변수의 값을 일반 변수의 값으로 변환
    - 문법: 변수!
    - 변수의 값이 nil이 아니면 일반값으로 변환되나, 변수의 값이 nil이면 프로그램이 죽음

Optional Binding

  • If Statements and Forced Unwrapping을 합친 것
if let constantName = someOptional {
	statements // 여기서 constantName 변수는 이 블록 {} 내에서만 유효하다

Mutiple optional binding

  • If 문 안에서 comma로 분리하여 여러 개를 binding 할 수 있음

guard

  • 옵셔널 바인딩 중 하나라도 nil이면 else로 빠져나옴
  • 반드시 함수 안에서 사용해야 함

Optional Chaining

  • 옵셔널 체이닝은 옵셔널 변수를 사용하여 하위 프로퍼티, 메소드, 서브스크립트 등을 액세스할 때 옵셔널 변수가 nil인 경우 하위 프로퍼티, 메소드, 서브스크립트 등의 액세스 없이 결과를 nil로 함

체이닝의 다중 레벨 연결

  • 여러 레벨로 옵셔널 체이닝이 적용되는 경우
  • xxx?.yyy?.zzzz? : 이 경우 xxx, yyy, zzz 중 하나라도 nil이면 전체 결과가 nildlek

0개의 댓글