돌아오신 걸 환영해요
이번 강의에서는 로컬과 글로벌 변수에 대해 얘기해 볼게요
함수스코프나 일반 프로그램 범위의 개념이죠
변수를 사용할 수 있을 때와 사용할 수 없을
때의 차이예요
어떤 기능인지 알아요
이제 로컬 변수에 대해 얘기해보죠
하지만 국지 변수는 기능 이상의 역할을 해야 해요
로컬 변수는 코드 블록과 관련이 있어야 해요
함수 안에서 정의된 변수는 자동 로컬 변수로
알려져 있죠
네 네 함수 본체에서 괄호 시작과 끝 사이에
변수를 선언하면 그 변수는 로컬 변수입니다
함수가 호출되는 시간이 자동으로 생성되죠
또한 변수에 대한 theaccess의 모든 값은 함수에
대한 로컬이죠
그 함수의 변수 측면에 접근할 수 없어요
특정 함수에 로컬이라면 변수가 다른 함수에도
접근할 수 없죠
정의된 곳에서만 액세스 가능하죠
네 네 함수 안의 변수에 초기 값을
주면 함수가 호출될 때마다 그 초기 값을 변수에
할당해요
네 변수에서 값을 유지하고 싶다면 일련의 호출마다 한
가지 방법이 있어요 C#에서는 함수 안의 정적
변수라고 합니다
네 이건 좀 더 고급 개념이죠 초급반은
아니지만 함수를 호출할 때마다 다른 데이터를
얻을 수 있는 방법이에요
네 그래서 만약 여러분이 예를 들어 함수가 몇 번 호출되는지에 대한 counter를
유지하고 싶다면 함수 안에 로컬 변수를 정적이라는 이름으로 선언해야
합니다 정적 키워드로요
하지만 정규량 변수 없이는 매번 새
값을 갖게 되죠
데이터 형식 전에 자동 키워드도 쓸 수 있지만 불필요해요
그래서 좀 더 정확하죠
컴파일러가 추가할 거예요 만약 포함시키지 않으면요
하지만 포함시키면 좀 더 정확해질
거예요 불필요하죠
아나우토매틱 로컬 변수라고 하죠
네 c에는 auto라는 키워드가 있지만 제공할 필요는 없어요
기본값으로 제공되죠 그래서 함수 안에서 변수가 정의되고
선언되는 많은 예에서 볼 수 없는 겁니다
네 네 로컬 변수는 블록 루프나 if문에 변수가 생성된 어떤
코드에도 적용이 가능합니다
네 다시 만약 if문이 있다면 if문의 블록은 뭘까요? 괄호가
시작되는 부분이에요
그걸 블록이라고 하죠
블록은 함수에도 있고 if문에도 있고
루프에도 있죠
블록은 괄호 어디든 놓을 수 있어요
괄호가 있는 곳이면 어디든 그 변수를 생성하죠
변수 생성은 declringit입니다 그리고 값을 할당할 수도 있죠
네 하지만 그 변수를 선언하면 블록 안에 그 변수를 만드는
거죠 그 변수는 블록 안에서만 사용할 수 있어요
블록 밖에서 그변동성에 엑세스하려 하면 사용되지
않을 거예요
네 if문 안에 변수를 선언하는 if문이
있다면 if문 블록 밖의 그 변수에 접근할 수 있어요
루프도 마찬가지입니다
이걸 이해하는 게 아주 중요해요
컴파일러가 불평하고 오류를 낼 거예요 다른
곳에서 액세스하려 하면요
데이터의 값어치가 해당 블록에만 적용된다는
뜻이죠
데이터를 공유하지 않는군요
전역 변수는 로컬 변수의 이론이에요
전역 변수는 프로그램의 어떤 기능에도 접근할 수 있죠
전역변수를 만드는 방법은 어떤 기능보다
위에 두는 거죠
전역 변수는 함수의 바깥쪽에 지정되어 있고 함수에
속하지 않아요
핵심 키워드는 함수라는 걸 기억하세요
메인 함수를 정의한 모든 변수는 메인 함수에서만
접근할 수 있어요
그래서 주 기능의 변수를 다른 기능에서는
볼 수 없어요
네 모든 함수에서 사용되는 변수를 원한다면 변수를
함수 밖에 두세요 보통 소스 파일 위에 두죠 그리고
이렇게 표시하세요 이건 전역 변수다
네 프로그램이 시작될 때부터 끝날 때까지 변수는 전부 거짓말이에요
전역 변수는 메모리에 위치하게 됩니다
네 프로그램의 어떤 기능도 전역 변수 값을 바꿀 수 있어요 액세스가 있기 때문에 수정할
수 있습니다
그래서 이런 생각을 하셔야 해요 좀 위험하지 않을까? 이제 같은 데이터에
접근할 수 있는 코드가 생겼으니까요
그 얘긴 나중에 하죠
네 네 함수 안에 전역 변수와 같은 이름으로
선언된 로컬 변수가 있으면 그 함수는 로컬 변수를 사용합니다 전역 변수를
가립니다
네 따라서 전역 변수가 x라고 돼 있고 함수 안에 로컬
변수가 x라고 돼 있다면 로컬 변수가 우선이 됩니다
전역 변수 데이터는 수정하지 않을 거예요
동일 변수를 할당하면 로컬
변수만 수정해요
네 전역 변수는 액세스할 수 없죠 이름이 같을 경우
해당 로컬 함수에선 액세스할 수 없습니다 같은 이름은
쓰지 마세요 기본적으로요 헷갈릴 테니까요
프로그래머가 많거나 기술이 발달한 프로그래머라면
이걸 즉시 알아챌 거예요
네 이렇게 말하겠죠 이봐요 이건 그냥 로컬 변수를
수정하는 거예요 이름이 같은 전역 동사를 보더라도요
하지만 초보자에게 항상 명확한 건 아니죠
예를 들어 볼게요
이 예제에선 주요 함수 전 제일 위에 전역 변수를
재생성하고 있어요
네 프로그램을 구성하는 방법도요 보통
주석 뒤에 문장을 맨 위에 포함시키죠 그런 다음 정의된
상수를 갖고 전역 변수도 있고요
전역 변수는 그냥 평범한 변수 같은데요
반응적으로 선언되는 곳일 뿐이죠
기능 밖에서 선언됐다면 글로벌이죠
이 예제에선 전역이라 불리는 아글로벌 변수가 있죠
0으로 초기화하고 있어요
테스글로벌 변수는 어디서든 초기화할 수 있어요
선언할 때 초기화하거나 어떤 함수에서든
초기화할 수 있어요
정수예요
두 가지 함수가 있는데 함수의 메인 함수는
my 함수예요
그 안에 localvariable이 있는데 함수
안에서만 액세스할 수 있어요
메인 기능에는 my local main이 있어요.
메인 기능 내에서만 제 로컬메인에 접속할 수 있어요
네 하지만 전역은 변수인데 전역이기 때문에 주요 함수에서도
액세스할 수 있어요
메인 캔은 로컬과 글로벌에 액세스할 수 있어요
제 함수는 x라는 로컬 변수를 갖고 있어요 함수 본체의
괄호 안에서 선언됐으니까요 그래서 전역 변수에 접근할 수
있죠 제 전역이요
x에 액세스할 수도 있지만 제 로컬에 액세스할 순 없죠
제 로컬 메인이라고 해야겠네요
제 로컬 메인은 메인 기능만 사용하거든요
우린 접근 권한이 없어요
내 함수 안에서 로컬 메인 변수를 쓰거나 읽으려고
하면 컴파일러가 오류를 낼 거예요
로컬과 글로벌의 개념을 이해해야 해요
로컬은 코드의 블록 안에 있어요
신고가 들어오면 수감동에서 법적으로 사용해요
네 블록 밖에 있는 변수가 기능 안에 있거나 프로그램 안에 있다면
어떤 기능에서도 액세스할 수 있어요
글로벌 변수는 피해야 해요
전역 변수가 나쁜 걸 가져오죠
네 네 전역 변수가 나쁘고 그걸 피해야 하는 이유는
기능 간의 연결을 촉진하기 때문이에요
커플링이 뭐죠?
커플링은 종속성을 의미하죠
네 전역 변수가 있는데 4개 함수가 그걸
사용하고 있다면 각각의 함수는 다른 함수에 종속될
수 있다는 뜻이죠
의존적인 게 어때서요?
종속성 때문에 프로그램은 디버깅과 오류를 찾기 힘들죠
네 프로그램에 버그가 있는데 여러분은 전역 변수를 사용하는데
그 전역 변수가 버그를 유발한다면 그 버그는 전역 변수를 사용하는
어떤 함수 어디에든 있을 수 있습니다
글로벌 데이터가 있으면 일이 복잡해져요
네 전역 변수가 있어요 함수 1에서 수정할 수 있죠 함수
2 함수 3 함수 4에서요
거기에 대한 접근을 제한하는 게 아니죠 에러를 찾아내서 분리하면
고치기 힘들 수 있어요
왜냐하면 고쳤을 때 종속성 때문에 다른 함수에서 문제가
생길 수 있거든요
네 전역 변수는 최대한 피해야 합니다
이 커플링과 종속성 때문에요
써야 할 때가 있지만 피해야 해요
네 네 명심할 건 대부분의 현대 언어 c++와 자바
같은 개체 지향적 언어에선 전역 변수 개념조차
없어요
정적 변수가 있어요 클래스 변수일 수도 있지만 여전히 클래스
안에 캡슐화돼 있죠
글로벌 데이터는 나쁜 것이기 때문에 새로운 언어는 실제로
금지하려고 하죠
네 피하셔야 합니다 프로그램을 복잡하게 만들고
에러를 찾고 디버그하기 어렵게 합니다
전역 데이터 대신 함수에 데이터를 넘기세요
함수가 데이터 액세스가 필요하면 전달하세요
네 데이터가 많고 매개 변수가 많길 원치 않는다면 이론상으로는
매개 변수가 5개 이상이면 안 돼요
네 클린 코드라는 훌륭한 책이 있는데 코드의 질과
피할 것에 대해 나와 있어요 전역 변수 같은 거요
여러분 기능에 매개 변수가 어떻게 있어야
하는지도 얘기하죠
함수에 매개 변수가 20개라면 뭔가 잘못됐다는 표시입니다
그 함수가 일을 너무 많이 하기 때문이죠
네 하지만 함수는 데이터를 전달함으로써 데이터에 접근할 수 있고 전역 데이터의 사용을
제한할 수 있습니다
네 많은 데이터를 필요로 하는 함수에서는 스트럭트라는
것을 사용할 수 있습니다 아직 다루지는 않았지만 다른 방법으로도 사용할 수 있죠
그러니까 필요할 때만 글로벌 데이터를 최대한 많이 사용하지 마세요
암호를 이해해야 해요
다큐멘터리를 정말 잘 찍어야 해요
네 코드를 보는 다른 누군가가 즉시 여러분이 전역 데이터를
사용하고 있고 모든 게 어떻게 작동하는지 알 수 있도록요
이게 함수 범위의 개념이에요
이걸 이해하셔야 하니까 슬라이드를 잘 보세요
다음 과제에서는 글로벌 데이터와 로컬 데이터도
사용할 거예요 고마워요