external iterator - 외부 반복자, 명령형 스타일에서 사용 // 프로그래머가 시퀀스를 명시적으로 제어 가능
internal iterator - 내부 반복자, 함수형 스타일에서 사용 // 시퀀스를 대신 제어해주고 프로그래머가 내부의 행동/로직 또는 연산에만 집중할 수 있도록 함
argument matching 기능을 통해 복잡성을 제거하고 logic을 투명하게 만들어서 코드를 보는 사람들에게 직관성을 줄 수 있도록 하자!
val oneToFive: IntRange = 1..5
⬇️ intRange를 적지 않아도 타입 추론 기능이 변수의 타입을 추론해줌!
example:
val aToE: CharRange = 'a'..'e'
val seekHelp: ClosedRange/ = "hell".."help"
range은 ..연산자의 앞, 뒤 값을 모두 포함한다.
int나 char 반복문은 for(x in ..)문에서 사용 가능하지만,
"hell"부터 "help"까지 반복을 시도하면 문제 발생 >> 이 문자열들의 반복이 갖는 부모클래스 ClaosedRange/에는 iterator()이 없기 때문이다. 하지만 객체를 반복하는 확장함수를 통해 가능하다. 🖐
중위표기법 (inflix notation)으로 downTo를 사용해서 코드를 읽기 쉽게 만들자!
for (i in 5 downTo 1 ) { print("$i, ") }
until() 메소드 : ..와는 다르게 마지막 값 미포함.
step() 메소드 : 반복 중 특정 값 skip
for (i in until 10 step 3) {print("$i, " }
step() 메소드는 .., until, downTo 로 만들어진 IntRange 또는 IntProgression 객체를 IntProgression 객체로 변화시킨다.
filter() 메소드는 람다표현식을 인자로 사용하여, 순차적이지 않은 방법으로 값을 건너뛴다.