Swift는 클래스나 구조체를 사용시에 다른 언어들과는 다르게 interface나 implementation을 요구하지 않는다는 편리성을 제공하여 줍니다.
- 클래스와 구조체의 공통점
- 프로퍼티를 설정하여 값들을 저장
- 메소드를 정의하여 기능추가
- Subscript를 정의하여 subscript syntax를 사용 가능
- 이니셜라이저를 정의하여 초기값 설정 가능
- 초기 implementation을 통해 기능을 확장 가능
- 프로토콜을 준수하여 특정 값들의 기능 제공
2. 클래스와 구조체의 차이점

- 상속 여부

A와 B라는 클래스를 생성하고, A에는 sayHello라는 함수를 생성하였습니다.
C라는 클래스는 A 클래스를 상속하게 하였고, c라는 클래스 인스턴스를 만들었습니다. 이때,

c라는 클래스 인스턴스에서 A클래스의 sayHello를 접근 가능합니다.
즉 클래스는 상속이 가능하다. (주의점: 다중 상속은 X (불가합니다) )
아래 이미지를 보시면, 구조체는 상속이 불가능합니다.

- 참조 타입(Reference Type)과 값 타입(Value Type)의 차이점

— 참조타입의 클래스(Class)
SuperHero라는 클래스를 생성해주었고 그에 따른 이니셜라이저 생성을 해 주었습니다.

후에 superHero2라는 SuperHero 클래스 인스턴스를 생성해 주었고, ironMan의 값에는 “R.D.J”, superMan의 값에는 “Spider!” 라는 값을 초기화 해주었습니다.
이에따른 superHero2.ironMan값은 “R.D.J”라고 출력이 됩니다.
만약, superHero2의 값을 새로운 변수값에 설정하여 ironMan 변수 값을 바꾼다면 어떻게 될까요?

새로운 superHero3객체를 생성하였고 이에 superHero2값을 설정해주었습니다.
그 후에 superHero3의 iroMan값을 “Robert Downey, Jr”라고 설정해주었고, 그 후에 superHero2의 ironMan값을 호출하여 보니 “Robert Downey, Jr”와 같이 바뀐값이 출력됩니다.
이것이 참조 타입의 특성입니다.
**class 객체 인스턴스들은 heap이라고 불리우는 메모리에 저장되어지는데, C, C++ 또는 Objective-C와 같은 포인터의 원리와 비슷하게 저장이 되어진다. 같은 포인터가 가리키고 있는 객체의 값을 참조 하고 그 값이 바뀌면 참조하고 있는 값이 바뀌기 때문에 참조값이 바뀐다.
(하지만 C, C++, Objective-C와 같이 직접적인 포인터의 개념이라기 보다는 참조를 한다 라는 개념으로 접근해야한다)**
— 값타입인 구조체(Structure)

Animal이란 구조체를 생성해주었고 name과 age라는 변수를 생성해주었습니다. (구조체 특성상 이니셜라이저가 필요없습니다)
animal2라는 객체를 생성해 주었고 name의 값은 “Dog”, dog의 값은 10으로 초기화해주었습니다.
이때 animal2.name의 값을 호출하면 “Dog”라고 호출됩니다.
여기서 클래스 예시와 같이

animal3의 객체를 생성하였고 이 객체에 animal2의 값을 셋팅 주었습니다.
여기서 주의깊게 보아야할 점은 animal3.name의 값을 “Cat”이라 바꾸었을때, 클래스와 같이 animal2.name의 값을 호출하였을 때 “Cat”이라고 출력되지 않고, “Dog”라고 출력 된다는 점 입니다.
이게 구조체의 값 타입 특징입니다.
클래스와 같이 값을 “참조” 하지 않고 “복사” 합니다. 클래스와 같이 포인터의 개념으로 참조 하지 않기때문입니다.
정리를 해보자면,
클래스는 참조타입으로 힙 메모리에 포인터개념과 같이 저장되어있는 값을 참조하기때문에, 그 참조하는 값이 바뀌면 그를 참조하고있는 모든 값들이 바뀌게 됩니다.
반면에 구조체는 값 타입으로 해당 구조체의 값을 복사를 하게 됩니다.
- 타입캐스팅 체크 여부 (Identity Operators)
클래스는 참조 타입이기에 다양한 변수나 상수들이 같은 하나의 인스턴스를 참조 할 수 있습니다. (구조체나 열거형은 값타입인 특징에 따라 값을 복사하기에 불가능)
이에 따라 클래스의 변수나 상수는 같은 인스턴스를 참조하는 지 확인할 수 있습니다. 이는 스위프트에서 제공하는 identity operator를 사용하여야 하는데,
값이 같다면: (===)
값이 다르다면: (!==)
연산자를 사용합니다.

이와 같이 a1 인스턴스가 a2인스턴스 타입과 같다면
Referring same instance라고 출력됩니다.