본문 바로가기
개발새발/코틀린

[코틀린/Kotlin] 함수 및 클래스 구조

by 조희우 2025. 8. 12.

함수

기본 구조

  • 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

연습문제 - 함수

실습

  1. 두 수를 더하는 함수 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 형태로 호출한다. 추가적인 초기화 로직 혹은 인스턴스 생성 시 사용된다.