[Objective-C] 정적변수, static, extern

Java에서는 static 키워드는 클래스 내부에서 단 하나의 값을 유지할 수 있는 변수 – 전역변수- 를 선언하는데 사용한다. (접근자에 따라 다른 클래스에서의 접근 유무 결정 가능)

Objective-C에서 static 키워드는 Java의 그것과는 약간 다른 의미를 가진다.

우선 Objective-C 에서는 클래스,메소드 선언문 밖에서 선언된 모든 변수는 전역 변수로 사용되며 Java의 static 변수와 비슷한 형태로 동작한다. 전역변수는 별다른 초기화 기능을 구현하지 않는 한 처음 실행될 때 모두 0값으로 초기화 된다.

static 키워드는 전역변수의 접근성을 결정한다. static 키워드가 붙은 전역변수는 선언된 파일 내에서만 접근 가능하며, static 키워드가 없는 전역변수는 어느 파일에서든 extern 구문을 이용하여 접근 가능하다.

특히 메소드와 같은 코드 블록에서 static 키워드로 선언된 변수의 경우, 선언된 블록 내에서만 접근 가능하다. 전역 변수의 성질에 맞게 메소드를 다수 호출해도 static 선언 변수는 값을 매번 초기화 하지 않고 유지한다.

아래와 같이 간단한 테스트 코드를 작성해서 위 내용을 확인해 보았다.

StaticVariableTest1.h 파일 : static 키워드 있는/없는 전역 변수 정의 하였고, 변수 초기화 그리고 변수의 값을 로그로 남기는 메소드 정의하였다.

StaticVariableTest1.m 파일  :   static 선언 파일 내에 있으므로 두 가지 전역변수 모두에 접근 가능하다.

StaticVariableTest2.h 파일 : 다른 파일 – StaticVariableTest2 – 에서 StaticVariableTest1.h에서 정의한 전역변수 값 변경 확인 및 블록 내에 선언한 static 변수 작동 원리 확인 목적

StaticVariableTest2.m 파일 : static 선언 변수 – staticVariableWithStatic – 에 접근 할 수 없다. 컴파일 에러 발생

테스트 main : StaticVariableTest2 에서 구현한  loopMethod 를 for 문 안에서 실행시키면 내부 static으로 선언한 변수의 값이 1씩 증가함을 로그를 통해 확인 가능하다. 

로그 결과

extern은 다른 모듈에 선언된 전역변수 뿐 아니라 메소드를 사용하는데 이용된다. 보통 extern 구문은 해당 변수나 함수를 사용하려는 헤더 파일에 지정한다.

컴파일러는 extern으로 선언한 변수나 함수가 다른 모듈 어딘가에 정의돼 있다고 가정하고 컴파일 한다. 이후 extern변수나 함수를 실제 변수와 함수에 연결하는 작업은 linker 가 담당해 처리하고, 결과적으로 모든 변수와 함수가 연결된 실행 파일이 생성된다.

extern 구문의 과다 사용은 – 특히 함수에 적용 – 잘 짜여진 구조의 SW를 개발하는데 걸림돌이 될 수 있을 것 같다는 생각이 든다.

[updated] static, extern 이해 및 실제 사용에 도움 되는 글을 링크한다.
NSHipster : C Storage Classes

*  Reference : Learn Objective-C for Java Developers

Advertisements
Leave a comment

2 Comments

  1. 한일청

     /  February 10, 2014

    좋은정보 감사합니다.

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: