<Android> 자기자신의 객체전달
ㄱ. 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인지 알 수없으므로 참조하기 힘들 수 있다. 그래서 변경해서 사용