Swift 기초문법

Swift: 클래스와 구조체의 차이

zoonee 2022. 3. 17. 14:29

 

클래스와 구조체의 공통점

 

  • 값을 저장할 프로퍼티를 선언할 수 있다.
  • 함수적 기능을 하는 메서드를 선언할 수 있다.
  • 내부값에 .(점)을 사용하여 접근할 수 있다.
  • 생성자를 사용해 초기 상태를 설정할 수 있다.
  • extension을 사용하여 기능을 확장할 수 있다.
  • Protocol을 채택하여 기능을 설정할 수 있다.

 

클래스

 

  • 참조 타입
  • ARC로 메모리를 관리
  • 상속이 가능
  • 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
  • deinit을 사용하여 클래스 인스턴스의 메모리 할당을 해제할 수 있다.
  • 같은 클래스 인스턴스를 여러개의 변수에 할당한 뒤 값을 변경시키면 모든 변수에 영향을 준다.(메모리가 복사됨)

 

 

구조체

 

  • 값 타입
  • 구조체 변수를 새로운 변수에 할당할때마다 새로운 구조체가 할당된다.
  • 즉 같은 구조체를 여러개의 변수에 할당한 뒤 값을 변경시키더라도 다른 변수에 영향을 주지 않는다.(값자체를 복사)

 


 

 

클래스 : 참조타입

 

→ 참조타입과 값타입의 차이점을 확인해보자. 위코드는 클래스 참조타입이다. SomeClass 이름을 가지는 class를 선언해주었다. 그리고, 그 안에 인트형 타입을 갖는 count 프로퍼티를 선언하였다. 그 아랫줄은 SomeStruct라는 이름을 가진 구조체를 선언하였다. 그리고 똑같이 이 안에 인트형 타입을 가지는 count타입의 프로퍼티를 선언하였고, 값은 0이다. 

 

클래스는 참조타입이기 때문에 같은 클래스 인스턴스를 여러개의 변수에 할당한 뒤 값을 변경시키면 모든 변수에 영향을 주는지 확인해보자. class1이라는 변수를 선언하여 그 값으로 SomeClass() 인스턴스를 주어 생성하였고, class2, class3 변수를 선언하여 두 변수에는 class1을 할당하였다. 

 

그리고, class3에 카운트를 접근한 뒤 값을 2로 변경시켜주고나서 카운트값이 몇인지 실행해 보았다. class1에 카운트 프로퍼티 값이 2로 변경된 걸 확인 할 수 있다. 이런결과가 나온 이유는 class는 참조타입이기에 같은 클래스의 인스턴스를 할당한 변수의 값을 변경시키면 참조된 인스턴스의 값이 변경된다.  이말은 즉 변수를 복사하더라도 하나의 인스턴스 주소값을 가르키기 때문에 복사본과 원본이 모두 같은값을 같게 된다.

 

 

 

 

 

 

구조체 : 값타입

 

→ 이번은 구조체에 대해 확인해보자. 구조체는 여러개의 변수에 할당한 뒤 값을 변경시키더라도 값자체가 복사되기 때문에 다른값에 영향을 주지 않는다. var struct1 이라는 변수를 선언하고 그 값엔 SomeStruct() 인스턴스를 선언해주었다. var strutc2, struct3를 선언하고 그 값엔 sturct1변수를 할당해주었다. 이제 값을 변경시키기 위해 struct2.count 프로퍼티 값을 3으로 변경시켜주었고, sturct3은 4로 변경시켜 주었다. 그러면 struct1,2,3 인스턴스에 count 프로퍼티 값에 접근해서 어떤값이 저장되는지 확인해보자.

 

실행해보면 보다시피 struct1은 0, struct2는 3, struct3은 4가 저장된걸 확인할 수 있다. class는 같은 클래스의 인스턴스를 할당한 변수를 변경시키면 복사본과 원본이 모두 같은값을 갖게 되었는데 구조체는 다 제각각의 값을 갖게 된다.  이 이유는 구조체는 값타입이라 같은 구조체 인스턴스를 할당하더라도 매번 새로운 메모리가 할당되어 값을 변경하더라도 다른변수에 영향을 주진 않는다.

 

 

 

구조체를 사용하는 것이 유리한 경우

 

  • 연관된 값들의 집합을 캡슐화 하는 것이 목적인 경우
  • 캡슐화된 값을 참조하는 것보다 복사하는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을때
  • JSON 필드와 1:! mapping 되는 간단한 모델이 필요할때

 

 

 

선언하기

 

클래스는 class 키워드를 구조체는 struct 키워드를 이름 앞에 적어서 선언한다.

class SomeClass {
 // 프로퍼티와 메소드를 정의한다
}

struct SomeStructre {
 // 프로퍼티와 메소드를 정의한다
}

 

 

 

 

클래스와 구조체 인스턴스

 

  • 클래스와 구조체 이름 뒤에 빈 괄호를 적으면 각각의 인스턴스를 생성할 수 있다.
let someStructure = SomeStructure() // 구조체 인스턴스 생성
let someClass = SomeClass() // 클래스 인스턴스 생성

'Swift 기초문법' 카테고리의 다른 글

Swift: 인스턴스, 메소드, 프로퍼티 간단개념  (0) 2022.03.17
Swift: 초기화 구문 (init, deinit)  (0) 2022.03.17
Swift: 클래스 (class)  (0) 2022.03.17
Swift: 구조체(struct)  (0) 2022.03.17
Swift: 옵셔널(optional)  (0) 2022.03.17