[Swift] 구조체와 클래스에 대해 알아보자!

zooneon·2020년 11월 5일
0

Swift 기본 문법

목록 보기
3/14

본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.

구조체와 클래스

구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용하다

구조체란?

구조체의 인스턴스는 값 타입이다.

구조체 정의

  • 구조체는 struct 키워드로 정의한다.
struct 구조체 이름 {
	프로퍼티와 메서드들
}

구조체 인스턴스의 생성 및 초기화

  • 구조체 정의를 마친 후, 인스턴스를 생성하고 초기화 할 때는 기본적으로 생성되는 멤버와이즈 이니셜라이저를 사용한다.
  • 구조체를 상수로 선언하면 프로퍼티 값을 변경할 수 없고, 변수로 선언하면 내부의 프로퍼티가 변수로 선언된 경우에 값을 변경할 수 있다.
struct Food {
    var name: String
    var price: Int
 }
 
 var favoriteFood: Food = Food(name: "sushi", price: 10000)
 favoriteFood.name = "pizza"
 favoriteFood.price = 20000
 
 print(favoriteFood.name, favoriteFood.price)   //pizza 20000
 
 let deliciousFood: Food = Food(name: "pasta", price: 20000)
 deliciousFood.name = "steak"   //오류 발생
 deliciousFood.price = 50000    //오류 발생

클래스란?

클래스의 인스턴스는 참조 타입이다.

클래스 정의

  • 클래스를 정의할 때는 class라는 키워드를 사용한다.
class 클래스 이름 {
	프로퍼티와 메서드들
}

클래스 인스턴스의 생성과 초기화

  • 클래스를 정의한 후, 인스턴스를 생성하고 초기화하고자 할 때는 기본적인 이니셜라이저를 사용한다.
  • 클래스의 인스턴스는 참조 타입이므로 인스턴스를 상수로 선언해도 내부 프로퍼티 값을 변경할 수 있다.
class Book {
    var title: String = ""
    var author: String = ""
}

let myBook: Book = Book()
myBook.title = "Harry Potter"
myBook.author = "Joan K. Rowling"

print(myBook.title, myBook.author)  //Harry Potter Joan K. Rowling

클래스 인스턴스의 소멸

  • 클래스의 인스턴스는 참조 타입이므로 더 참조할 필요가 없을 때 메모리에서 해제된다.
  • 인스턴스가 소멸되기 직전에 deinit라는 메서드가 호출된다.
  • deinit 메서드는 클래스당 하나만 구현할 수 있으며, 매개변수와 반환 값을 가질 수 없다.
  • deinit 메서드 안에는 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 넣어준다.
class Book {
    var title: String = ""
    var author: String = ""
    
    deinit {
        print("인스턴스가 소멸됩니다.")
    }
}

var favoriteBook: Book? = Book()
favoriteBook = nil

//인스턴스가 소멸됩니다.

구조체와 클래스의 차이

  • 구조체는 상속할 수 없다.
  • 타입캐스팅은 클래스의 인스턴스에만 허용된다.
  • deinit 메서드는 클래스의 인스턴스에서만 활용할 수 있다.
  • 참조 횟수 계산은 클래스의 인스턴스에만 적용된다.

구조체와 클래스 중 어떤 것을 선택해야할까?

애플은 가이드라인에서 다음 조건 중 하나 이상에 해당한다면 구조체를 사용할 것을 권장하고 있다.

  • 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
  • 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
profile
블로그 이전했습니다. https://blog.zooneon.dev

0개의 댓글