기분탓인지 모르겠지만 어제보단 쉬운 느낌? 오늘 일단 4개만 풀고 일요일에 좀 많이 풀어볼까 한다.
나의 답)
import Foundation
print(#"!@#$%^&*(\'"<>?:;"#)
검색해보니 특수문자를 프린트하려면 양 옆에 "#" 이 들어가야한다고 한다.
바로 해보니 출력 깔끔하게 완료되었다.
나의 답)
import Foundation
let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
let (a, b) = (n[0], n[1])
print ("\(a) + \(b) = \(a + b)")
덧셈식 출력하기도 꽤 간단했다. \( )
안에 잘 넣어주니 정답이었다.
나의 답)
import Foundation
let inp = readLine()!.components(separatedBy: [" "]).map { $0 }
let (s1, s2) = (inp[0], inp[1])
print("\(s1)\(s2)")
문자열 붙여서 출력하라는게 처음에 그냥 이어서 쓰라는건가? 근데 그게 맞음 쉽다 쉬워
나의 답)
import Foundation
let s1 = readLine()!
s1.forEach {
print($0)
}
이건 그냥 반복문으로 해서 돌리면 되겠는데? 하고 for-in
문으로 쓰려고 하다가 문득 foreach
문을 배웠던게 기억났다.
이번 프로젝트에서도 잠깐 보았지만 foreach
문을 사용하면 같은 반복문이더라도 훨씬 짧게 줄여줬던게 생각이 났고 적용했다.
forEach
문에서는 break
나 continue
를 사용할 수 없다는걸 기억하자. forEach
는 모든 요소를 하나씩 처리하는 동작에 최적화된 메서드이기 때문에 반복 중간에 멈추거나 건너뛰는 기능이 없다.
만약 반복을 중단하거나 특정 조건을 건너뛰고 싶을 때는 코드를 forEach
대신 for-in
문으로 사용해야 한다.
그리고 $0
은 첫번째 Array
라고 했던 기억이나서 그냥 프린트 해보자! 하고 했는데 정말 됐다..
알아온 설명을 덧붙이자면,
$0
은 Swift에서 forEach
나 클로저에서 사용되는 "위치 인자
"(positional argument) 라는 것인데 함수나 클로저 내에서 호출된 파라미터의 순서를 나타낸다.
forEach
에서 Array
의 각 요소를 순서대로 접근할 때, forEach
의 클로저는 기본적으로 한 개의 인자를 받는다. 따라서 forEach
내부에서는 첫 번째 인자를 $0
으로 접근하는 것이다.
그리고 꼭 foreach
문에서만 사용되는 것도 아니다. 다른 클로저에서도 사용 가능한데, 예를 들어 map
을 사용해본다고 해보자.
let fruits = ["apple", "orange", "banana"]
let uppercasedFruits = fruits.map { $0.uppercased() }
print(uppercasedFruits) // ["APPLE", "ORANGE", "BANANA"]
여기서도 $0
은 fruits
배열의 현재 요소를 가리키고 있고, map
은 배열의 각 요소를 가져와서 새로운 값으로 바꿔주는 역할을 한다. 해당 코드의 경우 각 요소를 대문자로 바꿔주고 있는 것이다.
numbers.map { $0 * 2 }
와 같이 $0
사용하여 클로저 안에서 $0
는 인자의 이름을 직접 쓰지 않아도 첫 번째 인자를 가져올 수 있는 간단한 방법이다.
오늘 프로그래머스 문제를 풀다 마지막 문제에서 forEach
문을 사용하여 문제를 해결한 부분이 기억에 남는다. 기존에는 주로 for-in
문을 사용해 요소를 순회했었는데, 이번에는 forEach
를 활용하면서 조금 더 간결한 코드 작성의 장점을 경험하게 된 듯 하다.
forEach
는 코드가 간결해지는 장점이 있지만 반복 중간에 break
나 continue
를 사용할 수 없다는 제한도 함께 있다는 것을 깨달았다.
덕분에 forEach
가 모든 요소를 한 번씩 처리할 때 유용하다는 점, 그리고 특정 조건에서 반복을 중단해야 하는 경우에는 for-in
이 더 적합할 수 있다는 점을 다시 한번 되새겨볼 수 있었다.
처음에는 forEach
내에서 $0
와 같은 표현이 익숙하지 않았지만, $0
이 클로저의 첫 번째 인자를 나타내며 현재 요소를 간단히 참조할 수 있다는 점을 익히고 나서는 코드가 훨씬 깔끔해졌다.
앞으로 클로저를 사용할 때 필요하지 않은 경우에는 굳이 인자 이름을 명시하지 않고 $0
를 활용하는 것이 더 좋겠다는 생각이 들었다. 근데 이것도 막상 쓰려면 생각이 나질 않더라.
이번 경험을 통해 코드가 더 읽기 쉬워질 수 있도록 상황에 맞게 forEach
와 for-in
을 구분하여 사용하는 연습을 계속 해보려 한다.
forEach
는 모든 요소를 순회할 때 쓰면 좋을 것이고.. 다음에는 아주 잠깐 공부했었던 map
, filter
같은 다른 고차 함수와도 함께 활용해서 다양한 코딩문제를 풀어보고 싶다.
아닛?! 내가 날짜를 착각했나???