장면 1 가지가 가져온 나무
가지다 묶었어. 문법에 맞는 나무야.
한줄이이번엔 멀쩡하게 생겼네!
가지모양은 그렇지.이제 타미 차례야.
코드의 일생 03
나무는 멀쩡한데, 왜 안 될까?
가지는 조각을 잘 묶어서 나무를 만들었어.
이제 타미가 나무 안에 무엇이 들어 있는지 살펴볼 차례야.
겉모양만 맞으면 모든 검사가 끝나는 걸까?
그렇게 생각했구나.
타미가 어떤 부분을 살펴보는지 따라가 보자.
가지다 묶었어. 문법에 맞는 나무야.
한줄이이번엔 멀쩡하게 생겼네!
가지모양은 그렇지.이제 타미 차례야.
한줄이뭘 또 검사해?
타미나무 모양은 가지가 확인했어.나는 안에 들어 있는 값을 볼 거야.
한줄이값도 따로 검사받아?
타미그럼. 생긴 모양만으로는 모르니까.
타미왼쪽은 확인했어.
한줄이오른쪽은?
타미이제 봐야지.
타미잠깐.
한줄이또 왜? 가지가 잘 묶었다며!
타미잘 묶은 건 맞아.그런데 이 더하기가 받을 수 있는 조합인지는 다른 문제야.
한줄이그럼 난 여기서 끝이야?
타미아니. 어느 부분을 고쳐야 할지 알려 줄 거야.
한줄이고치면 다시 올 수 있어?
타미물론이지. 확인하는 게 내 일이니까.
모모이쪽은 준비됐네.
타미의 확인표에는 무슨 문제가 적혀 있을까?
직접 검사해 보자.
작은 실험
같은 더하기인데 왜 결과가 다를까?
이번에는 네가 타미의 돋보기를 들 차례야.
나무의 양쪽 끝을 살펴보고, 마지막으로 가운데의 더하기 기호를 확인해 봐.
왼쪽과 오른쪽에 돋보기를 대어 봐.
각각 무엇인지 적힌 꼬리표가 나타날 거야.
1숫자int
2숫자int
이번에는 +를 살펴봐.
이 더하기가 두 종류를 함께 받을 수 있을까?
이 조합은 괜찮아.
이 식에서 더하기의 결과도 숫자 타입이야.
결과숫자int
토파즈 컴파일러 5.21.1 기록
이 사이트가 예제를 돌리는 언어, 토파즈의 컴파일러가 남긴 기록이야.primitive int숫자intliteral int 1숫자intliteral int 2숫자int왼쪽과 오른쪽에 돋보기를 대어 봐.
각각 무엇인지 적힌 꼬리표가 나타날 거야.
"사과"문자열string
"배"문자열string
이번에는 +를 살펴봐.
이 더하기가 두 종류를 함께 받을 수 있을까?
이번에도 괜찮아.
토파즈에서는 문자열 두 개를 +로 이어 붙일 수 있어.
그 결과의 타입도 문자열이야.
결과문자열string
토파즈 컴파일러 5.21.1 기록
이 사이트가 예제를 돌리는 언어, 토파즈의 컴파일러가 남긴 기록이야.primitive string문자열stringliteral string "사과"문자열stringliteral string "배"문자열string왼쪽과 오른쪽에 돋보기를 대어 봐.
각각 무엇인지 적힌 꼬리표가 나타날 거야.
1숫자int
"사과"문자열string
이번에는 +를 살펴봐.
이 더하기가 두 종류를 함께 받을 수 있을까?
이 조합은 그대로 받을 수 없겠어.
토파즈에서는 이 숫자와 문자열을 +로 함께 사용할 수 없어.
다시 살펴보기
이 식에는 타입 기록이 남지 않았어. 꼬리표는 토파즈의 규칙으로 읽은 종류야.
토파즈 컴파일러 5.21.1 기록
TPZ5001error
`+` needs matching int, float, string, BigInt, or Decimal operands, found `int` and `string`
가리킨 자리 1번째부터 8번째 칸까지
쉬운 풀이왼쪽은 정수이고 오른쪽은 문자열이야. 이 더하기는 둘을 함께 받지 않아.
왼쪽과 오른쪽에 돋보기를 대어 봐.
각각 무엇인지 적힌 꼬리표가 나타날 거야.
"1"문자열string
2숫자int
이번에는 +를 살펴봐.
이 더하기가 두 종류를 함께 받을 수 있을까?
왼쪽을 다시 살펴볼까?
"1"은 숫자처럼 보이지만 따옴표로 감싼 문자열이야.
그래서 1과 "1"은 같은 타입이 아니야.
이 식도 토파즈에서는 그대로 더할 수 없어.
다시 살펴보기
이 식에는 타입 기록이 남지 않았어. 꼬리표는 토파즈의 규칙으로 읽은 종류야.
토파즈 컴파일러 5.21.1 기록
TPZ5001error
`+` needs matching int, float, string, BigInt, or Decimal operands, found `string` and `int`
가리킨 자리 1번째부터 7번째 칸까지
쉬운 풀이왼쪽은 문자열이고 오른쪽은 정수야. 이 더하기는 둘을 함께 받지 않아.
검사대에 남긴 표본
1 + 2숫자int숫자int받을 수 있음"사과" + "배"문자열string문자열string받을 수 있음1 + "사과"숫자int문자열string다시 살펴보기"1" + 2문자열string숫자int다시 살펴보기1 + 2숫자int숫자int결과숫자int"사과" + "배"문자열string문자열string결과문자열string둘 다 +를 사용하지만, 더하는 값의 종류가 달라.
이 +는 숫자끼리 계산할 때도 쓰이고, 문자열끼리 연결할 때도 쓰여.
이번에는 이 두 가지 경우를 살펴본 거야.
1숫자int"1"문자열string따옴표 하나만 달라져도 타입이 달라질 수 있어.
진짜 속사정
방금 돋보기로 나무를 살펴본 건 타입 검사를 흉내 낸 거야.
컴파일러는 코드의 각 표현식이 어떤 타입인지 알아내고, 연산에 그 타입을 사용할 수 있는지 확인해.
오늘 만난 타입은 둘이야.
int정수를 나타내는 타입이야.
1, 2, 4 같은 값이 여기에 속해.
string문자열을 나타내는 타입이야.
"사과", "배", "1"처럼 따옴표로 감싼 글자들이 여기에 속해.
토파즈의 +는 숫자 계산에 쓸 수도 있고 문자열 연결에 쓸 수도 있어.
그렇다고 아무 종류나 섞어서 받을 수 있는 건 아니야.
이번 실험에서는 숫자 둘과 문자열 둘은 각각 사용할 수 있었지만, 숫자 하나와 문자열 하나는 함께 사용할 수 없었어.
토파즈 컴파일러 5.21.1 기록
이 사이트가 예제를 돌리는 언어, 토파즈의 컴파일러가 남긴 기록이야.primitive int숫자intliteral int 1숫자intliteral int 2숫자int토파즈 컴파일러 5.21.1 기록
primitive string문자열stringliteral string "사과"문자열stringliteral string "배"문자열string토파즈 컴파일러 5.21.1 기록
TPZ5001error
`+` needs matching int, float, string, BigInt, or Decimal operands, found `int` and `string`
가리킨 자리 1번째부터 8번째 칸까지
쉬운 풀이왼쪽은 정수이고 오른쪽은 문자열이야. 이 더하기는 둘을 함께 받지 않아.
제2화의 1 + * 2는 문법에 맞게 묶을 수 없었어.
이번의 1 + "사과"는 문법에 맞게 묶을 수 있지만, 타입 검사에서 문제가 발견돼.
문법에 맞는 코드라고 해서 타입 검사까지 통과하는 건 아니야.
그렇지는 않아.
같은 기호라도 언어에 따라 허용하는 값의 종류와 처리 방법이 다를 수 있어.
우리가 오늘 확인한 건 토파즈의 규칙이야.
한 줄 정리
컴파일러는 코드의 각 부분이 어떤 타입인지 확인하고, 그 타입에 맞게 연산할 수 있는지 검사한다.
맞지 않으면 실행하기 전에 문제를 알려 줄 수 있어.
그럼 이건 왜 안 될까?
"3" + 4"3"은 따옴표로 감싼 문자열이야.
4는 숫자야.
토파즈의 +는 이 두 타입을 그대로 섞어서 사용할 수 없어.
숫자처럼 보인다고 언제나 숫자 타입인 건 아니거든.
토파즈 컴파일러 5.21.1 기록
TPZ5001error
`+` needs matching int, float, string, BigInt, or Decimal operands, found `string` and `int`
가리킨 자리 1번째부터 7번째 칸까지
쉬운 풀이왼쪽은 문자열이고 오른쪽은 정수야. 이 더하기는 둘을 함께 받지 않아.
이제 나무의 모양뿐 아니라 그 안에 든 값도 살펴볼 수 있겠네.
다음 이야기
이번에는 검사를 무사히 통과한 나무가 있어.
1 + 2모모가 그 나무를 받아 들고 이리저리 살펴봐.
모모모양을 바꿔 볼까?뜻은 그대로 두고 말이야.
같은 코드가 전혀 다른 모습이 될 수 있을까?
다음에는 컴파일러가 코드를 다른 표현으로 바꾸는 과정을 만나 보자.