함수
기본 구조
- return하지 않는 함수 (void 함수)에 선언한 리턴타입 Unit은 생략이 가능
- parameter(파라미터): 함수에 전달할 값으로 식별자와 타입으로 구성
- 파리미터는 함수에 정보를 전달하는 방법을 정의
- 함수에 전달할 정보를 넣는 장소
- 인자(argumnet): 함수에 전달하는 실제 값
- 이름, 파라미터, 반환타입은 함수 시그니처(function signater)
fun functionName(parameter: ParameterType): Unit{...}
fun functionName(parameter:ParameterType): ReturnType{
return result
}
멤버 함수(Member funcion)
- 클래스 혹은 object 내에 정의된 함수
class Date(){
fun getDate(){
...
}
}
- getDate()는 Date 클래스 내에 정의된 멤버 함수
- .을 이용하여 호출 가능: Date().getDate()
- Date클래스의 instance를 만들고 getDate를 호출
단일 표현식 함수
- 함수의 본문이 단일 표현식만 포함된 경우 사용
- 중괄호와 return문을 생략하고 =기호를 사용하여 직접 반환
- 식이 본문인 함수라고도 표현
fun sum(a: Int, b: Int) = a+b
클래스
- static 키워드를 지원하지 않음
- 최상위 함수와 객체 선언으로 대체
- companion object(동반 객체)를 통해 클래스 안의 priavate 멤버에 접근할 수 있는 statice 메서드를 선언
클래스 선언
- class 키워드 뒤에 클래스 이름
- 기본 가시성은 public으로 생략 가능
- 이름 규칙은 파스칼케이스를 따름
- 멤버변수: 내부 변수 선언 가능
- 암묵적으로 getter와 setter 선언
- get() / set() 메서드로 커스텀 가능
- 초기화 블럭: 객체 생성 시 초기화 블럭 실행
- 위에서부터 실행되며 init 블럭에서는 해당 블럭보다 위에 선언된 멤버변수, 생성자 변수만 사용 가능
- 내부 함수: 클래스 내부에 함수 선언 가능
class Person {...}
public class Person{...}
프로퍼티 선언
- 프로퍼티는 선언과 동시에 초기화
class Person {
var name: String = ""
var age: Int = 0
}
클래스 생성자
- 기본 생성자와 보조 생성자로 나뉨
- 보조 생성자를 호출하면 내부에서 기본 생성자를 호출하여 클래스 초기화 → 보조 생성자 블럭 실행
- constructor라는 키워드를 사용하여 선언 가능: 보조 생성자
class Person{
constructor (name: String, age: Int){
this.name = name
this.age = age
}
var name: String = ""
var age: Int = 0
}
- 기본 생성자는 클래스 이름 옆에 선언 가능하며 constructor키워드 생략 가능
class Person constructor (name: Stirng, age: Int){
var name: String = name
var age: Int = age
}
class Person(name: String, age: Int) {
var naem: String = name
var age: Int = age
}
- 기본 생성자를 유지하며 각기 다른 값 설정: constructor 키워드를 사용하여 생성자 오버로드
- name: 초기화, age: 초기값
class Person (name: String, age: Int) {
constructor(name: String) {
this.name = name
this.age = 0
}
var name: String = name
var age: Int = age
}
val p1 = Person("생각하는", 20) // name="생각하는", age=20
val p2 = Person("개발자") // name="개발자", age=0
연습문제 - 함수
실습
- 두 수를 더하는 함수 add를 작성하시오.
fun add(num1: Int, num2: Int): Int{
return num1 + num2
}
fun add(num1: Int, num2: Int): Int = num1 + num2
2. 문자열을 받아서 대문자로 변환하는 함수 toUpperCase를 작성하시오.
fun toUpperCase(inputStr: String): String{
return inputStr.toUpperCase()
}
3. 이름과 나이를 받아서 "이름: 나이" 형태의 문자열을 반환하는 함수 info를 작성하시오.
fun info(name: String, age: Int): String{
return "$name: $age"
}
4. 정수를 하나 받아서 그 숫자의 제곱을 반환하는 함수를 작성하시오.
fun square(num: Int): Int {
return num * num
}
5. 두 문자열을 받아서 연결한 결과를 반환하는 함수를 작성하시오.
fun concatStrings(str1: String, str2: String): String {
return str1 + str2
}
6. 정수 리스트를 받아서 리스트의 모든 요소를 더한 값을 반환하는 함수를 작성하시오.
fun sumList(numbers: List<Int>): Int {
var answer = 0
numbers.forEach{ number ->
answer += number
}
return answer
}
fun sumList(numbers: List<Int>): Int {
return numbers.sum()
}
미니 퀴즈
1. 다음 함수의 반환 타입은?
fun greet(name: String) {
println("Hello, $name!")
}
답: Unit
2. 함수 max는 두 정수 중 큰 값을 반환한다. 빈칸을 작성하시오.
fun max(a: Int, b: Int): Int {
return if (a > b) _____ else _____
}
답: a, b
3. 기본 매개변수 값을 가지는 함수의 예시를 작성하시오.
fun pow(x: Int, y: Int=2): Int{
var result = x
for(i in 1 until y){
result *= x
}
return result
}
4. 아래 함수의 호출 결과는 무엇인가?
fun double(x: Int) = x * 2
println(double(4))
답: 8
5. 반환값이 없는 함수는 어떤 반환 타입을 가질까?
답: Unit
연습문제 - 클래스
실습
1. 속성 model(String, val), year(Int, var)를 가진 Car 클래스를 작성하고 drive() 메서드에서 "모델명(model)이 운전 중입니다." 출력하시오.
class Car(val model: String, var year: Int){
fun drive(){
println("모델명($model)이 운전 중입니다.")
}
}
2. Person 클래스를 만들고 이름(name)과 나이(age)를 속성으로 받는 생성자를 정의하시오. introduce()메서드에서 입력받은 이름과 나이를 활용하여 "내 이름은 ㅇㅇㅇ이고 나이는 ㅇㅇ살입니다."를 출력하시오.
class Person(val name: String, val age: Int){
fun introduce(){
println("내 이름은 $name이고, 나이는 $age살입니다.")
}
}
미니 퀴즈
1. 아래 클래스에서 val과 var의 차이는?
class Sample(val a: Int, var b: Int)
답: val는 불변형변수로 값을 받은 후 수정이 불가능하고 var는 가변형 변수로 값 수정 혹은 연산을 통한 값 변경이 가능하다.
2. 객체 생성 방법은 무엇이며 Sample 클래스의 인스턴스를 생성하기 위해서는 어떻게 해야하는지 설명하시오.
답: 객체 생성을 하고자하는 클래스를 호출하며 사용할 인스턴스를 변수에 할당한다.
Sample 클래스의 인스턴스는 val sample = Sample()로 생성할 수 있다.
3. 다음 코드의 실행 결과는?
class Test(val x: Int) {
fun printX() {
println(x)
}
}
val t = Test(10)
t.printX()
답: 10
4. 클래스에 메서드를 추가하는 이유는?
답: 클래스의 기능을 구현하는 부분이다. 클래스는 이런 유사한 메소드들을 묶어 놓는다.
→ 보충: 객체의 동작을 정의하기 위해서
5. 기본 생성자와 부 생성자의 차이는 무엇일까?
답: 기본 생성자는 클래스 선언과 함께 정의되며 클래스 선언 및 초기화를 하는 역할을 한다. 보조 생성자는 constructor 키워드를 사용하여 정의하며, this 형태로 호출한다. 추가적인 초기화 로직 혹은 인스턴스 생성 시 사용된다.
'개발새발 > 코틀린' 카테고리의 다른 글
[코틀린/Kotlin] 컬렉션 (3) | 2025.08.16 |
---|---|
[코틀린/Kotlin] 상속과 인터페이스/추상클래스 (2) | 2025.08.13 |
[코틀린/Kotlin] 조건문과 반복문 (2) | 2025.08.11 |
[코틀린/Kotlin] 자료형과 변수 (5) | 2025.08.09 |
[Kotlin] 코틀린의 자료형 (데이터 타입) (2) | 2024.01.03 |