<Swift> Chapt 9. 구조체와 클래스

쑤야·2022년 9월 4일
0

Swift

목록 보기
2/3
구조체클래스
값 타입참조 타입
  • 데이터 타입과 열거형은 모두 값 타입

1. 구조체

struct 구조체 이름 {
	프로퍼티, 메서드
}
  • 구조체 정의 후, 인스턴스를 생성하고 초기화할 때는 기본적으로 생성되는 멤버 와이즈 이니셜라이저 사용
  • 구조체를 상수 let으로 선언할 경우, 인스턴스 내부의 프로퍼티 값 변경 불가능
  • 구조체를 변수 var로 선언할 경우, 내부의 프로퍼티가 var로 선언된 겨우에 값 변경 가능

2. 클래스

class 클래스 이름 : 부모 클래스 이름{
	프로퍼티, 메서드
}
  • 프로퍼티의 기본 값이 지정되어 있는 경우, 전달 인자를 통해 초깃값을 따로 전달해주지 않아도 됨

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

구조체와 다르게 클래스의 인스턴스는 참조 타입이므로 클래스의 인스턴스를 상수 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있음

class Person{
	var height: Float = 0.0
}

let jenny: Person = Person()
jenny.height = 123.4
  • 인스턴스를 생성할 때 let으로 선언할 경우 수정이 가능하다는 뜻이지, 클래스 내부 프로퍼티인 height을 let으로 선언할 경우는 변경 불가능

# 클래스 인스턴스의 소멸

  • 클래스 인스턴스는 참조타입이므로 더는 참조할 필요가 없을 때 메모리에서 해제됨.
  • 소멸되기 직전 deinit 메서드(디이니셜라이즈)가 호출됨.
  • deinit 메서드는 클래스 당 하나만 구현할 수 있으며, 매개변수와 반환 값을 가질 수 없음
  • 보통 deinit 메서드에는 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 넣어줌
    • 인스턴스 소멸 전 데이터를 저장하거나, 다른 객체에 인스턴스 소멸을 알려야 할 때 구현

3. 구조체와 클래스 차이

  • 구조체는 상속 불가능
  • 타입캐스팅은 클래스의 인스턴스에만 허용
  • 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있음
  • 참조 횟수 계산은 클래스의 인스턴스에만 적용

# 값 타입과 참조 타입

  • 둘의 가장 큰 차이는 ‘무엇이 전달되느냐’

  • 값 타입의 데이터를 함수의 전달인자로 전달하면 메모리에 전달 인자를 위한 인스턴스가 새로 생성

  • 생성된 새 인스터스에는 전달하려는 값이 복사되어 들어감

  • Swift의 기본 데이터 타입은 모두 값 타입으로, 전달인자를 통해 데이터를 전달하면 모두 값이 복사되어 전달됨

    • 즉, 함수 내부에서 전달된 값을 변경해도 기존의 변수나 상수에는 영향을 미치지 못함
  • 참조 타입이 전달인자로 전달될 때는 값을 복사하지 않고 주소(참조)가 전달

  • 참조 타입의 데이터는 전달인자로 전달할 때 기존 인스턴스의 참조를 전달하므로 새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달

  • 클래스의 인스턴스끼리 참조가 같은지 확인할 때는 식별 연산자를 사용함

ssooya === friend
ssooya !== friend

4. 구조체와 클래스 선택해서 사용하기

아래 조건 중 하나 이상에 해당할 경우, 구조체를 사용하면 됨

  1. 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
  2. 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
  3. 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
  4. 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
profile
CE 20

0개의 댓글