호댕의 iOS 개발

[TIL] 21. 10. 25 Today I Learned (구조체와 클래스, Singleton) 본문

Software Engineering/TIL

[TIL] 21. 10. 25 Today I Learned (구조체와 클래스, Singleton)

호르댕댕댕 2021. 10. 25. 22:33

오늘은 구조체와 클래스의 차이와 Singleton 위주로 학습을 진행했다. 

처음 공식문서를 통해 접했을 때는 정확히 이해가 가지 않았지만 계속 반복해서 보며 조금씩 이해를 하고 있다. 

 

최근 들어 한번도 접해보지 못한 개념들에 대해 공부하고 적용해보며 어렵다고 생각이 드는 부분이 많은 만큼 반복해서 개념들을 이해할 수 있도록 공부해야겠다. 

 

오늘 한 일 

- Structure and Classes 공식문서 다시 보기 

- Choosing Between Structures and Classes 아티클 보기 

- Singleton 공식문서 보기 

- 프로젝트 코드 개선 (타입의 기능 분리 및 기능 이동)

 

# 왜 클래스에는 Memberwise Initializer가 없을까?

Swift 구조체의 유용한 특징 중 하나는 바로 memberwise Initializer가 있다는 것이다. 그러나 Swift의 클래스에선 memberwise Initializer를 사용할 수 없다. 그 이유는 무엇일까?
주요한 이유 중 하나는 Class는 상속을 할 수 있다는 것이다. 만약 다른 클래스에 상속을 한 후, 기존 class의 프로퍼티를 추가한다면 상속을 받은 클래스에선 오류가 발생할 것이다.
따라서 Class에선 자동으로 이니셜라이저를 생성하는 memberwise Initializer를 사용하는 대신, 반드시 직접 Initializer를 작성하도록 하게 했다.
-> 그렇다면 추가로 상속을 할 수 없는 final class에선 memberwise Initializer를 사용할 수 없을까?
(이 부분에 대해선 아직 찾지 못했다…)

참고: Why don’t Swift classes have a memberwise initailizer? - HackingWithSwift

 

# Stack과 Heap

프로그램이 실행되기 전 먼저 프로그램이 메모리에 로드되어야 한다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. 따라서 컴퓨터의 운영체제는 컴퓨터의 실행을 위해 다양한 메모리 공간을 가지게 된다.

  • 코드 영역(텍스트 영역): 작성한 소스코드가 기계어 형태로 저장이 된다. 컴파일 타임에 결정이 되며 중간에 코드가 변경되지 않도록 read-only 형태로 저장된다.
  • 데이터 영역: 프로그램의 전역변수와 static 변수가 저장되는 영역. 프로그램이 시작됨과 동시에 메모리에 할당되며 프로그램이 종료되면 소멸한다. 중간에 값이 변할 수 있기 때문에 read-write로 지정된다.
  • 스택 영역: 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역. 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸하게 된다. 메모리의 높은 주소에서 낮은 주소 순으로 할당된다. (Struct도 여기에 저장된다)
  • 힙(heap) 영역: 사용자에 의해 메모리 공간이 동적으로 할당되며, 사용하고 난 후 반드시 메모리 해제를 해줘야 한다. 그렇지 않으면 메모리 누수가 발생한다. 유일하게 런타임 시 결정이 되기 때문에 데이터의 크기가 확실하지 않을 때 사용된다. 메모리의 낮은 주소에서 높은 주소 순으로 할당된다. (Class, Closer도 여기에 저장)

힙 영역과 스택 영역은 같은 메모리 영역을 공유하게 되는데 여기서 메모리 영역을 초과하게 되면 StackOverFlow가 발생하게 된다.

내가 이해한 바로는 만약 Class의 인스턴스를 생성하게 되면 실체(오늘 예시에서 보면 name: yagom, weight: 73)는 heap 영역에 저장이 되고 그 주소 값을 담은 것은 스택 영역에 저장되게 된다.
구조체의 경우 스택 영역에 바로 값이 복사되어 저장되고 말이다.

참고: https://babbab2.tistory.com/25?category=831129

 

# 응집도와 결합도

응집도: 하나의 타입이 하나의 기능을 하도록 하는 것
결합도: 하나의 타입이 다른 타입에 의존하고 있는 것
-> 응집도는 높이고, 결합도는 낮추는 것이 좋다.

 

# Singleton은 왜 구조체로 만들지 않는 것일까?

싱글턴은 타입에서 딱 하나 존재해야 하는 인스턴스일 때 사용하게 된다. 따라서 몇 번을 호출해도 동일한 주소를 가리키게 된다.
이를 위해선 하나의 인스턴스를 가지고 계속 참조를 해야 한다. 하지만 구조체를 사용할 경우 Value type이기 때문에 다른 곳 여기저기서 인스턴스의 값을 복사하게 되고, 하나의 인스턴스를 가질 수 없게 된다.
따라서 Singleton에선 클래스를 사용하며 구조체는 사용하지 않게 된다.

Comments