method & Class

Woozy9ucci·2023년 12월 5일
0

KOTLIN

목록 보기
2/4
post-thumbnail

메소드와 클래스 설계에 대해 살펴보자.

메소드 설계

fun 키워드를 활용하여 생성한다.

fun method() {
    println("메소드")
}

fun method2(input: String): String {
    return input
}

파라미터와 리턴 타입은 두 번째 코드와 같이 설정할 수 있다.

클래스 설계

클래스는 프로퍼티(필드 in java)와 메소드로 구성된다.

  • 생성자
class User(var nickname: String)

위와 같이 클래스명 옆에 괄호를 '주 생성자(PrimaryConstructor)' 라고 한다.
생성자 파라미터를 지정하고 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의 한다.
프로퍼티의 선언과 초기화를 같이 함

class User(nickname: String) {
	var nickname = nickname
}

위와 같이 var/val 이 없다면 선언과 초기화를 직접 해야한다.

주 생성자에 코드를 작성 할 수 없으므로 초기화 시 필요한 작업(유효성 검증 등)이 있다면
'init'블록 을 사용 할 수 있다. 인스턴스가 생설될 때 init블록이 실행된다.(초기화 전)

class B private constructor(val name: String, val age: Int)

사실 클래스 이름 옆의 constructor 키워드가 생략된것이며 주 생성자가 접근제어자 등을 가지면 이를 생략할 수 없다.

'부 생성자(Secondary Constructor)'
클래스 블록 내에 constructor 키워드를 통해 사용
주 생성자가 존재한다면 부 생성자는 반드시 주 생성자에게 생성을 위임해야 한다.

(T1클래스는 주생성자() 가 존재 하는데 부 생성자가 생성을 위임하지 않아 컴파일 에러가 난 모습)

(예를 들어 부 생성자로 인스턴스 생성시 인자를 받아오잖아? 그때 받아온 인자 중 주 생성자 파라미터에 해당하는 인자를 무조건 넘겨야 한다는 거지)
(아래 그림에서 세번째 생성자는 두번째에게 위임했는데 이로 인해 간접적으로 위임한 꼴이 된거지.
세번째도 직접 위임해도 돼.)

class D(val name: String) {

    var age: Int = 20
    var height: Int = 500
    
//    conflicting overloads (주생성자와 똑같기 때문)
//    constructor(name: String) : this(name) {
//    }

//    Primary constructor call expected (주 생성자 호출이 안됐다 이거지)
//    constructor(name: String, age: Int) {
//        this.age = age
//    }

    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }

    constructor(name: String, age: Int, height: Int) : this(name, age) {
        this.height = height
    }
}

실행은 Init블록 -> 부 생성자 순으로 실행된다.
주 생성자나 부 생성자를 구현하지 않을 경우 코틀린이 인자가 없는 생성자를 자동으로 생성해 준다.
ex) Class test {}
-> var test1 = Test()

참고
https://velog.io/@conatuseus/Kotlin-%EC%83%9D%EC%84%B1%EC%9E%90-%EB%BF%8C%EC%8B%9C%EA%B8%B0

0개의 댓글