티스토리 뷰

반응형

안녕하세요 ㅎㅎ

앞에서 Swift ) Swift 기초문법1 ( CLASS / STRUCT / ENUM )을 정리했었는데요.


읽고 나시면  

"CLASS / STRUCT / ENUM 이 대충 어떤건지는 알겠는데 

언제 클래스를 써야하고, 구조체를 써야하고, 열거형을 써야하는거야?"

하는 궁금증이 드실 수 있을거에요.



한번 알아봅시다 :)

먼저 CLASS / STRUCT / ENUM 의 대표적인 차이점! 

네. 바로 call by reference, call by value이죠

클래스는 call by reference. 즉 참조타입입니다.

그리고 구조체와 열거형은 call by value. 즉 값타입입니다.

다른 언어에서도 많이 들어보셨을 것 같아요.  

참조타입과 값타입은 무엇이 다른지 간단하게 정리해드리면,


참조타입은 데이터를 전달할 값의 메모리 위치를 전달합니다.

그 데이터가 있는 '위치'를 전달했기 때문에 그 데이터를 참조하는 곳 어디서든 원본에 접근이 가능하겠죠? 


값타입은 데이터를 전달할 값을 복사하여 전달하죠. 말그대로 '사본'입니다.

원본은 그대로 유지가 된답니다 :) 



예제를 한번 볼까요?


struct Point{

    var x = 0.0

    var y = 0.0

}


let point = Point.init()

var comparePoint = point

comparePoint.x = 5

print(comparePoint.x,point.x)


결과가 뭐가 나올까요?


5.0 0.0 


입니다. comparePoint에 point를 말그대로 '복사'해서 comparePoint에만 값을 넣어주었기 때문이죠.


이제 struct class로만 바꾸어 볼게요. 


class Point{

    var x = 0.0

    var y = 0.0

}


let point = Point.init()

var comparePoint = point

comparePoint.x = 5

print(comparePoint.x,point.x)


결과는 


5.0 5.0


입니다. comparePoint,point 둘다 같은 메모리에 있는 '원본'을 접근하게 되는거죠


이제 대충 값타입과 참조타입의 차이점을 아시겠나요? 

그럼 이제 본론으로 들어가서


열거형은 잠시 제외하고

클래스와 구조체는 언제 쓰는 걸까요?

그리고 굳이.. 굳이~~ 클래스로 만들어도 될 것을 왜 구조체로 만든거지? 

첫번째 글에서 swift의 대부분의 큰 뼈대는 구조체로 이루어져있다고 했죠? 

그 예로 데이터타입을 봤구요.

왜 이런 데이터타입들을 정말 굳이 구조체로 구현했을까요? 
그 이유에는 여러가지가 있겠지만 몇가지만 말씀드리자면,

  • 속도
    : 값타입은 시스템 리소스를 적게먹는다고 합니다.

  • 안전성
    : 클래스는 참조타입이기 때문에 '원본'에 바로 접근이 가능하다고 했죠? 구조체는 원본은 그대로 두고 '복사'가 일어나기 때문에 원본을 지킬 수 있게 됩니다.그러한 점에서 클래스보다 좀 더 안전한 코딩이 가능하다고 볼 수 있겠죠. 이는 여러 클래스 또는 다중스레드 환경에서 변수를 전달 할 때 유용할 텐데요,변수의 복사본을 다른곳으로 보낼 수 있으면 다른 곳에서 변수값을 변경하는 것에 대해 걱정할 필요가 없겠죠?

  • swift와 객체지향
    : swift는 객체지향과 그리 친하지 않다고 하네요. (이 부분은 잘 나오질 않네요 ㅠㅠ 더 찾아봐야 할 것 같아요)


    또한 구조체의 주요 목적은 비교적 간단한 데이터 값을 캡슐화 하는 것이라고 하네요 :)

    그럼 언제 써야할지 간단하게 정리해볼까요?

    구조체를 먼저 말씀드리면,

    • 참조가 아닌 복사를 원할 때

    • 자신을 상속할 필요가 없거나 자신이 다른타입을 상속받을 필요가 없을때 

    • 연관된 몇몇의 값들을 모아서 하나의 데이터타입으로 표현하고 싶을때
    쓰게 됩니다! 클래스는 반대로 생각하면 되겠죠? 




    하지만 이렇다고 해서 어느때는 클래스를 써야만해!! 이때는 구조체만 써! 
    딱 이런기준은 없답니다 :) 
    하지만 swift 언어가이드에서 도움이 될만한 기준을 제시해주었는데요,

    아래의 조건중에 한가지 또는 그 이상 해당하는 경우에는 구조체를 생각하십시오.

    • 구조체의 주목적이 몇몇 연관성있는 간단한 데이터 값의 캡슐화일 경우
    • 캡술화된 값들이 그 구조체의 인스턴스가 할당될때나 전달될때 참조보다는 복사가 예상될 경우
    • 구조체에 저장되는 모든 프로퍼티들이 참조보다는 복사가 예상되는 값형식일 경우
    • 구조체가 다른 형(type)에서부터 프로퍼티나 기능이 상속될 필요가 없을 경우


    구조체를 사용하는 좋은 예:

    • Double형을 갖는 width와 height 프로퍼티의 캡슐화를 하는 기하학적 모형의 사이즈.
    • Int형을 갖는 start와 length 프로퍼티의 캡슐화를 하는 시리즈의 범위에 접근하는 방법.
    • Double형을 갖는 x,y와 z 프로퍼티의 캡슈화를 하는 3차원 좌표시스템의 포인터.

    이외의 경우에는 클래스로 정의하며, 레퍼런스로 전달되고 관리되는 클래스의 인스턴스를 생성하십시오. 실질적으로는 대부분의 사용자 데이터 형은 구조체가 아닌 클래스로 정의되어야 합니다.



    ...라고 하네요! 

    도움이 되었으면 좋겠습니다!🙏







    반응형