왕초보만/실습 초보만

개발 시작 Part 2 변수를 이용해 보자.

JumBack2 2023. 7. 29. 10:58

우리는 입력문과 출력문을 잘 쓰기 전에 지역변수와 전역변수에 대하여 알아야 한다.

우리는 이전에 데이터와 메모리를 공부하면서 변수라는 것에 대해 공부를 하였다.

변수는 즉 데이터를 담는 그릇이다.

데이터의 타입이나 변수의 기본설명은 이곳에 되어있다.

 

메모리는 기본적으로 힙과 스택으로 나뉜다. 정확히는 더 다양하게 나뉘지만

프로그램이 자동 할당하는 임시 영역인 스택과 사용자가 직접 관리할 수 있는 힙의 영역이 있다.

 

이 둘의 장단점은 깊게 들어가면 세밀하기 때문에 기초코딩에서 다루지는 않겠지만 

간단히 말해 스택은 가볍지만 유연성이 부족하고 힙은 무겁지만 유연성을 제공한다.

여기서 유연성이라고 함은 상황에 맞게 변하기 쉽냐는 의미이다.

 

상황에 따라 장단점이 있기 때문에 코딩에서는 이를 혼합하여 사용한다.

 

기본적으로 지역변수는 이 스택의 영역에 있는 변수들에 쓰이고

클래스의 변수들은 힙의 영역에서 사용된다. 

간단하게 스택은 빠르고 힙은 느리다로 기억해두자. 지역변수는 빠르게 쓰고 반납하고

클래스에 있는 변수들은 한번 기억하고 오래쓰고 다시 쓴다 라고 기억하자.

 

여기서 지역변수와 전역변수(클래스의 변수)가 나오는데

우리가 기초코딩에서 알아야 하는 것은 변수의 종류와 생명주기 정도이다.

일단 변수는 생명주기라는 것이 있다. 생명주기가 무엇이냐면 변수도 메모리에 있는 친구이다보니 일시적으로 

존재한다. 따라서 어느 순간에는 할당 된 메모리를 반납해야 한다는 것이다.(왜냐 메모리는 한계가 있기 때문)

 

변수는 사용되는 위치에 따라 이러한 생명주기가 달라지고 특성이 달라지는데 

아주 잘 정리된 표를 가져왔다.

지역 변수라고 하면 코딩에서 메서드라고 불리는 즉 함수의 안에서 사용되는 변수를 지역 변수라고 한다.

이 지역변수는 메서드가 시작하고 끝날 때 까지만 할당되어 사용되다가 메서드의 생명주기가 끝나는

순간 반납된다. 이는 스택의 영역에서 사용되고 그 메서드의 안에서만 사용이 가능하다.

이는 예시를 들어주면 빠르다.

우리의 지역변수 int x는 Test라는 메서드 안에서만 사용이 가능하며 메서드의 시작인 { (중괄호)

가 시작될 때 부터  } (중괄호)가 닫힐 때까지만 할당이 가능하고 } 가 나와서 메서드가 

끝나면 스택에서 제거되어 메모리에서 반납된다.

 

그렇다면 전역변수는? 

전역변수의 의미는 전체의 영역에서 사용된다는 뜻인데, 이는 C언어의 전역변수와 조금 구분된다.

객체지향언어에서는 객체 단위로 코드가 구분되기 때문에 Class단위로 구분이 될 수 있다.

만약 구역의 단위가 클래스라고 한다면 Class의 전체에서 사용가능 한 것이 전역변수이다.

정확히는 멤버변수라고 할수 있는데 클래스 내부에 있는 변수는 클래스가 메모리에서 

할당되는 동안 값이 유지되고 힙의 영역에서 사용가능하다.

해당 클래스가 메모리에서 해제되면(프로그램이 종료되면) 가비지 컬랙션이라는 곳에서 해당

메모리들을 수거한다. 이는 프로그램이 종료되는 시점이다.

 

우리의 int x가 2개가 보이지 않는가?

위의 빨간 박스 안의 x는 밑의 Test 메서드 안의 x와 엄연히 다른 x이다. 

Program 이라는 클래스에 속한 int x이고 이는 Program 클래스의 전역변수(멤버 변수)이기 때문이다.

이는 프로그램 클래스가 어딘가에서 할당되서 사용될 때 힙의 영역에서 존재하고 

프로그램 클래스가 반납되는 시점에 힙의 영역에서 사라진다.

 

지금 지역변수가 어떻게 전역변수가 어떻고 이해가 안된다면 이렇게 이해를 해보자

메서드 안에 있는 x는 메서드가 끝날 때 수명을 다하고 사라지기 때문에 메서드 안에서만

사용이 가능하지만 클래스안에 속해있는 x는  클래스에 멤버변수이자 힙의 영역에

존재하는 친구임으로 메서드 안의 x와 다른 존재이다. 또한 전역변수이기 때문에

Test()안에서 사용가능하지만 Test()안에 있는 x는 메서드 밖에선 사용이 불가능 하다.

위의 코드를 실행해보기를 바란다. 

프로그램 클래스 안에 있는 y는 잘 출력이 된다. 출력문은 Test() 메서드 안에 있는데도 말이다.

 

그러나 Main 메소드 안에서 x를 출력하려고 하면 밑에 빨간줄이 뜨고

오류가 날것이다. 왜냐하면 x를 찾지 못했기 때문이다.

이는 Test()에 x가 선언되어있고 Test() 메서드 밖에서는 인식하지 못하기 때문에

컴파일러가 틀렸다고 알려주고 있기 때문이다.

 

 

사실 전역변수로 사용하려면 Static이란 한정자를 사용하여 전체의 영역에서 사용하여야

전역 변수의 의미를 진정으로 사용가능하다고 생각하는데

이 Static이라는 한정자는 클래스라는 부분을 공부하여야 이해가 가능하다.

지금은 넘어가도록 하겠다.

 

아무튼 우리는 Main 메서드 안에서 변수를 만들어 그 안에다가 값을 넣어 사용해 볼것이다.

 

그런데 재미있는건 

입력에는 Console.Read()  Console.ReadLine() 가 존재한다.

출력에는 Console.Write()  Console.WriteLine()이 존재한다.

 

이는 바로 다음의 한글자만 읽을 것인가 문장 전체를 읽을 것인가의 차이와

바로 다음에 결과를 출력해 보여줄 것인가 다음 줄 처음에서 보여줄 것인가의 차이이다.

 

ReadLine()는 문자열을 받아서 넣어야 하기 때문에 

string d = Console.ReadLine(); 

데이터 타입이 string에만 가능하다.

 

read는 한 글자를 받고 출력을 int로만 하기 때문에 

int x= Console.Read();만 가능하다.

 

그렇다면 char는 어떻게 해야하는가?

이 부분은 

 char d = Console.ReadLine()[0]; 로 하면 되는데 

이유는 배열을 알려주고 설명해 주도록 하겠다.

 

 

 

 

유니티로 배우는 C# - 10. 접근자와 지역 / 전역 변수?

Base Of Coding 베오코 Youtube 채널을 개설했습니다. 아직은 많이 부족하지만, 블로그에 있는 정보들을 영상으로 담아 보다 더 자세하게 알려드리겠습니다. 점차 발전해나가는 모습 지켜봐주시면 감

includecoding.tistory.com

 

 

c#) 스태틱 Static 변수,메서드,클래스

스태틱Static 변수 스태틱 변수는 객체를 선언만 해도 메모리가 할당되며 일반적인 변수들이 객체가 새로 생성될 때 메모리가 초기화 되는 것과 다르게 해당 객체를 계속 반복적으로 생성해도

funfunhanblog.tistory.com