ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 구조체와 클래스 1(Struct and Class) 사용이유, 공통점, 차이점, 구조체와 클래스 내의 let, var 선언
    Swift 2022. 12. 28. 15:00

    구조체와 클래스는 사용할까?

    • 데이터를 용도에 맞게 묶어서 표현할 때 유용
    • 애플이 미리 설계해둔 클래스/구조체를 잘 사용하기 위함


    구조체랑 클래스의 공통점은 뭘까?

    • 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가짐
    • 하나의 새로운 사용자 정의 데이터 타입을 만들 수 있음
    • 초기 상태를 설정할 수 있는 initializer 정의
    • extension을 통해 확장
    • 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응
    • subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의


    구조체랑 클래스의 차이점은 뭘까?

    • 구조체는 값타입(value Type)
      인스턴스 데이터를 모두 스택에 저장하고,
      스택은 함수를 실행할 때 함수내에서 필요한 데이터들을 스택내에서 사용.
      구조체는 모든 데이터가 스택 내에서 다루어짐!
      * 여기서 스택(stack)이란?
      valueType으로 지역변수와 매개변수 등이 저장되고 할당된 변수가 함수 호출이 완료되면 사라짐!
      컴파일시에 크기가 결정 됨!
    Struct Car{
    	var name = "자동차"
    }
    
    var a = Car() //구조체 인스턴스 생성 
    a.name //점(.)을 통해 해당 인스턴스의 프로퍼티에 접근 할 수 있음.  
    //자동차 
    
    //변수 b에 위에 선언된 변수a를 복사하기 
    var b = a
    a.name = "택시"
    
    //구조체의 메모리 복사의 특징은 무조건 데이터를 동일하게 복사해서 새로 만드는 것!
    //a 인스턴스의 변화는 해당 인스턴스에만 영향을 끼치고, b 인스턴스에는 아무런 영향이 없음.
    a.name //택시
    b.name //자동차

    • 클래스는 참조타입(reference Type)
      인스턴스 데이터는 힙에 저장되고, 해당 힙을 가리키는 변수는 스택에 저장을 하며 그 변수에는
      메모리 주소 값이 들어있는데 실제 데이터가 들어있는 힙을 가리키는 구조임
      클래스는 정의 될 때 데이터 영역에 존재하고, 데이터들은 힙에 존재함
      데이터를 복사 할 때 값을 전달 하는 것이 아닌 저장된 주소를 전달함.

      구조체와 다르게 상속, 타입캐스팅, 소멸자, 참조카운트 기능을 가지고 있는데, 이를 제외하면 스택영역에서 데이터를 빨리 썼다 지웠다 할 수 있는 구조체를 사용하는것이 효율적임!(실제로 애플에서도 구조체를 사용하라고 권장하기도 함)
    class Car{
    	var name = "자동차"
    }
    
    var a = Car() //클래스 인스턴스 생성 
    a.name // 자동차 
    
    //구조체와 마찬가지로 변수b에 a를 복사하면 어떻게 될까?
    //클래스의 주소를 복사하는 경우에는 가리키는 메모리 주소가 같기 때문에 동일한 데이터를 가져감!
    var b = a 
    a.name ="택시"
    
    //결과는 복사된 변수의 값을 변경하면 복사 값을 가지고 온 변수의 데이터도 변경되어 출력됨
    b.name //택시
    a.name //택시



    클래스와 구조체의 let과 var 키워드 선언에 대해서 알아보자!

    • Struct 구조체
      구조체의 경우에 선언 이후에 데이터를 변경 하게 되면 아래와 같이 에러(Cannot assign to property)가 발생한다.
      구조체는 원래가지고 있는 속성 모두가 let이 되버리고, 메모리 구조가 스택에 생기기 때문
      let은 메모리 주소를 바꿀 수 없다는 의미!
      데이터를 변경하고 싶다면 var을 이용하여 변경할 수 있음!

    • Class 클래스
      클래스로 내가 원하는 데이터를 담고 위와 같이 상수선언을 해서 데이터를 변경해봤다.
      왜 클래스는 값이 바뀔까?
      let은 메모리 주소를 바꿀 수 없어서 다른 객체를 가리키게 될 수 없다는 뜻이라 새로운 객체를 만들었다면 새로운 객체를 가리킬 수 있는 새로운 메모리 주소를 담을 수 없지만, class에서는 메모리 주소가 가리키고 있는 것이 var로 선언이 되어 있기 때문에 변경가능
      (당연히 클래스 내부 mustThing 변수가 let으로 선언되어 있으면 변경이 불가능함)



    다음 포스팅에서는 구조체와 클래스의 초기화를 볼 수 있습니다.
    잘못된 정보를 수정해주시거나 조언해주시는 부분은 언제든 환영입니다!

    🏷️ 참고 도서 : 야곰 스위프트 프로그래밍5
    🏷️ 참고 사이트: https://jusung.gitbook.io/the-swift-language-guide/language-guide/09-classes-and-structures

    클래스과 구조체 (Classes and Structures) - The Swift Language Guide (한국어)

    jusung.gitbook.io

    댓글

Designed by Tistory.