# 면접스터디 1
## Bounds 와 Frame 의 차이점을 설명하시오.
[bounds](https://developer.apple.com/documentation/uikit/uiview/1622580-bounds)
1. 뷰의 위치와 크기를 자체 좌표계에서 설명
2. 원점은 0,0
3. 크기는 frame 속성의 사각형 크기와 같음, 크기를 변경하면 frame 속성의 사각형 크기도 일치하도록 변경됨
4. draw 메서드를 호출하지 않고 뷰가 자동으로 다시 표시
5. draw 메서드를 호출하려면 `contentMode` 속성을 `UIView.ContentMode.redraw.`로 해야함
- `contentMode` : 경계가 변경될 때 뷰가 콘텐츠를 배치하는 방법을 결정하는 데 사용되는 플래그
- 뷰의 경계가 변경될 때 뷰 레이어의 캐시된 비트맵이 조정되는 방법을 지정
- 크기 조정 가능한 컨트롤을 구현하는 데 자주 사용
- 매번 뷰의 내용을 다시 그리는 대신, 왜곡 유무에 관계없이 내용의 크기를 조정하거나 뷰의 특정 지점에 고정하도록
지정할 수 있음
- 언제든지 `setNeedsDisplay()`, `setNeedsDisplay(_:)`하여 뷰의 내용을 강제로 다시 그릴 수 있음
- 목록: scaleToFill(기본값), scaleAspectFit, scaleAspectFill, redraw, center
top, bottom, left, right, topLeft, topRight, bottomLeft
6. 애니메이션 적용 가능
7. 사용
- View내부에 그림을 그릴때 (drawRect)
- transfomation 후, View의 크기를 알고싶을 때
- 하위View를 정렬하는 것과 같이 내부적으로 변경하는 경우.
- ScrollView의 ContentOffset
8. 회전해도 width와 hegit, origin가 변하지 않음
- View 자체의 영역을 나타내기 때문
[frame](https://developer.apple.com/documentation/uikit/uiview/1622621-frame)
1. 수퍼뷰의 좌표계에서 뷰의 우치
2. transform을 이용하여 View를 회전 시킬 시, width와 hegit,origin가 변함
- View 영역을 모두 감싸는 사각형으로 나타내기 때문
4. 레이아웃 작업 중에 이 사각형을 사용하여 뷰의 크기와 위치를 설정 -> center 속성에서 지정한 점 변경 -> bounds 변경
5. `transform 속성이 ID 변환이 아닌 경우 이 속성의 값은 정의되지 않으므로 무시해야 합니다.` ?
6. 애니메이션 적용 가능
7. 사용
- 위치와 크기를 정해줄 때 사용
공통점
- 타입: CGRect
- 사각형으로 그려짐 (origin, size 가짐 -> x,y, width, height 가짐)
차이점
- 좌표시스템이 다릅니다.
- frame은 상위뷰의 좌표시스템 안에서 View의 위치와 크기를 나타내고,
bounds는 자신만의 좌표시스템 안에서 View의 위치와 크기를 나타냅니다.
- 즉 frame의 x,y값은 상위뷰의 원점에서 얼마만큼 떨어져 있는지를 알 수 있음
꼬리질문
- frame과 bounds 언제 사용하는 것이 좋을까요?
---
## 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.
https://fomaios.tistory.com/entry/%EC%8B%A4%EC%A0%9C-%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4%EA%B0%80-%EC%97%86%EC%9D%84-%EA%B2%BD%EC%9A%B0-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EA%B2%83%EA%B3%BC-%EC%97%86%EB%8A%94-%EA%B2%83
https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/iOS_Simulator_Guide/TestingontheiOSSimulator/TestingontheiOSSimulator.html
할 수 있는 것
- 나라별 키보드 입력을 할 수 있습니다.
- 접근성 기능을 사용할 수 있습니다.
- 지역화 기능을 사용할 수 있습니다.
할 수 없는 것
- 카메라, 마이크, 전화 기능을 사용할 수 없습니다.
- 마우스로 시뮬레이터의 터치를 하기 때문에 두 손가락으로 하는 줌인 줌아웃 등의 기능을 테스트 할 수 없습니다.
- Handoff 기능을 지원하지 않습니다.
- 네트워크 속도 테스트를 할 수 없습니다.
꼬리질문
- 지역화 기능을 사용할려면 어떻게 해야하는가
- 네트워크 속도 테스트를 하려면 어떻게 해야하는가
---
## struct와 class와 enum의 차이를 설명하시오.
공통점
- 값을 저장할 프로퍼티 정의 가능 (enum 제외)
- 기능을 제공하는 메서드 정의 가능
- 초기 상태를 설정하도록 이니셜라이저 정의 가능 (enum 제외)
- 기본 구현 이상으로 기능을 확장하도록 확장 가능
- 프로토콜 채택 가능
차이점
1. 클래스는 상속이 가능합니다.
2. 클래스는 참조타입이고 구조체는 값 타입이다.
- 참조 타입이란 건, ARC로 메모리를 관리한다는 것
- 같은 클래스 인스턴스를 여러개의 변수에 할당한 뒤 값을 변경시키면 할당한 모든 변수에 영향을 줌
- heap 영역에 저장됨
3. 구조체는 멤버별 초기화를 할 수 있음
꼬리 질문
- 구조체는 항상 값 타입인가요? -> 잘못된 질문, 구조체는 항상 값타입
- 어떤 경우에 구조체가 참조 타입이 될까요?
- 구조체 내부에 참조 타입 변수가 있는 경우, 16 byte 이상의 크기를 가지면 구조체도 힙 영역에 생성됨으로써 참조타입
enum의 장점
- switch statement
언제 구조체와 클래스를 쓸까?
- 연관된 데이터 타입들을 캡슐화 할때, 상속이 필요하지 않을 때, 원본 데이터를 보존해야할 때, 값이 복사되는 것이 합리적일 때
- 이 외는 다 클래스!
언제 enum을 쓸까?
- 에러타입을 정의하거나 네임스페이스를 처리할 때 사용 가능합니다.
- 스트링 리터럴을 그대로 쓰게 되면 오타로 인한 에러가 날 수 있는데,
열거형을 쓰면 이 부분을 예방할 수 있습니다.
----