TIL 19

오늘 한 일 / 배운점

  • 개인 과제 다듬기

  • 개인 과제 제출

  • 8/11 15:00 팀 내 코드리뷰

  • 8/11 19:00 보충학습 (HG튜터님) : 구조체와 클래스의 차이

  • 개인과제 예제 코드 및 과제 해설 영상 보기

과제

  • WIL 작성

느낀점

오늘은 보충학습 때 들은 내용이 너무 좋아서 정리를 해보려 한다.
구조체와 클래스 차이에 대해서 CS적인 개념으로 접근해서 설명해 주셨다.

1

메모리(RAM) 영역은 프로그램이 실행되는 동안 데이터와 명령을 저장하고 관리하는 공간인데
이 메모리 영역을 사용하여 프로그램의 실행과 데이터 처리를 가능하게 한다.
메모리는 총 4가지 영역으로 구성이 되어있다
① 코드 ② 데이터 ③ 힙 ④ 스택 이렇게..

  1. 코드(Code/Text) 영역 :

    • 프로그램의 소스코드가 컴파일되면 코드가 기계어(01형태)로 생성되어 저장
    • CPU가 이 코드 영역의 명령어 들을 순차적으로 가져와서 실행하는 걸로 프로그램이 동작하게 된다
    • 읽기 전용 영역
    • 프로그램 시작~종료 시까지 메모리에 계속 유지되는 영역이다.
    • 메모리 가장 낮은 주소부터 할당
  2. 데이터(Data) 영역 :

    • 전역 변수, 변수, 상수 등이 저장되는 영역이다
    • 읽고/쓰기 가능
    • 이 영역 역시 프로그램 시작~종료 시까지 메모리에 계속 유지되는 영역이다.
    • 메모리의 낮은 주소부터 할당
  3. 힙(Heap) 영역 :

    • 런타임(프로그램이 시작되어 종료될 때까지, 즉 실행 시간)중에 동적으로 메모리를 할당하는 영역
    • 개발자가 직접 관리해야 하고, 필요에 따라 메모리를 할당하고 해제한다
    • 참조 타입인 Class의 인스턴스가 이 영역에 저장됨
    • 객체와 구조체를 저장하는 데 사용되고 메모리의 높은 주소부터 할당된다.
  4. 스택(Stack) 영역 :

    • 지역변수, 매개변수, 반환 주소 등이 저장되는 영역
    • 함수가 호출될 때마다 스택 프레임이 생성되고 함수가 종료되면 스택 프레임 제거
    • 값 타입인 Struct 인스턴스가 이 영역에 저장됨

힙과 스택 같은 경우에는 각각 오버플로우를 방지하기 위해
위에 그림과 같이 힙 영역이 커지면 스택 영역이 작아지게 되고, 스택 영역이 커지면 힙 영역이 줄어들게 된다

힙이 스택 영역을 침범 → heap overflow
스택이 힙 영역 침범 → stack overflow

여기서 튜터님이 힙과 스택을 각각 바둑판과 프링글스로 비유하여 설명해 주셨다

2

힙(Heap) → 바둑판

  • 바둑알을 올리는 것은 빈 곳이라면 어느 곳이든 사용 가능하고 중간중간 바둑알을 뺄 수도 있다(동적으로 해제)
  • 하지만 처음에 들어온 게 해제된다는 보장도 없고 중간중간 빠지게 되면 어디에 넣어 줘야 할지부터 찾아야 하니까 찾는데 시간이 더 걸리며, 해제하는데 시간이 더 걸린다(힙의 영역이 스택보다 복잡)
  • 동적인 데이터 구조나 객체 생성, 대용량 데이터 처리에 활용된다.

스택(Stack) → 프링글스

  • 프링글스 통에 과자를 하나씩 넣는 것과 비슷
  • 과자를 꺼내려면 가장 위에 있는 과자부터 차례로 빼야만 아래 과자에 접근할 수 있음
  • 새로운 과자를 올리거나 빼는 것은 빠르고, 이전 과자를 꺼내려면 비교적 오래 걸린다
  • 스택은 함수 호출과 지역변수를 관리하는 데 사용되는데 함수가 호출되면 호출된 함수 정보와 매개변수들을 스택에 저장하고 실행이 끝나면 자동적으로 해당 정보를 제거하여 메모리를 확보하게 된다
  • 빠른 접근/관리를 위해 사용된다

이렇게 쓰레드(실행 단위)가 돌면서 스택이나 힙으로 던져서 작업을 수행하는 데
위에 특성 때문에 힙에 저장되는 class를 사용하는 것이 스택에 저장되는 struct 보다 느릴 수밖에 없는 것이다
따라서 스위프트에서도 만약 class와 struct 둘 다 사용 가능하다면 struct를 사용하는 것을 권장한다고 한다
(성능은 그리 체감 못할지라도..)
물론 상속을 한다거나 클래스를 사용해야 하는 경우에는 예외적으로 말이다.

struct 내부의 프로퍼티의 값을 바꿀 때는 mutating이라는 키워드를 함수 앞에 붙여야 하는 둥
아주 간혹 다른 경우가 있긴 하지만
그 외에는 class와 struct는 거의 사용 방식이 비슷하고
객체를 만들어서 값을 넣어주고 읽어오는 것은 같다 생각해도 된다.