iOS_Swift/문법 정리
swift - 클래스, 구조체, 열거형 비교
chozjjae
2022. 5. 12. 12:00
클래스, 구조체, 열거형에 대한 비교
클래스(class)와 구조체(structure)의 공통점
- 프로퍼티(property)를 정의할 수 있다.
- 메서드를 정의할 수 있다.
- 초기 상태 설정을 위한 초기화 함수(initializer)를 정의할 수 있다.
- extension으로 문법을 간단하게 정리하거나 기능을 추가할 수 있다.
- extension Double{ }
- protocol을 이용하여 상속이 아닌 채택 받아올 수 있다.
- class Man : Runnable{ }
- [ ]을 사용하여 첨자(subscript) 문법으로 내부의 값을 액세스 할 수 있는 첨자를 정의할 수 있다.
- 클래스, 구조체, 열거형이 컬렉션 멤버에 접근하기 위한 문법
클래스(class)와 구조체(structure)의 차이점
클래스(class)
- 참조 타입이다.
- 상속이 가능하다.
- 타입 캐스팅 (is), (as, as?, as! -> 형 변환)을 통해 실행 시점에 클래스 인스턴스의 타입을 검사하고 해석할 수 있다.
- deinitializer(deinit{ })로 사용한 자원을 반환할 수 있다.
- 참조 카운팅을 통해 클래스 인스턴스를 여러곳에서 참조(사용) 가능하다.
구조체(structure)
- 값 타입이다.
- initializer을 따로 작성하지 않아도 자동으로 생성된다.
- 대부분의 기본 자료형은 구조체이다.
정의하기(사용예시)
클래스 - 참조 타입 (reference type)
- class 이름 { ... }
- 참조 타입은 복사할 때 주소를 복사한다.
- 따라서 하나의 값을 변경하면 모든 값의 주소들이 따라가게 된다.
구조체 - 값 타입 (value type)
- struct 이름 { ... }
- 값 타입으로 복사할 때 새로운 데이터가 하나 더 생긴다.
struct Human{
var age : Int = 1
}
var kim = Human()
var lee = kim //값 타입으로 들어간다.
print(kim.age,lee.age) //1,1
lee.age = 20
print(kim.age,lee.age) //1,20
//값 타입은 복사할 때 새로운 데이터가 하나 더 생긴다.
//--------------------------------------------------------------
class man{
var height : Int = 100
}
var cho = man()
var jjae = cho
print(cho.height,jjae.height) //100, 100
jjae.height = 300
print(cho.height,jjae.height) // 300, 300
//참조 타입은 복사할 때 주소를 복사한다.
//한 데이터의 reference가 2개 생긴다.
클래스(class)와 구조체(structure)의 사용 용도
클래스 - 참조 타입(reference type)
- 상속이 필요한 경우에 사용한다.
구조체 - 값 타입(value type)
- 간단한 데이터 값들을 한데 묶어서 사용하는 경우에 사용한다.
- 전체 덩어리 크기가 작은 경우, 복사를 통해 전달해도 좋은 경우 사용한다.
- 멀티 쓰레드 환경에 사용한다. (멀티 쓰레드 환경에서는 구조체가 더 안전하다.)
- 상속할 필요가 없는경우 사용한다.
- 예시 : 너비, 높이를 표현하는 기하학적 모양을 처리하는 경우
- 시작값, 증분, 길이 등으로 순열을 표현 할 경우
- 3차원 좌표 시스템의 각 좌표를 표현 할 경우
인덕대학교 한성현 교수님의 강의를 참고하였습니다.
youtube - smile Han