본문 바로가기
TIL, WIL(일기)

231107 Return Method

by 도슬 2023. 11. 7.

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는 유용합니다! 

 

 

 

 

 

 

 

썸네일 출처

https://kr.freepik.com/free-photo/cute-ai-generated-cartoon-bunny_40572297.htm#query=%EA%B7%80%EC%97%AC%EC%9A%B4%20%EB%8F%99%EB%AC%BC&position=25&from_view=keyword&track=ais