brunch

You can make anything
by writing

C.S.Lewis

by 윤민섭 Oct 20. 2020

배경색이 변경되는 앱 2

기초가 되는 첫 앱

이전 글에서 버튼을 누르면 배경색이 변경되도록 했습니다. 이번엔 버튼이 눌릴 때마다 색상을 다른 색으로 변경해보겠습니다. 


색상은 버튼이 눌릴 때마다 파스텔 톤의 무지개 색깔로 변경되며 보라색이 되면 다시 빨간색으로 변경합니다.


"파스텔 톤의 무지개 색깔로 변경되며 보라색이 되면 다시 빨간색으로 변경"


여기서 우리는 먼저 파스텔 톤의 무지개 색깔을 알아야겠죠?

이전 글을 참고하면 UIColor.red를 사용해서 빨간색을 표현했습니다.

그렇다면 파스텔 톤으로 설정하려면 어떻게 해야 할까요?

첫 번째 방법은 적절한 red, green, blue 값을 찾아서 UIColor를 만듭니다.


red, green, blue가 255에 가까울수록 더 원색입니다. 즉, 색의 농도를 낮추기 위해선 255 보다 값을 낮게 둬야겠죠. 그리고 UIColor를 만들 땐 255로 나눈 값으로 넣어줍니다.

alpha는 투명도를 나타냅니다.


바로 이렇게 말이죠.


조금 파스텔 톤 같나요?


두 번째 방법은 Color Literal를 사용합니다. Color Literal은 Swift에 애플이 재밌는 요소를 넣은 것입니다.


클릭하면 아래와 같이 Color Palette를 사용하여 색을 정할 수 있습니다.



"파스텔 톤의 무지개 색깔로 변경되며 보라색이 되면 다시 빨간색으로 변경"


자 그럼 파스텔 톤을 만드는 방법은 해결했고, 이제 버튼이 눌릴 때마다 무지개 색깔로 변경되어야 합니다.

무지개 색깔은 총 7개입니다. 7개를 어떻게 선언해줘야 할까요?


우선 무지개 색깔을 선언하기 전에 상수와 변수에 대해 먼저 알아야 합니다.

코딩은 무언가를 계산하는 것으로 이뤄집니다. 즉, 계산을 하기 위해 우리는 값이라는 것을 다뤄야 합니다.

이 값은 다시 변할 수 없는 값과 변할 수 있는 값으로 나뉩니다. 


변할 수 없는 값을 상수, 변할 수 있는 값을 변수라고 합니다.

Swift에선 값을 만들 때 상수로 만들고 싶다면 let을 변수로 만들고 싶다면 var를 사용하기로 약속합니다.

예를 들어 사람의 정보를 컴퓨터에게 알려준다고 했을 때, 이름은 딱히 변하지 않을 것입니다. 하지만 나이는 1년이 지나면 변하죠. 그렇다면 이름은 상수로 나이는 변수로 선언해주는 것입니다. 이렇게요.


아, 무지개 색은 총 7개라고 했습니다. 그렇다면 한 가지 더 알아야 합니다. 바로 배열입니다.

배열은 일정한 특징을 갖는 값끼리의 모임입니다. 배열을 만들 때 정해진 규약들이 있지만 우선 그런 것들은 신경 쓰지 않겠습니다. 배열은 대괄호를 사용하여 이렇게 선언할 수 있습니다.



그리고 사용할 땐 이렇게 선언한 값을 사용해 몇 번째 자리를 가져올 것인지 정해주면 됩니다.

빨간색을 가져오기 위해선 rainbowColors [0]으로 가져올 수 있습니다.


여기서 왜 빨간색이 1이 아니라 0인지 궁금할 수 있을 것 같습니다. 이건 약속인데 배열의 첫 번째 인덱스 (자리)는 0부터 시작합니다.



그렇다면 버튼이 눌릴 때마다 대괄호의 숫자만 변경시켜주면 색상이 계속 변경될 것 같습니다.

어떻게 0을 변경할 수 있을까요?


어떤 변수 값을 0으로 선언한 뒤 버튼이 눌리면 그 값을 사용해 배열에서 값을 가져오고 어떤 변수의 값을 1 증가시키면 됩니다. 이렇게 말이죠.


옳은 예시

어떤 변수를 선언할 때 왜 함수 안에서 선언하면 안 될까요? 그 이유는 함수는 역할이 끝나면 함수 안에서 선언했던 변수들을 모두 메모리*에서 지우기 때문입니다. 그러므로 함수 안에서 어떤 변수를 선언한다면 아무리 1을 증가시켜도 그다음 함수가 호출될 땐 계속 0으로 변경될 것입니다.


잘못된 예시


다시 돌아와서 앱을 실행하고 버튼을 누르면 배경 색상이 변경되는 것을 확인할 수 있습니다.

그럼 버튼을 8번 누르면 어떻게 될까요? 바로 이런 에러가 나올 것입니다.



에러 설명을 보니 'index out of range : 인덱스가 범위를 벗어났다'라고 되어있네요. 배열이 0부터 시작하니까 마지막에 위치한 값의 인덱스는 6일 것입니다. 

버튼을 7번 누르면 rainbowColors에 접근할 땐 6이었으나 그 후 index를 증가시켜 7이 됩니다.


그렇기 때문에 버튼을 8번 누르게 되면 0~6의 범위를 벗어나기 때문에 오류가 발생하는 것입니다.

즉, index가 6 이하인 경우만 색을 변경시켜줘야 합니다. 이런 경우 조건문을 사용할 수 있습니다. 조건문은 아주 직관적인 이름을 갖고 있어요. 바로 if입니다.


만약 인덱스가 6 이하라면 내가 원하는 작업을 수행해.

이제 버튼을 8번 누르던 10번 누르던 오류는 발생하지 않습니다.


"파스텔 톤의 무지개 색깔로 변경되며 보라색이 되면 다시 빨간색으로 변경"


이제 하나 남았습니다. 보라색이 되면 다시 빨간색으로 변경


이 기능은 다음 글에 설명하겠습니다. 다음 글을 보기 전에 어떻게 하면 이 동작이 수행될지 생각해보는 것도 좋을 것 같습니다.


*힌트

if문의 조건에 안 맞는 경우 else문을 사용해 특정 동작을 다룰 수 있습니다.


메모리*

중요한 개념이지만 간단히 설명하면, 변수가 선언될 때 OS는 그 변수를 메모리라는 공간에 저장시킵니다. 또 변수가 사용되지 않을 때 메모리에서 지워 공간을 확보합니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari