생성자 상속 전까지 강의를 들었다. 역시 메모리구조를 알면 훨씬 더 기억하기 쉽다는 것..!
싱글톤패턴에 대해 잊고있었는데 제대로 복습할수있어 좋았다. ststic let 변수이름 = 객체생성()
와 같이 클래스 내부에서 힙영역에 객체를 생성하면 데이터 영역에는 객체주소가 담기고 해당 객체주소는 힙영역에 있는 객체를 가리키게 된다.
그렇게 해서 유일하게 한개만 존재하는 객체를 사용하게 되는데, 생성자를 통해 객체의 중복생성을 막기위해 private init()으로 생성자를 은닉하면 제대로 된 싱글톤패턴을 사용할 수 있다.
인스턴스 메서드의 경우 메서드 내부에서 인스턴스 속성을 변경 할 수 있지만(클래스의 경우) 값타입(구조체)의 경우에는 메서드 내부에서 인스턴스 속성을 변경하기 위해서는 메서드에 mutating 키워드를 붙여주어야 한다.
값타입에서 직접 저장속성에 접근하여 값을 변경하는 것과 mutating 키워드를 가진 메서드를 활용하여 저장속성 값을 self.저장속성명 = 바꾸려는값 으로 바꿔주는것에는 메모리적인 차이가 있는데,
전자는 해당 저장속성을 바꾼다기 보다는 값을 복사해서 복사한 인스턴스의 저장속성 값을 변경하는 것이고
후자가 내가 원하는 인스턴스의 저장속성값을 바로 바꾸는 행위이다.
왜 굳이 메서드를 활용해서 값을 바꿔야할까? 싶어서 이부분이 궁금했는데 마침 어떤분께서 질문을 해주셔서 해결할 수 있었다.
타입메서드 문법의 한 예로 Int.random(in:) 을 들 수가 있는데 in이 아규먼트레이블이고 random이라는 타입메서드를 Int라는 타입에서 가지고 있어서 활용할수 있는 것이다.
타입메서드의 내부에서 타입 속성을 호출 활용가능하다.
상속 재정의 부분에서 왜 저장속성은 재정의되지 못하는지(단 일부 계산속성등으로 변경하는 경우 등 제외) 왜 메서드는 가능한지 등등은 메모리구조와 함께 이해하면 훨씬 쉬워지는 측면이 있다.
제일 낯설게 느껴진 문법은 상속후 메서드 재정의에서 서브스크립트 재정의 하는 부분인데, 서브스크립트 재정의를 할때도 재정의 서브스크립트 내부에서 상위 서브스크립트를 super[아규먼트] 식으로 전체 상위 서브스크립트를 불러올 수 있는데 좀 더 눈에 익숙해져야한다고 느꼈다.
시험문제를 1시간 가량 듣고 컬렉션 및 알고리즘 관련 강의를 1시간 반 가량 들었다.
시험문제에 배열내 최대값을 구하는 문제가 있었는데 예전에 프로그래머스에서 풀었던 기억이 나서 구현해보았다.
그 외의 코드 구현문제도 예전보다는 풀 수 있는 수준이 올라간것같아서 다행 + 소소한 기쁨
array.sorted() => O(n logn) 의 복잡도를 가진다
for문, if문으로 구현하는데 O(n) 의 복잡도로 더 효율적이다.
저장속성, 계산속성에 대해서도 간단히 복습했는데 계산속성에 대해 좀 더 익숙해지도록 하자
관련 블로그 글 링크
https://demian-develop.tistory.com/30