Android.Study

<Android> 자기자신의 객체전달

도슬 2023. 7. 18. 12:43

ㄱ. with보다는 run이 훨씬안전하다. run을 써라
ㄴ. it을 여러개를 사용하면 Shoadw가 되어서 다 가려져버리기떄문에 제대로 참조하지 못할 수 있다.

 

1. let
    var strNum = "10"
    var result = strNum?.let {
        Integer.parseInt(it)                     //중괄호 안에서는 strNum을 it으로 대체가능함
    } //문자열형태의 10을 숫자로 실제 바꿔서
    println(result!!+1)                         //result에 저장

>> let은 현재 내 객체를 it으로 넘겨서 중괄호 안에서 처리를 하고 return하고 var result에 대입해줄 수 있는 목적으로 사용한다.

2. with(중괄호내부 this로 객체전달하고 코드수행하는데 생략가능하므로 null이아닐떄사용)

    var alphabets = "abcd" //a,b,c,d가 들어있으므로 null이 아닌게 확실함
    with(alphabets) {
        var result = subSequence(0,2)  //var result = this.subSequence(0,2) [this를 생략가능하다. 보증하는방법]
        println(result)
    }
>> subSequence의 0번쨰 a부터 출력 2의값 c부턴 잘라낸 값, 즉 a,b만 출력 한다. (문자열을 시작 인덱스부터 끝 인덱스만큼 자른 문자열을 반환한다.)

3. also(중괄호 내부 it으로 자신의 객체전달,반환 / apply와 함꼐 자주 사용)
fun main() {
    var student = Student("참새", 10)        //1.Student에 객체 참새,10 이 담겨있고

    var result = student?.also {            //2. student가 널이아닐떄만 also 실행(결국 밑it이라는 새로운 객체가 result에 담긴다.)
        it.age = 50} //3. 중괄호 안에 student를 it으로 넘겼고 현재 student의 객체 age변수에 접근해서 50으로 바꿧다.

4. apply( 중괄호 내부 this로 자신의 객체 전달,반환 : 주로객체 상태를변화시키고 바로저장)
var result = student?.apply {
        student.age = 50} //1. also와 비슷(also는 it을쓰는데) 얘는 this가 들어온다. 


5. run(with와 달리 null체크 수행가능하므로 더욱 안전하게 사용가능)
fun main() {
    var student = Student("참새", 10)
    student?.run { 
    //?.(null이아닐떄 run을 실행해라) 이렇게 안쓰면 원래 with 안에다 student를 넣고 써야하한다.
        displayInfo()}}     //즉, student.Display Info()가 되야한다. 그러니까 run을 써라, null값도 체크할 수 있다.

6. it을 여러개를 사용해서 누구의 it인지 모를때
Person().also {
it.name = "한석봉"
it.age = 40
  val child = Person().also { c -> //it을 c로 바꿔서 사용
  c.name = "홍길동"
    c.age = 10
  }
  it.child = child} //결국 it은 외부 c는 내부 변경해줘서 사용!
>> it이 여러개면 뭐가 어느 it인지 알 수없으므로 참조하기 힘들 수 있다. 그래서 변경해서 사용