Init
코드를 작성하다보면 데이터를 받아온 후 여러 method에서 사용해야 할 경우가 있는데,
본인은 보통 전역변수로 선언한 후 사용했습니다.
하지만 전역변수를 쓰다보면 버그가 발생할 수 있고, 복잡할 수 있다는 말을 들었고,
Return Method와 전역변수에대해 공부하게 되었습니다.
Organize
전역 변수
- 장점
1. 여러 method에서 동일한 데이터에 접근할 수 있으므로 사용하는데 편리합니다.
2. 함수마다 호출할때 데이터가 유지되기때문에 정적 변수 처럼 사용할 수 있습니다.
- 단점
1. 변수를 어디에서든 접근이 가능하기 때문에 이유를 알 수 없는 버그가 발생할 수 있습니다.
2. 전역변수를 계속 만들다 보면 코드가 복잡해져서 가독성이 떨어집니다.
3. 어디에서든 접근이 가능하기 떄문에 보안에 취약합니다.
4. 여러 스레드에서 동시에 변수에 접근 하면 이유를 알 수 없는 버그가 발생할 수 있습니다.
5. 디버깅에 어려움이 있습니다. 어느 부분에서 전역변수가 수정되었는지 찾는데 어려움이 있기 떄문입니다.
Return Method
- 장점
1. 데이터를 캡슐화하고, private등을 이용해서 접근을 제어할 수 있기때문에 보안에 좋습니다.
2. Return을 이용해서 값을 반환하기 때문에 코드를 재 사용하기 좋습니다.
3. 디버깅이 쉽습니다. 필요한 경우에 Method를 호출하고, Method내에서 데이터를 처리하므로 디버깅이 단순합니
다.
- 단점
1. Method를 호출하면 스택 메모리에 스택이 쌓이기 때문에 성능에 영향을 미칠 수 있습니다.
2. Return Method를 사용할 때 매번 호출하고 반환값을 변수에 저장해야되기때문에 코드가 길어지기 때문에 가독성
이 떨어질 수 있습니다.
3. 여러 Method를 연속으로 호출할 수 있고, 결과값을 다음 Method호출에 전달할 수 있기 때문에 코드가 복잡해지
고, 그래서 수정하는데 어려움이 있을 수 있습니다.
Result
전역변수와 Return Method 모두 각각 장, 단점이 있는데 데이터 보안과 디버깅이 쉽고, 성능이 조금 떨어질 수 있지만 전역변수보다 안정성이 높기때문에 Return Method로 변환해보기로 했습니다.
▼전역변수▼
private var newModel: CommunityEntity? = null
newModel = CommunityEntity(
id = model?.id,
key = model?.key ?: key,
title = binding.communityWriteTitle.text.toString(),
content = binding.communityWriteDescription.text.toString(),
profileNickname = model?.profileNickname,
profileThumbnail = model?.profileThumbnail,
views = model?.views ?: 0,
likes = model?.likes ?: 0,
image = "",
likeUsers = listOf(),
scrapUsers = listOf(),
)
1. newModel을 전역변수로 선언하고 초기화해줍니다.
2. 전역변수에 접근해서 CommunityEntity라는 데이터클래스를 이용해서 값을 넣어줍니다.
3. 어디에서든 전역변수에 접근할 수 있기때문에 변수이름만 가져와서 값을 넣어주면 되고, 사용하기 쉽습니다.
4. 하지만 그렇기 때문에 보안이 취약하고 언제 어디에서 값을 넣어주었는지 찾기가 힘들고, 그렇기 때문에 디버깅이 어렵고, 버그가 발생하기 쉽습니다.
▼Return Method▼
private fun editItem(key: String): CommunityEntity {
return CommunityEntity(
id = model?.id,
key = model?.key ?: key,
title = binding.communityWriteTitle.text.toString(),
content = binding.communityWriteDescription.text.toString(),
profileNickname = model?.profileNickname,
profileThumbnail = model?.profileThumbnail,
views = model?.views ?: 0,
likes = model?.likes ?: 0,
image = "",
likeUsers = listOf(),
scrapUsers = listOf(),
)
}
1. 값을 return해주고, 생성자 옆에 반환타입을 적어주면 됩니다.
private fun editItem(key: String): CommunityEntity = CommunityEntity(
id = model?.id,
key = model?.key ?: key,
title = binding.communityWriteTitle.text.toString(),
content = binding.communityWriteDescription.text.toString(),
profileNickname = model?.profileNickname,
profileThumbnail = model?.profileThumbnail,
views = model?.views ?: 0,
likes = model?.likes ?: 0,
image = "",
likeUsers = listOf(),
scrapUsers = listOf(),
)
2. "="을 이용해서 더 간단하게 만들 수 있습니다.
val newModel = editItem(key)
3. 사용방법은 함수를 변수에 넣어주기만 하면 사용 가능합니다.
4. 꼭 데이터가 아니더라도 함수의 결과를 변수에 넣어서 사용할 수 있는 것만으로도 재활용 할 수 있기 때문에 Return Method는 유용합니다!
썸네일 출처
'TIL, WIL(일기)' 카테고리의 다른 글
231109 구글 스토어 앱 업데이트 하기 (0) | 2023.11.09 |
---|---|
231108 SearchView - onQueryTextChange (0) | 2023.11.09 |
231106 [Trouble Shooting] ListAdapter 갱신 이슈 (0) | 2023.11.06 |
231104 오늘의 억까 (0) | 2023.11.04 |
231103 [Trouble Shooting] 게시글 수정 시 RDB에 새 글이 추가되는 이슈 (Feat.추가이슈) (0) | 2023.11.03 |