Swift

Class 와 Struct 2

골드애플소다 2023. 2. 22. 16:38

클래스 VS 스트럭트

 

공통점

  • 값을 저장하기 위한 프로퍼티 정의
  • 기능을 제공하기 위한 메서드 정의
  • subscpript 문법을 이용해 특정 값을 접근할 수 있는 subscript정의
  • 초기 상태를 설정할 수 있는 initializer정의
  • 기본 구현에서 기능 확징
  • 특정한 종류의 표준 기능을 제공하기 위한 포로토콜 순응(conform)

차이점

Class

  • 상속(inheritance) : 클래스의 여러 속성을 다른 클래스에 물려줌
  • 타입 캐스팅(Type castiong) : 런타임에 클래스 인스턴스의 타입을 확인
  • 소멸자(Deinitializers) : 할당된 자원을 해제(free up) 시킴
  • 참조 카운트(Reference counting) : 클래스 인스턴스에 하나 이상의 참조가 가능

Struct

  • 구조체는 다른 코드로 전달될 때 항상 복사돼서 전달되고, 참조 카운트(Reference counting)를 사용하지 않는다.

 

———————————————————————————————————————————————————————

새로운 클래스나 구조체를 선언할 때마다 Swift에서 정말 새로운 탑입을 선언하는 것이다.

그래서 이름을 UpperCamelCase 이름으로 선언한다.

반대로 프로퍼티나 메서드는 lowerCamelCase로 선언한다.———————————————————————————————————————————————————————

 

이 두 가지를 알려면 모델이란 개념을 알아야 한다

변수와 상수의 차이점은

변수는 변경이 가능하고

상수는 변경이 불가하다

 

그 공간에 값을 하나씩 담는데

이것을 덩어리로 뭉쳐서 담아두는 것을 모델이라고 한다

 

데이터를 담는 변수하나하나를 덩어리로 묶었다는 것

 

Class는 하나의 주소를 통해서 소통한다
한 마리도 변수를 통해서 주소를 넘겨주면서 하나의 주소로 고정되어
값이 변경되면 클래스 내부의 같은 주소를 사용하고 있는 값 모두 변경된다

 

하지만 Struct는 해당 주소의 값만 넘겨주기 때문에

해당값을 받아들이는 변수는 새로운 주소를 할당받고 값만 복사해 오기 때문에

값이 변경될 경우 원래 초기의 변숫값 다른 주소에 저장되어있기 때문에

변경되지 않고 해당 값만 변경이 된다

 

———————————————————————————————————————————————————————

선언

선언 방법은 위와 같다

 

 

인스턴스화

Class와 Struct를 인스턴스화시켜주기 위해서는 위와 같이 이름뒤에 괄호를 적으면 된다.

 

 

프로퍼티 접근

점(dot) 문법을 통해 클래스/구조체 인스턴스의 프로퍼티에 접근할 수 있다.

 

출력값

 

하위 레벨의 프로퍼티에도 접근이 가능하다.

Class에서 Struct를 인스턴스화한 뒤에 Struct의 프로퍼티에 접근을 할 수 있다

 

결괏값

왜인지 Struct에서 Class를 인스턴스화한 뒤 Class의 프로퍼티에 접근을 해보았지만 Xcode가 멈추는 문제가 있었다….ㅠㅠ

 

 

또한 인스턴스의 점(dot) 문법을 통해서 프로퍼티의 값을 변경해 줄수도 있다.

결괏값

 

여기서 한 가지 신기한 걸 발견했다

바로 Struct의 프로퍼티를 변경할 때 에러가 발생한 것이었다

이유는 let(상수)으로 인스턴스화를 시켜준 것이 문제였는데 

그렇다면 Class는 왜 에러가 발생하지 않는 거지?라는 궁금증이 생긴다

 

그 이유는 Class참조타입이고

Struct값 타입이기 때문이다.

무슨 얘기냐 하면

위처럼 해당 인스턴스를 그대로 출력하게 된다면

Struct는 해당 Struct의 이름과 내부의 프로퍼티까지 가지고 있는 걸 볼 수 있다

하지만 Class는 이상한 글씨는 출력한다 저것이 뭐냐 하면 주소 값이다

상수는 변경되지 않는 값이다. 메모리에 저장된 값이 변경되면 안 된다는 것이다.

위에는 메모리에 등록된 값을 예로 든 것인데 보다시피 보이는 값만 변경이 안된다는 것이지

Class의 내부의 프로퍼티가 변경된다 하더라고 메모리에 저장된 값이 변경되는 것이 아니기 때문에

충분히 변경이 가능하다

 

하지만 Struct의 경우에는 내부에 프로퍼티 값이  0이란 것까지 메모리에 저장되어 있으니

당연하게도 해당 값을 변경할 수 없는 것이다.

 

그래서 Class도 이렇게 메모리에 저장된 주소값에 영향을 주는 행동을 했을 경우에는 let(상수) 이기 때문에 당연히 에러가 발생한다.

 

물론 이것도 var 바꿔주면 사용 가능하다.