TIL231212 D17 위젯, 레이아웃

jericho·2023년 12월 12일

TIL

목록 보기
17/62

어제에 이어 앱개발 입문 강의를 듣고 있다.
지금까지 UI를 신경쓰며 개발한 적은 많지 않았는데, 앱을 만드는 과정은 UI가 반 이상이라고 한다. 개인적으로 코드를 쳐다보며 최적화하는 것에 흥미가 있는 편인데, UI를 꾸미려니 머리가 아파오는 느낌이다. 그렇다고 백엔드는 뭔가 재미가 없을 것 같고.. 일단 배우기 시작한 프론트를 깊이 배워봐야 이 길이 맞는 길인지 알 수 있을 듯 하다.

위젯 (Widget)

View의 서브클래스 중에서 화면에 보이는 것들을 말한다.
TextView, Button 등이 위젯에 해당한다.
참고로 View는 모든 UI 컴포넌트들의 부모 클래스다.
모든 뷰는 너비, 높이의 크기를 가지며 단위는 보통 dp를 사용한다. px이나 mm 등 고정길이값을 사용하면 디스플레이 크기에 따라 의도한 것과 크기 차이가 많이 나므로 dp를 사용한다. dp는 dpi에 따라 배율이 조정된다. 이미지는 배율로 조정하면 깨지므로 dpi별로 여러 이미지를 넣어둔다.

레이아웃 (Layout)

ViewGroup의 파생 클래스로서, 포함된 View를 정렬하는 기능을 한다.
Linear, Relative, Table, Frame, Constraint 로 크게 5가지 Layout이 있다.
Constraint를 주로 사용하고, Relative는 legacy로 들어갔다. Linear 정도만 추가적으로 사용할 만하다.

문제풀이1: 가운데 글자 가져오기

https://school.programmers.co.kr/learn/courses/30/lessons/12903

문자열에서 가운데 글자를 가져온다. 짝수면 두 글자.

 - 풀이 1
fun solution(s: String): String {
    val sz = s.length
    if (sz % 2 == 0) return s.slice(sz / 2 - 1..sz / 2)
    return s[sz / 2].toString() }

길이를 확인하여 가운데 한글자를 가져오거나, 두 글자를 slice하여 가져왔다.

 - 풀이 2
fun solution(s: String): String =
    s.substring(s.length / 2 - 1 + s.length % 2, s.length / 2 + 1)

홀짝을 확인하는 대신, 슬라이싱 범위에 계산으로 집어넣어서 if를 없앴다. slice가 내부적으로 substring을 호출하므로 직접 호출해주었다.

문제풀이2: 수박수박수박수박수박수?

https://school.programmers.co.kr/learn/courses/30/lessons/12922

'수박수박수...' 패턴의 길이 n 문자열 만들기.

 - 풀이 1
fun solution(n: Int): String {
    val w = "수박"
    var answer = ""
    for (i in 0 until n / 2) {
        answer += w
    }
    if (n % 2 != 0) answer += "수"
    return answer
}

패턴인 "수박" 문자열을 반복해서 붙인 다음 홀수면 '수'를 붙이기.
배열 합치기가 비효율이므로 스트링빌더를 사용하면 개선 가능.

그런데 타인 풀이에서 좋은 것을 발견했다.

 - 참고 풀이 2
fun solution(n: Int): String =
    String(CharArray(n) { i -> if (i and 1 == 0) '수' else '박' })

인덱스를 이용한 배열 초기화를 적용한 것이다.
배열에서 초기화되는 변수의 인덱스가 람다식에서 it으로 주어지는데, 아무래도 i로 사용하는 것이 익숙하다. 홀수번째는 '수', 짝수번째는 '박'으로 초기화하는 것이다.
배열의 초기값이 인덱스와 관계가 있다면 초기화에 매우 유용하다.

0개의 댓글