BLO9
Kotlin 등 개발 관련 포스팅합니다.
[자바에서 코틀린으로 - 4] JVM : Kotlin 소스로 보는 빠른 문법

Spring, Android에서 사용할 수 있는 코드로 문법을 빠르게 배워보자. 주석으로 설명을 달아두었다.

// 이 클레스는 상속가능이라고 정의한다 - 자바와 반대로 final(상속 불가능)이 아닌 open으로 명시한다.
open class Foo() {
    val baz = 123 // Int 형이라고 자동 명시되었다.
    // 기본 생성자()와 (Int)생성자 2개 
    constructor(var foo: Int) // foo는 클래스 변수로 선언되었다.
}

class Bar: Foo() {
    // 모든 생성자 후
    init {
        
    }
    
    fun printSome() = baz
}
@Entity
// 생성자에서 글로벌 변수를 지정할 수 있다.
class User(
        @Id
        @GeneratedValue(generator = "system-uuid")
        @GenericGenerator(name="system-uuid", strategy = "uuid")
        var id: String? = null, // 함수 파라미터, 객체 기본값 정의

        // @get:은 getter 함수에 어노테이션을 정의하겠다는 의미
        @get:Email
        @get:Length(max = 50)
        @Column(unique = true)
        var username: String? = null,

        @JsonIgnore
        var password: String? = null,

        @get:JsonIgnore
        @set:JsonIgnore
        var authorities: UserRole = UserRole.READER,

        @get:JsonIgnore
        @set:JsonIgnore
        var isEnabled: Boolean = true,

        @get:JsonIgnore
        @set:JsonIgnore
        var isCredentialsExpired: Boolean = false,

        @get:JsonIgnore
        @set:JsonIgnore
        var isAccountExpired: Boolean = false,

        @get:JsonIgnore
        @set:JsonIgnore
        var isAccountLocked: Boolean = false

//  클레스 상속은 `()`를 붙여 생성자를 override하고 `,`로 나열해서 클레스와 인터페이스를 상속을 한다.
): TimestampEntity {
    
    // 오버라이드는 어노테이션이 아니라 필수 키워드로 정의해야만 한다.
    override
    var updateDate: Date? = null

    override
    var createDate: Date? = null

    // 함수 반환형을 명시하지 않아도 리턴값으로 정의된다.
    // String bind로 '+' 가 아닌 아래와 같은 형식으로 쉽게 스트링을 만들 수 있다. 
    override
    fun toString() = "User(id=$id, username=$username, password=$password, authorities=$authorities, isEnabled=$isEnabled, isCredentialsExpired=$isCredentialsExpired, isAccountExpired=$isAccountExpired, isAccountLocked=$isAccountLocked, updateDate=$updateDate, createDate=$createDate)"

    override
    fun equals(other: Any?): Boolean {
        // == 은 자바 equal 함수와 같고 === 은 자바 == 와 같다.
        if (this === other) return true
        if (other?.javaClass != javaClass) return false

        other as User // 형변환은 (Type) value 가 아닌 

        if (id != other.id) return false

        return true
    }

    override
    fun hashCode(): Int {
        // null 기본값 정의 `nullable?:value`
        return id?.hashCode() ?: 0
    }
}

interface TimestampEntity {
    // 인터페이스에서 상속변수를 만들 수 있다.
    @get:Temporal(TemporalType.TIMESTAMP)
    var updateDate: Date? // 기본값이나 null을 지정하지 않아야한다.
    @get:Temporal(TemporalType.TIMESTAMP)
    var createDate: Date?
    @PrePersist
    fun onCreate() {
        createDate = Date() // 객체를 생성할 때 `new`키워드를 명시하지 않는다.
        updateDate = createDate
    }
    @PreUpdate
    fun onUpdate() {
        updateDate = Date()
    }
}

User.kt - 스프링 Jpa Entity 유저객체

// 클래스 상속방법은 `()`를 추가하면 된다.
class WebSecurityConfig: WebSecurityConfigurerAdapter() {

    @Autowired
    lateinit // 키워드로 notnull 이지만 이 변수를 사용할 수 있을때는 null이 아닌 것 이라고 명시한다. 
             // 참고로 기본형(Int, Long, FLoat... 등)들은 지원하지 않는다. 
    var bCryptPasswordEncoder: BCryptPasswordEncoder

    @Autowired
    lateinit
    var userDetailsService: UserDetailsService
}

Spring configure

// 코틀린 클래스는 기본값이 final이다. 그래서 상속을 할 경우에는 상속할 클레스와 함수에 open 키워드를 추가해야 한다.
class MainView : Activity() {
    // []와 같은 리스트 생성이 불가능하다 listOf - add 불가능한 목록, arrayOf, mutableListOf - add 가능한 동적 리스트 등
    // 많은 함수들이 있다.
    val fragments = listOf(SomeFragment1(), SomeFragment2())
    
    override
    fun init() {
        super.init()
        // 클레스 함수를 실행하기 위해서는 `::`키워드를 사용한다.
        startService(Intent(applicationContext, SomeService::class.java))
        setContentView(R.layout.activity_main)
        // Kotlin Android Extension을 이용하면 Activity에 자동으로 뷰들이 지정되어 findViewById를 사용할 필요가 없다.
        toolBar.inflateMenu(R.menu.menu_main_diary)
    }
}

kotlin 홈페이지에 문서가 무척 잘되어 있다. 홈페이지에서 문법을 더 정확하게 배우는 것을 추천한다.”