[Swift] 구조체, enum

김영민·2022년 5월 24일
0

구조체

  • struct
  • 구조체 안에 프로퍼티와 메소드 사용 가능
  • 구조체 내부의 프로퍼티를 자동으로 초기화하는 객체를 생성할 수 있다는 특징이 있습니다!

자동 초기화 코드

struct Point {
	var x: Int
    var y: Int
}

var obj = Point(x:10,y:10) // 프로퍼티 자동 초기화

initializer 작성 코드

struct Point {
	var x : Int
    var y : Int
    init() {
    	self.x = 0
        self.y = 0
    }
}

var obj2 = Point() // 자동 초기화 이니셜라이저 사용 불가.

구조체 초기화

  • Initializer 없이 프로퍼티 초기화 가능
  • 구조체의 경우 상속이 없으므로 부모 클래스로 초기화 위임 없음 (super 필요 없음)
  • 구조체의 Convenience Initializer : convenience 키워드 생략, Initializer delegation 작성
struct MyStruct {
	var value : Int
    
    //designated initializer
    init(v: Int) {
    	self.value = v
    }
    
    //convenience initializer
    init() {
    	self.init(v:0)
    }
}

Mutating

  • 구조체의 프로퍼티 수정
    : 초기화 메소드에서 설정 가능
    : 구조체 외부에서 설정 가능
    : 구조체 내부에서 설정에서는 불가능합니다. -> mutating 사용으로 가능
struct Point {
	var x : Int = 0
    var y : Int = 0
    
    mutating func moveTo(x:Int,y: Int) {
    	self.x = x
        self.y = y
    }
}

다른 구조체 타입 : Array

  • 배열 내용 유지 - 새로운 배열 생성 : map, reverse, filter
  • 배열 내용 변경 API - insert, remove (mutating 메소드 사용)

정적 메소드

  • static 키워드
  • 정적 저장, 정적 계산 프로퍼티
  • 클래스와 동일한 방식으로 사용

클래스와 구조체

  • 공통점
    : 프로퍼티와 메소드
    : 초기화
  • 구조체에는 없고, 클래스에 있는 것
    : 상속과 재정의
    : ARC
  • 클래스 : 레퍼런스 타입
  • 구조체 : 밸류 타입

클래스 객체 대입

class MyClass {
	var value = 0
}
let obj1 = MyClass()
let obj2 = obj1 //reference count 1 증가

obj1.value = 10
obj2.value // 10

클래스는 객체 참조를 추가합니다.
따라서 객체를 공유합니다.

구조체 객체 대입

struct MyStructure {
	var value = 0
}
let obj1 = MyStructure()
let obj2 = obj1 //구조체를 복사

obj1.value = 10
obj2.value //0

클래스는 객체를 복사합니다.
따라서 객체를 공유하지 않습니다.


enum

  • 열거형
  • 원소 중 하나의 값 사용
enum Day {
	case am
    case pm
}

var now = Day.am

switch now {
	case .am :
    print("오전")
    case .pm :
    print("오후")
}

: 타입 정보가 있으면 Enum 이름 생략 가능

enum 원소 타입

  • Int 타입 원소 값 설정 생략 가능
enum Pet : Int {
case cat = 0, dog, other //dog = 1, other = 2
}
  • 그 외 값 설정 생략 불가능
enum Device : String {
	case phone = "휴대폰", pad = "패드"
}

Enum의 계산 프로퍼티와 메소드

  • enum 안에 계산 프로퍼티와 메소드를 사용할 수 있습니다.
    enum Pet {
       case cat,dog
       
       var name : String {
           switch self {
           case .cat:
               return "냥이"
           case .dog:
               return "강아지"
           }
       }
       
       func des() -> String {
           return self.name
       }
    }

var cat = Pet.cat

cat.name //냥이

cat.des() //냥이

0개의 댓글