상세 컨텐츠

본문 제목

버그의 원인중 80퍼센트는 자료형 때문에 생기는듯 : 자료형 세상이 왜이래..

삶을 효율적으로 사는법

by 척척석사 민준 2020. 10. 15. 23:15

본문

728x90

요즘 일주일에 3개식 포스팅하는 습관을 만드려는데..
쓰는 글의 퀼리티가 점점 떨어지는 거 같다
뭐 원래도 그리 좋지는 못했다만..
양이 질을 만든다고 하니 일단은 킵고잉하자..

자료형이 뭐길래 일케 짜증나게 하는걸까

프로그램을 짜다보면 특히 파이썬이나 매트랩처럼 코드가 한줄씩 실행되는 경우에
암만봐도 괜찮은데 인터프리터가 에러를 띄울때가 있다.
밑에 단 두 줄 짜리 코드만 봐도 뭐가 잘못된건지 보이는가?
그냥 숫자 두개 입력받아서 a랑 b에 저장하고 그거 곱하라는데 일하기 싫다고 오류를 띄운다...!

잘 읽어보면 (구글링을 해보면) str 자료형끼리는 곱셈을 할 수 없다고 한다
그런데 나는 글자를 입력한게 아니라 숫자를 입력했다!!!
기초가 없어서 겪게된 이 단순한 오류는 input 함수에서 기인한다.
input 함수가 받아들이는 입력은 기본적으로 str 이라는 자료형으로 저장한다는 것이다.
그래서 난 숫자를 입력했지만 컴퓨터가 문자열(str)으로 받아들여서 내가 시킨 연산을 못하겠다고 들어누운거다.

젤 짜증나는건 정수가 아니라고 짜증내는 컴퓨터다

정수와 실수는 뭐가 다른지 아는가?
0은 정수고 0.0은 실수다.
1은 정수고 1.0은 실수다.
range 함수를 써서 A = (1,2,3,4,5,6,7) 이라는 배열을 만들었다.

print(A[0])으로 A에 있는 첫번째 요소를 출력했다.
그럼 밑에껀 어떨까?
print(A[0.0])을 하면 어떤 일이 일어나는지 보자
어김없이 오류를 띄운다.

인간이 생각하기엔 똑같이 0인데 컴퓨터는 바보라 그걸 모른다.
척하면 척 알아야지 말이야~~ 라떼는 척하면 척이었다 이말이야~~
이상한 말은 그만 두고 왜 그런지 분석을 해보자.
보면 range indices must be integer라고 되어있다.
범위는 반드시 정수로 인덱스 되어야한다라는 뜻이다.
말로 생각해보면 쉽다.
1과 첫번째는 같은 숫자 1을 의미하지만 앞에껀 숫자고 뒤에껀 순서다.
숫자 1은 정수 1이든 실수 1.0 이든 계산하는데 다른 값을 안준다.
하지만 순서는 다르다. 첫번째 순서는 있어도 1.0번째 순서는 없지 않은가?
인덱스는 csv 파일을 다룰때 숨쉬듯 많이 사용하는 기능이다.
인덱싱을 하기 위해선 사용되는 변수가 정수가 되어야 한다!

그래서 하고 싶은 말은 // , int() 그리고 round()를 잘 이용하자 라는 것이다.

뭐 바보가 아니고서야 정수를 굳이 실수로 바꿔서 인덱싱하는 사람은 없을꺼다.
하지만 정수일 줄 알았던 변수가 알고보니 실수인 경우가 매우 많다.
예를 들어 한 주기를 알고리즘을 통해서 구했다고 하자
(블로그 글중에 한주기를 구하는 알고리즘이 있다. 내가 생각한 아이디어니까 출처는 NADA)

2020/08/26 - [자연과학도를 위한 파이썬 (Python)] - [Python] 전압 한주기를 자동으로 찾아내는 소스코드 개발

2020/08/25 - [자연과학도를 위한 메트랩 (MATLAB)] - [MATLAB] 전압 한주기를 찾아내는 코드개발


한주기를 찾았으니 반주기를 찾는다고 하면,
그냥 len함수(len() : lenght, 배열의 길이를 구하는 함수)를 써서 len(주기)/2 이런 식으로 전체길이의 반만 쓰면 된다고 생각할 것이다.
하지만 이때 간과하기 쉬운게 바로 자료형이다.
2로 나눴을 때 정수일지 실수일지 어떻게 아는가?
그래서 나는 // 나 int를 써서 나머지를 없애거나
좀더 정밀하게 계산하기 위해서 반올림을 해주는 내장함수 round()을 항상 사용하려고 한다.
(MATLAB에는 fix라고 실수를 가장 가까운 정수로 만들어주는 함수가 있다)
자꾸 type 어쩌고 integer 어쩌고 하는 오류가 뜬다면 이런 것도 고려를 했는지 생각을 하도록 하자.
아 물론 내가 초보라서 이런거에서 오류가 생기는 것이기도 하다.

세줄 요약
1. 자료형은 짜증남
2. 순서에는 정수만 써야함
3. 자꾸 오류나면 의욕떨어지니까 그냥 습관적으로 // 나 int() round()를 사용하도록 하자

728x90

관련글 더보기