For과 While
코틀린에서도 반복문 for과 while을 지원합니다. for 문은 제어 변숫값을 증감하면서 특정 조건이 참일 때까지 구문을 반복해서 실행합니다. 이때 for 문의 조건에는 주로 범위 연산자인 in을 사용합니다.
for-in 반복문 fun main(){ var sum: Int = 0 for (i in 1..10){ sum += i } println(sum) } >> 실행결과 55 (1부터 10까지 순서대로 합함)
위 소스는 for 문을 이용해 1부터 10까지 더하기를 수행합니다. for 문의 소괄호 안에 있는 i in 1..10 코드는 1부터 10까지 1씩 증가하면서 for 문의 실행 영역을 반복하라는 의미입니다. 따라서 총 10번 반복해서 실행합니다.
for 문의 조건은 이와 같이 단순히 1씩 증가 또는 감소하게 만들 수도 있고 2씩 증가하게 만드는 등 다양하게 작성할 수 있습니다.
for (i in 1..10) {…} -> 1부터 10까지 1씩 증가
for (i in 1 until 10) {…} -> 1부터 9까지 1씩 증가(10은 미포함)
for (i in 2..10 step 2) {…} -> 2부터 10까지 2씩 증가
for (i in 10 downTo 1) {…} -> 10부터 1까지 1씩 감소
증감 조건을 숫자로 명시하지 않고 컬렉션 타입의 데이터 개수만큼 반복하게 할 수도 있습니다.
반복 조건에 컬렉션 타입 활용 fun main(){ var data = arrayOf<Int>(10, 20, 30) for (i in data.indices){ print(data[i]) if(i !== data.size - 1) print(",") } } >> 실행결과 10,20,30
배열의 크기만큼 for 문을 반복하게 작성한 소스입니다. indices는 컬렉션 타입의 인덱스값을 의미하므로 for 문을 반복하면서 0,1,2 값을 i에 대입합니다. 만약 for 문을 반복하면서 인덱스와 실제 데이터를 함께 가져오려면 withIndex() 함수를 이용합니다.
인덱스와 데이터를 가져오는 withIndex() 함수 fun main(){ var data = arrayOf<Int>(10,20,30) for ((index, value) in data.withIndex()){ print(value) if (index !== data.size-1) print(",") } } >> 실행결과 10,20,30
for 문 외에 while 문을 이용해 반복문을 작성할 수도 있습니다. while 문은 조건이 참이면 중괄호 {}로 지정한 영역을 반복해서 실행합니다.
while 반복문 fun main(args: Array<String>){ var x = 0 var sum1 = 0 while (x < 10) { sum += ++x } println(sum1) } >> 실행결과 55
클래스와 생성자
클래스 선언
코틀린에서 클래스는 class 키워드로 선언합니다. 다음 코드에서 class User 부분이 클래스의 선언부이며 중괄호 {} 영역이 본문입니다. 만약 클래스의 본문에 입력하는 내용이 없다면 {}를 생략할 수 있습니다.
[ 클래스 선언 – class User { } ]
클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성됩니다. 이 중에서 코틀린의 생성자는 constructor 라는 키워드로 선언하는 함수입니다. 그리고 클래스 안에 다른 클래스를 선언할수도 있습니다.
클래스의 멤버 class User { var name = "kkang" constructor(name: String){ this.name = name } fun someFun(){ println("name : $name") } class SomeClass {} }
클래스는 객체를 생성해 사용하며 객체로 클래스의 멤버에 접근합니다. 그런데 코틀린에서는 객체를 생성할 때 new 키워드를 사용하지 않습니다.
객체 생성과 멤버 접근 val user = User("kim") user.someFun()
User(“kim”)이 객체를 생성하는 구문이며 클래스 이름과 같은 함수로 객체를 생성합니다.
객체를 생성할 때 생성자가 자동으로 호출되므로 소괄호 안에 전달한 인자는 클래스에 선언된 생성자의 매개변수와 들어맞아야 합니다. 앞에서 작성한 User 클래스의 생성자는 constructor(name: String)이므로 문자열 데이터를 전달받는 매개변수가 있습니다. 따라서 객체를 전달할 때 User(“kim”)처럼 문자열 데이터를 전달해 주어야 합니다.