[Swift] 클래스와 구조체

ds-k.mo·2022년 4월 29일
0

Swift

목록 보기
6/22

클래스와 구조체

프로그램의 코드를 추상화 하기 위해 사용
property와 method를 이용해 구조화된 데이터와 기능을 가질 수 있음

공통점

  • 프로퍼티와 메소드를 사용하여 구조화된 데이터와 기능을 가짐
  • 새로운 사용자 정의 타입을 만들어줌
  • 초기화(Init)를 통해 초기 상태를 설정할 수 있음
  • 확장할 수 있음
  • 프로토콜 사용이 가능
  • 특정 값에 접근할 수 있는 서브스크립트 문법 사용 가능

차이점

  1. 클래스
  • 참조 타입
  • 할당 또는 파라미터 전달 시에 객체를 가리키고 있는 메모리의 주소 값이 복사
  • Heap Memory에 저장되어 속도가 느리다.
  • 상속이 가능
  1. 구조체
  • 값 타입
  • 할당 또는 파라미터 전달 시 value copy가 일어남
  • Stack Memory에 저장되어 속도가 빠르다.
  • 상속이 불가능

언제 구조체를 사용해야 할까?

  • 연관된 값들의 집합을 캡슐화하는 것이 목적일 경우
  • 캡슐화된 값을 참조하는 것보다 복사하는 것이 좋을 때
  • 상속이 필요하지 않을때
    등등...

초기화 init

클래스 구조체 또는 열거형의 인스턴스를 사용하기 위한 준비 과정

// init
/*
 init(매개변수: 타입, ...) {
    // 프로퍼티 초기화
    // 인스턴스 생성시 필요한 설정을 해주는 코드 작성
 }
 */
 

class Member {
    var nickname:String
    var age: Int
    
    init(nickname: String, age: Int) {
        self.nickname = nickname
        self.age = age
    }
    
    init(age: Int){
        self.nickname = "self"
        self.age = age
    }
    
    // 인스턴스가 메모리에서 해제될 때 실행, !! 클래스에서만 가능
    deinit {
        print("deinit member")
    }
    
}

var member = Member(nickname: "DK", age: 30)
member.nickname // "DK"
member.age // 30

var member2 = Member(age: 50) // Member
member2.nickname // "self"
member2.age = 50

// member를 메모리에서 해제시키는 과정, member3가 nil이 될수 있으므로 옵셔널 타입으로 지정
var member3: Member? = Member(age:23)
member3 = nil // In console : deinit member

0개의 댓글