C언어에서 변수의 타입을 선언해야 되는 이유????
글쓴이: youngjae6 / 작성시간: 월, 2017/09/18 - 9:47오전
C언어에서 변수의 타입을 선언해야 되는 이유가 무엇인가요?
제가 얕게 알기론 메모리를 유연하게 사용하기 위해서라고 알고 있는데
교수님께서 말하시길 저의 생각이 맞는것도 아니며 또 간단한 문제도 아니라고 하셨습니다.
그러면서 변수의 타입을 선언해야 되는 이유가
OS, 컴파일러 그리고 심지어 하드웨어와도 관련이 있다고 하더군요.
왜 그런지 아시는 분 계신가요?
어렵게 설명해주셔도 감사합니다.
처음보거나 모르는 내용은 제가 찾아가면서 공부하면 되니깐요.
Forums:
https://www.tutorialspoint
https://www.tutorialspoint.com/cprogramming/c_variables.htm
A variable declaration provides assurance to the compiler that there exists a variable with the given type and name so that the compiler can proceed for further compilation without requiring the complete detail about the variable.
세벌 https://sebuls.blogspot.kr/
감사합니다.
감사합니다.
어떤 데이터든지 그 타입을 알아야만 그 데이터를
어떤 데이터든지 그 타입을 알아야만 그 데이터를 가지고 무언가를 할 수 있습니다. 예를 들어 데이터가 수라면 사칙 연산을 할 수 있을 것이고, 문자열이라면 사칙 연산은 할 수 없지만 길이를 잰다거나 문자의 순서를 뒤집는다거나 어떤 문자를 포함하고 있는지 검색을 한다거나 할 수 있겠지요. 컴퓨터가 어떤 데이터를 사용하려면 메모리에 저장을 해야하는데 타입을 모르면 저장할 방법이 없습니다. 데이터의 크기를 알 수 없기 때문이지요. 데이터를 사용하려면 컴파일러 또는 인터프리터, 가상머신이 "반드시" 그 타입을 알아야만 합니다. 변수 뿐만 아니라 함수도 마찬가지입니다. 함수를 사용하려면 데이터를 넘겨주고 반환하는 데이터을 넘겨받아야합니다. 그 크기를 모르면 사용할 수 없습니다.
프로그램의 소스 코드에 어떤 변수가 등장했다고 합시다. 그 변수의 타입을 어떻게 알 수 있을까요? 두 가지 방법이 있습니다. 하나는 소스 코드에 그 변수의 타입을 명시하는 겁니다. C 언어가 그렇지요. 다른 하나는 그 변수가 쓰이는 방식을 보고 추론하는 겁니다. 예를 들어 reverse_string 이라는 문자열을 뒤집는 함수가 있다면 이 녀석은 문자열을 인자로 받겠지요. 어떤 변수 a가 있고 소스 코드에 reverse_string(a)라는 표현이 등장했다고 하면 a는 문자열이어야만 한다는 것을 알 수 있습니다. 이런 것을 타입 추론이라고 합니다. 타입을 지정하지 않아도 되는 언어들이나 타입을 지정할 수 없는 언어들은 타입 추론을 사용합니다.
그런데 타입 추론 능력은 언어마다 천차만별입니다. 타입이 얼마나 다양한 정보를 담을 수 있는 지, 얼마나 엄격한 지에 따라서 추론 능력이 달라집니다. 대부분의 인터프리터 언어들은 타입 추론 능력이 약합니다. 어떤 표현이 실제로 실행될 때마다 그때 그때 그 표현에 대해서만 추론을 합니다. 변수의 타입이 실행 중 바뀌는 것을 허용하는 언어도 있고 허용하지 않는 언어도 있지만 여하튼 최소한의 추론만 합니다.
컴파일 언어 중에는 타입 추론 능력이 매우 뛰어난 언어들이 있습니다. 훌륭한 타입 체계(type system)을 가지고 있는 언어들이지요. 이런 언어들에서는 변수나 함수의 타입을 지정해줘도 되지만 많은 경우에 지정해주지 않아도 컴파일러가 알아서 타입을 추론합니다. 만약에 추론에 모순이 생긴다면 컴파일 타임에 에러를 냅니다. 예를 들어 소스 코드에 reverse_string(a) 라는 표현이 등장하고 그 다음에 a / 10.1 과 같은 표현도 등장한다면 a의 타입을 하나로 추론할 수 없겠지요. 이건 버그가 있다는 겁니다. 이런 버그를 컴파일러가 잡아주는 거지요. C는 타입을 추론하지 않고 그냥 정해준 타입으로만 다룹니다. C 컴파일러는 이런 버그를 잡아주기는 하지만 타입 체계가 단순해서 타입에 많은 정보를 담을 수가 없는 관계로 컴파일러로부터 얻을 수 있는 도움이 그리 크지 않습니다. 몇 가지 언어를 예로 들어보자면 C++은 약간의 타입 추론을 할 수가 있고, scala는 각 함수 내에서만 추론할 수 있고, rust나 haskell은 프로그램 전체의 타입을 추론할 수 있습니다. 이런 언어들은 타입에 담을 수 있는 정보도(타입 사이의 다양한 관계나 데이터의 수명 등) C보다 많습니다.
타입을 지정해주지 않는 언어들 중에 변수의 타입이 바뀌는 것을 허용하는 언어들은 reverse_string(a)을 만나면 a를 문자열로 다루려고 시도하고 성공적이면 그냥 ok입니다. 그 다음에 a / 10.1을 만나면 a의 수로 다루려고 시도합니다. a에 담겨 있는 문자열이 "11.2" 같은 것이었다면 성공하겠지요. 만약에 "hello"같은 문자열이어서 수로 바꿀 수 없다면 그 때 에러를 냅니다. 변수의 타입이 바뀌는 것을 허용하지 않는 언어들은 처음에 reverse_string(a)를 만났을 때에 그 변수의 타입을 문자열로 정하고 a / 10.1 을 만나면 바로 에러를 냅니다.
타입을 지정해주느냐, 지정해주지 않아도 강한 추론이 가능한가, 최소한의 추론만 하는가는 전적으로 논리적인 문제입니다. OS나 하드웨어와는 별 관계 없습니다. 컴파일러가 변수나 함수의 타입을 알면 컴파일 타임에 하드웨어에 맞춰서 여러 최적화를 시도할 수는 있습니다만 실행 시간에 타입이 정해지더라도 원칙적으로는 비슷한 최적화를 할 수 있습니다. 물론 컴파일 타입 최적화가 여러모로 편리하겠지만 원칙적으로는 그렇습니다.
감사합니다.
감사합니다. 많은 도움이 되었습니다.
프로그래밍 언어를 보면 크게 변수에 크게 신경쓰는
프로그래밍 언어를 보면 크게 변수에 크게 신경쓰는 것과 그렇지 않은 것을 볼 수 있는데 C는 그래도 변수에 대해서 구별하려고 많이 노력하는 프로그래밍 언어 중에 속하죠. Ada 같은 것들은 변수 처리에 매우 엄격합니다. 그래서 국방, 항공, 미션 크리티컬, 실시간 쪽 어플리케이션에 주로 사용됩니다.
변수에 크게 상관없이 프로그래밍 할 수 있는 것은 주로 스크립트 언어, 또 그밖에 생산성과 범용성을 염두에 둔 언어들이지요.
C는 하드웨어를 다룰 수 있기 때문에 변수 처리가 필요할 수 밖에 없습니다. 이도 저도 아닌 변수로 다양한 하드웨어 접속을 처리하려면 당연히 모호성이 발생할 수 밖에 없고 그때마다 컴파일러를 수정하느니 차라리 엄격한 변수 선언 방식을 취하는게 정책적으로 맞죠. C 는 어느 정도 중도의 모양을 취한 것이고 Ada는 차라리 프로그래머가 힘들더라도 매우 엄격한 변수 선언 및 관리 체계를 택한 것이죠.
이런 것이 엄격할수록 코드 개발과 검증에 들어가는 비용이 상승하기 때문에 생산성이 높은 언어는 아닙니다. 그래서 C --> C++로 가면서 다형성같은 것이 도입되었고 template 같은 것이 나왔죠. 머리좋은 누군가가 개발해 놓은 것을 C++에서는 그냥 쓰면 됩니다. 하지만 C에서는 (대충만든) 남의 것을 쓰게 되면 항상 변수 타입에 대한 compiler warning이 끊임없이 나오죠. 실제로 워닝을 무시했다가 생각되로 안되는 경우가 수두록 합니다.
하드웨어를 다루는 언어는 언어의 사소한 것도 전부 하드웨어와 관련이 있습니다.
감사합니다
감사합니다. 많은 도움이 되었습니다.
댓글 달기