defer의 기본기능

defer란 단어는 미루다 / 연기하다 라는 뜻으로 함수 안에서 작성되는 클로저이다. 특징으로는 무조건 함수 종료 직전에 실행된다는 것! 맨 마지막 실행순서로 미루는 것 이다.

특징

defer라는 클로저를 열고 원하는 코드를 작성하면 된다. 다만 defer 블록 이전에 함수가 return 되면 당연히 defer 블록도 실행되지 않는다.
또한 같은 함수 내에서 여러개의 defer를 호출할 수 있으며 이때 실행 순서는 코드 순서의 역순이다.
여러개가 사용이 가능한만큼 중첩해서 사용도 가능하다. 실행순서는 가장 바깥쪽 defer 부터 실행이 되므로 이것역시 역순? 이라고 볼 수 있다.

사용방안

  • 함수를 종료하기 직전에 정리해야 하는 변수나 상수를 처리하는 용도

함수가 실행될때 동작하는 특정 작업에따라 종료에도 필히 해줘야하는 작업이 생기는 경우가 있다. SQLite3를 사용할 때 함수 실행 시작에서 DB를 실행했으면 함수 실행 종료 직전에 DB를 종료시켜준다던지..
또한 오류처리에 유용하다고 한다. 예를 함수 내에서 파일을 열어서 사용하다가 오류가 발생해 정상적으로 함수가 종료되지 않는다면, 해당 상황들마다 예외처리로 파일을 종료해 줘야 메모리에서 깔끔하게 제거할 수 있다. 이런 상황에서 defer가 유용하게 쓰인다고 한다.

func readFile() {
	let file = openFile()

	if  ... {
		close(file)
		return
	}

	if ... {
		closer(file)
		return
	}
} 

이렇게 각각 조건마다 파일을 닫는 것이 아니라 defer 구문을 맨위에 작성하여 어떤 방법으로던지 함수가 종료되면 파일을 안전하게 종료할 수 있다.

func readFile() {
	let file = openFile()
	defer {
		close(file)
		}
	
	if	... {
		return
	}
	
	if ... {
		return
	}
}

아직은 적절한 사용처가 생각나지 않지만 코드를 좀 더 명확하게 작성하려면 쓸 수 있는 경우가 있을 것 같다.

태그: ,

카테고리:

업데이트:

댓글남기기