티스토리 뷰

Android & Kotlin

Kotlin 고급 문법 정리

CodingTrader 2021. 5. 16. 15:03
728x90

1. Lamba
람다표현식은 우리가 마치 value 처럼 다룰 수 있는 익명 함수이다.
1) 메소드의 파라미터로 넘겨줄 수 있다. fun maxBy(a : Int)
2) return 값으로 사용할 수 있다.

3) 메소드를 표현하는, 함수의 다른 표현방식이다.

 

리턴을 써도 되고 안써도 되는데, 람다 표현식을 쓸때는 리턴을 생략하는 경우가 많다.

람다의 기본정의
val, var lamdaName : Type = {argumentList(a : Int) -> codeBody (어떻게 할건지.. 코드작성부분)}

왼쪽의(Int) -> Int 나  number:Int 를 써줘야 타입추론 가능

 

람다에서는 마지막에 있는 코드줄이 리턴 값이다. (String,Int) -> String

 

타입추론 예시 (출처: https://www.youtube.com/watch?v=Q5noYbbc9uc&t=90s)

확장함수 - (람다 표현식 하고는 다름)

 

fun String.introduce() {
    print("hello $this")
}

"Kim".introduce()

 

 




람다의 Return

 


//람다를 표현하는 여러가지 방법 총 4가지
// 1. 메소드에 파라미터로 넘겨주는 방법

 



//fun의 마지막 파라미터가 람다식일 경우invokeLamda ({it > 3.22}) == () {it > 3.22} () 생략 가능 

 

 

 

버튼 리스너에서도 람다식이 사용가능 하지만 조건이 필요하다.

 


2. 그 인터페이스는 딱 하나의 메소드만 가져야 한다.


2. DataClass
pojo class 어떤 모델이 되는 클래스

메소드가 특정 행동을 하는 것 보다 비어있는 틀 역할을 하는 클래스, 데이터를 담는 클래스

 

pojo class를 만들기 위해 자바는 일일히 다 써줘야 했지만 쓸모없는 코드를 줄이기 위해 Kotlin에서는 DataClass 사용

data class Ticket(val companyName : String, val name : String, var data : String, var seatNumber : Int)
//toString(), hashCode(), equals(), copy() 등등 자동으로 생성해준다.

val ticketA = Ticket("Koreanair" , "Kim", "2021-05-05", 15)

 

 


class와 dataclass 차이 
dataclass 를 이용해서 println 하게 되면 해당 객체의 내용을 보여주고, class의 경우 메모리 주소값을 리턴 - 왜?

println 메소드 하는짓

어떤 객체를 toString 해줘서 print 해준다

받은거를 tostring 해줘서 콘솔에 출력

data classs 를 생성하면 toString을 자동으로 오버라이딩해줘서 print하기 때문에 해당 객체의 내용을 보여준다.


dataclass를 몇개를 만들 수 있다, java로는 못함 - 왜?

 

java는 한 파일에 한 클래스

코틀린은 파일 기반이라 여러개의 클래스 가능

Kotlin 온라인 컴파일러 공유기능

 


3. companion object


java의 static 대신에 사용되는 것, Kotlin 에서는 static이 없기 때문에 companion object를 사용하여 정적인 메소드나 정적인 변수를 선언 할때 사용, private properties  method를 읽어올 때 사용한다.

 

자바의 static은 클래스의 멤버임을 지정하기 위해 사용한다. static이 붙은 변수와 메소드를 클래스 변수, 클래스 메소드

static이 붙지 않은 클래스 내의 변수와 메소드는 각각 인스턴스 변수, 인스턴스 메소드라 부른다.

 

static이 붙은 멤버는 클래스가 메모리에 적재될 때, 자동으로 함께 생성되기 때문에, 인스턴스 생성 없이

클래스명.~~~ 으로 바로 참조 할 수 있다.

 

Kotlin에서 Companion Object는 java의 static처럼 쓰기 위해서 사용하는 것이며, Static은 아니고 객체이다. (사용하는 입장에서는 static으로 동작하는 것 처럼 보인다.)

 

 

클래스명.Companion 형태로 사용한 것은 Myclass가 메모리에 적재되면서 함께 생성되는 Companion(동반)되는 객체이고 접근할 수 있다는 점이다.

위에서 Myclass.TEST , Myclass.method는 Myclass.Companion.TEST 의 축약 표현을 자주 쓰기 때문에 static으로 동작하는 것 처럼 보이는 것이다.

 

Companion Object는 객체이기 때문에 변수에도 할당이 가능하다.



4. Object 

Singleton Pattern 앱을 실행 할 때 딱 1번 만들어 진다. 다시는 객체를 생성하지 않는다. 불필요하게 메모리 사용되는 것을 방지, 인스턴스(메모리에 올라가 있는 객체)가 하나만 있는 클래스

 

Singleton Pattern이기 때문에 시스템 전체에서 쓸 기능(메소드로 정의)을 수행하는 데는 큰 도움이 될 수 있지만, 전역 상태를 유지하는 데 쓰면 Thread safety 등으로 위험할 수 있으니 주의해서 사용해야 합니다.

 

언어 수준에서 안전한 Singleton Pattern을 만들어 준다는 점에서 object는 매우 유용하다.

 

싱글톤 패턴 사용

 

익명클래스 만드는 방법

object는 특정 클래스나 인터페이스를 확장(var obj = object:MyClass(){} 또는 var obj = object:MyInterface{})해 만들 수 있으며 위처럼 선언문이 아닌 표현식(var obj = object{})으로 생성할 수 있습니다.

 

마지막으로 요약 하자면, Object와 Companion Object의 사용은 해결하고자 하는 문제에 맞게끔 사용하면 된다. Singleton 동작을 제공해야 하는 경우 Objects를 사용하는 것이 좋으며. 그렇지 않으면 클래스에 Static만 추가하려는 경우 Companion Object를 사용할 수 있다. 

 

 

참조: https://www.bsidesoft.com/8187

728x90

'Android & Kotlin' 카테고리의 다른 글

Activity Life Cycle  (0) 2021.06.21
Activity 와 Fragment  (0) 2021.05.22
Android Studio .idea 에 있는 file들은 무엇인가?  (0) 2021.05.11
Kotlin 기본 문법 정리  (0) 2021.05.06
Hiding API Keys  (0) 2021.04.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함
250x250