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