brunch

You can make anything
by writing

C.S.Lewis

by 윤민섭 Oct 22. 2020

배경색이 변경되는 앱 3

기초가 되는 첫 앱

"버튼을 누를 때 배경 색이 파스텔 톤의 무지개 색깔로 변경되며 보라색이 되면 다시 빨간색으로 변경"

기능이 동작하는 앱을 만드는 것이 목표였습니다.


이전 글에서 "버튼을 누를 때 배경 색이 파스텔 톤의 무지개 색깔로 변경되며"까지 동작하는 것을 확인했습니다.  "보라색이 되면 다시 빨간색으로 변경" 구현해보셨나요?


이 기능을 구현하기 위해선 if-else 문에 대해 먼저 공부해야 합니다. 동물 소리를 판단하는 함수를 만들어 보겠습니다. (단, 알고 있는 동물 소리는 고양이밖에 없다고 가정해봅니다.)



어떤 동물의 값을 갖고 있는 animal 이란 값이 있습니다.


동물소리() 함수를 호출하면 animal에 따라 소리를 출력합니다.


우리가 알고 있는 소리는 고양이밖에 없으니 만약 animal이 고양이가 아니라면 어떻게 해야 할까요?


이런 경우, else 문을 사용합니다. 여기선 "어떤 동물 소리"를 출력하지만 else문은 if 조건이 아닌 경우 어떤 기능을 명령할 수 있습니다.


if 문은 이렇게 표현할 수 있습니다. 만약 조건에 맞으면 A로직, 조건에 맞지 않으면 B 로직을 수행합니다.




Swift에선 '조건이 맞다면'을 true로, '조건이 맞지 않다면'을 false로 생각합니다. 여기서 true/false는 참/거짓을 판별할 수 있는 Boolean 데이터 타입입니다. 데이터 타입은 조금 뒤에 다뤄보겠습니다.


그럼 만약 알고 있는 동물 소리가 추가됐다면 어떻게 해야 할까요? 강아지 소리와 송아지 소리를 알게 됐다고 가정하겠습니다.


그런 경우 if - else 사이에 여러 개의 else if 조건을 넣을 수 있습니다. if부터 시작해서 참 조건이 나올 때까지 조건문을 수행합니다. 만약 else 가 나오기 전까지 참 조건이 없다면 else문이 수행됩니다.


animal이 강아지라면 "멍멍"을 출력하고 함수가 조건문이 종료될 것입니다.



if 문과 같은 역할을 하는 조건문이 하나 더 있습니다. 바로 switch문입니다. switch 문은 조건문의 역할을 하지만 각각의 조건을 하나의 경우로 따진 다는 점에서 if문과는 느낌이 조금 다릅니다. switch는 이렇게 사용합니다.


보이는 것처럼 각각의 조건을 case로 관리합니다.

if문과 마찬가지로 특정 케이스를 만나면 switch문은 종료됩니다.

if문에서 나머지 처리를 담당하는 else 문은 switch 에선 default:로 사용합니다. 단, if문에선 else는 필수가 아니지만 switch문에서 case를 한정 짓지 않는다면 default:는 필수입니다. case를 한정 짓는 방법은 추후 설명드리겠습니다.



그렇다면 다시 우리의 첫 앱으로 돌아와서 보라색이 되면 다시 빨간색으로 변경을 구현해보겠습니다.

보라색이 됐을 때 변수 index는 7이 될 것이고 이런 경우 if index <= 6 조건에 맞지 않을 것입니다.

그렇다면 else문에서 어떤 것을 해줘야 다시 빨간색으로 변경할 수 있을 것 같습니다.


빨간색이 되려면 index 값이 0이 돼야 합니다. 0으로만 만들면 끝이 아니고, 0으로 만든 후 if 문 로직을 수행해야 배경색을 입힐 수 있습니다. 바로 이렇게 말이죠.




이제 "버튼을 누를 때 배경 색이 파스텔 톤의 무지개 색깔로 변경되며 보라색이 되면 다시 빨간색으로 변경" 기능이 모두 완료됐습니다!


이렇게 첫 번째 앱이 완성됐습니다.


앱은 완성했지만 몇 가지 더 설명드리고자 합니다.


1. 함수는 계산 후 값을 반환하는 것도 가능하다.

첫 앱 1 글에서 함수에 대해 간단하게 설명했습니다. 함수는 외부로부터 값을 전달받고 계산에 사용할 수 있다고 했었죠. 반대로 함수에서 계산하고 외부로 전달하는 것도 가능합니다.


함수에서 값을 반환할 땐 이런 형태로 사용합니다.

화살표 뒤에 어떤 타입의 값을 반환할지 결정하는 것입니다.



그렇다면 타입은 무엇일까요? 이전 글에서 정수를 다룬다고 했던 Int, 그리고 문자를 다뤘던 큰따옴표("")가 기억나시나요?

우리는 값 (변수, 상수)을 다뤄 프로그래밍을 하고 있습니다. 사실 값은 각각의 타입을 갖고 있습니다.

타입은 숫자면 정수(Int)인지 실수(Float, Double)인지, 문자(String)인지, 다른 무엇인지를 나타냅니다.


값을 선언할 땐 위와 같이 코드를 작성했습니다. 이 코드는 아래 코드와 동일합니다.


이렇게 타입이 숨어있던 것이죠. 이렇게 타입을 명시해주지 않아도 되는 것은 Swift의 타입 추론 기능 덕분입니다.



여러 가지 타입이 있지만 Int와 Float, String에 대해서 잠깐 알아보겠습니다. (이해가 안되더라도 괜찮습니다. 숫자를 다루고 문자를 다루는 타입 정도로 생각해도 됩니다.)


첫 번째는 Integer, 정수입니다. 정수는 ...-2, -1, 0, 1, 2... 를 의미하죠. 정수라는 타입은 더 다양하게 나뉩니다. 먼저 Int32Int64가 있습니다. Int 뒤에 숫자가 더 클수록 표현할 수 있는 정수가 더 많다는 것을 의미합니다. 뒤에 숫자는 비트(bit) 수를 의미합니다. 우리가 뒤에 숫자를 생략하고 그냥 Int라고 쓰면 Swift는 알아서 옛날 핸드폰이면 Int32 타입으로, 요즘 핸드폰이면 Int64 타입으로 타입을 결정합니다.

(Int32으로 너무 크거나 작은 정수를 표현하려고 하면 에러가 발생합니다.)


하나 더 있습니다. UInt라는 타입입니다. Int 앞에 붙은 U는 Unsigned를 의미하는데 이 타입은 양의 정수만 처리합니다. 양의 정수만 처리하면 음의 정수를 처리할 수 있는 만큼 양의 정수를 더 처리할 수 있습니다.

(UInt 타입에게 음의 정수를 표현하면 에러가 발생합니다.)


두 번째는 Float, 실수입니다. Float은 실수를 표현할 수 있습니다. 실수를 표현할 수 있는 것은 Float만 있는 것은 아닌데요. Float보다 2배 더 넓은 범위를 표현할 수 있는 Double 타입도 있습니다. 소수점 처리나 더 큰 수를 처리할 때 Float이나 Double을 사용합니다.


마지막은 String, 문자열입니다. 사용자에게 텍스트를 보여주기 위해선 Swift도 문자를 표현할 수 있어야 합니다. 따라서 Swift에선 String이라는 타입을 사용합니다. String은 문자 (Character)의 모음입니다.

즉, Dog!라는 문자열이 있다면 'D', 'o', 'g', '!'의 모음인 것 이죠. String은 다양한 처리를 할 수 있는데 요, 차차 알아가겠습니다.


다시 함수로 돌아오겠습니다.

이렇게 반환 값을 다루는 함수는 어떻게 사용할 수 있을까요?



동물 소리 예시를 보겠습니다.

만약 print를 하는 것이 아니라 소리를 함수의 결과물로 받고 싶다면 어떻게 해야 할까요?


ReturnType을 String으로 변경하고 print("동물소리") 대신 return "동물소리"를 작성하면 가능합니다. 바로 이렇게요.




이렇게 몇 개의 타입과 함수의 추가적인 사용법을 알아보았습니다.

다음 글에선 두 번째 앱을 만들어보겠습니다.


고맙습니다.




개발자들은 만든 코드에서 만족하지 않고 계속 좋은 코드를 작성할 수 있도록 고민합니다.

이 과정을 Refactoring(리팩토링) 이라고 합니다.


이 코드에서 중복되는 코드가 있습니다. view의 색상 지정 코드와 index를 증가시키는 코드인데요.

아래와 같이 코드를 수정해볼 수 있을 것 같습니다.


코드엔 정답은 없습니다. 설명되어 있는 방법 말고 다른 방법으로 구현해도 기능 완성이 가능합니다.

이후에 설명될 코드들도 본인 코드 스타일에 맞게 수정해보는 것도 좋은 연습이 될 것이라 생각합니다.


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