제2화 가지의 조립 시간

코드의 일생 03

타미의 수상한 계산

나무는 멀쩡한데, 왜 안 될까?

가지는 조각을 잘 묶어서 나무를 만들었어.

이제 타미가 나무 안에 무엇이 들어 있는지 살펴볼 차례야.

겉모양만 맞으면 모든 검사가 끝나는 걸까?

오늘의 이상한 질문토파즈는 이걸 더해 줄까?1 + "사과"

왼쪽에는 숫자가 있고, 오른쪽에는 따옴표로 감싼 글자가 있어.

토파즈 컴파일러는 이 식을 어떻게 처리할까?

그렇게 생각했구나.

타미가 어떤 부분을 살펴보는지 따라가 보자.

만화

장면 1 가지가 가져온 나무

가지다 묶었어. 문법에 맞는 나무야.

한줄이이번엔 멀쩡하게 생겼네!

가지모양은 그렇지.이제 타미 차례야.

장면 2 타미의 돋보기

한줄이뭘 또 검사해?

타미나무 모양은 가지가 확인했어.나는 안에 들어 있는 값을 볼 거야.

한줄이값도 따로 검사받아?

타미그럼. 생긴 모양만으로는 모르니까.

장면 3 첫 번째 꼬리표

타미왼쪽은 확인했어.

한줄이오른쪽은?

타미이제 봐야지.

장면 4 멈칫한 더하기 기호

타미잠깐.

한줄이또 왜? 가지가 잘 묶었다며!

타미잘 묶은 건 맞아.그런데 이 더하기가 받을 수 있는 조합인지는 다른 문제야.

장면 5 타미가 남긴 표시

한줄이그럼 난 여기서 끝이야?

타미아니. 어느 부분을 고쳐야 할지 알려 줄 거야.

한줄이고치면 다시 올 수 있어?

타미물론이지. 확인하는 게 내 일이니까.

모모이쪽은 준비됐네.

타미의 확인표에는 무슨 문제가 적혀 있을까?

직접 검사해 보자.

작은 실험

타미의 돋보기

같은 더하기인데 왜 결과가 다를까?

이번에는 네가 타미의 돋보기를 들 차례야.

나무의 양쪽 끝을 살펴보고, 마지막으로 가운데의 더하기 기호를 확인해 봐.

식 하나를 골라 봐.

왼쪽과 오른쪽에 돋보기를 대어 봐.

각각 무엇인지 적힌 꼬리표가 나타날 거야.

왼쪽 값 살펴보기

1숫자int

오른쪽 값 살펴보기

2숫자int

이번에는 +를 살펴봐.

이 더하기가 두 종류를 함께 받을 수 있을까?

더하기 기호 살펴보기

이 조합은 괜찮아.

이 식에서 더하기의 결과도 숫자 타입이야.

결과숫자int

실제 타입 기록 보기
실제 타입 기록

토파즈 컴파일러 5.21.1 기록

이 사이트가 예제를 돌리는 언어, 토파즈의 컴파일러가 남긴 기록이야.
  • 식 전체 1번째부터 5번째 칸까지primitive int숫자int
  • 값 1번째 칸literal int 1숫자int
  • 값 5번째 칸literal int 2숫자int

왼쪽과 오른쪽에 돋보기를 대어 봐.

각각 무엇인지 적힌 꼬리표가 나타날 거야.

왼쪽 값 살펴보기

"사과"문자열string

오른쪽 값 살펴보기

"배"문자열string

이번에는 +를 살펴봐.

이 더하기가 두 종류를 함께 받을 수 있을까?

더하기 기호 살펴보기

이번에도 괜찮아.

토파즈에서는 문자열 두 개를 +로 이어 붙일 수 있어.

그 결과의 타입도 문자열이야.

결과문자열string

실제 타입 기록 보기
실제 타입 기록

토파즈 컴파일러 5.21.1 기록

이 사이트가 예제를 돌리는 언어, 토파즈의 컴파일러가 남긴 기록이야.
  • 식 전체 1번째부터 10번째 칸까지primitive string문자열string
  • 값 1번째부터 4번째 칸까지literal string "사과"문자열string
  • 값 8번째부터 10번째 칸까지literal 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 기록

이 사이트가 예제를 돌리는 언어, 토파즈의 컴파일러가 남긴 기록이야.
  • 식 전체 1번째부터 5번째 칸까지primitive int숫자int
  • 값 1번째 칸literal int 1숫자int
  • 값 5번째 칸literal int 2숫자int
실제 타입 기록

토파즈 컴파일러 5.21.1 기록

  • 식 전체 1번째부터 10번째 칸까지primitive string문자열string
  • 값 1번째부터 4번째 칸까지literal string "사과"문자열string
  • 값 8번째부터 10번째 칸까지literal 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번째 칸까지

쉬운 풀이왼쪽은 문자열이고 오른쪽은 정수야. 이 더하기는 둘을 함께 받지 않아.

이제 나무의 모양뿐 아니라 그 안에 든 값도 살펴볼 수 있겠네.

속사정 도감낱말 다시 보기타입 검사오류 메시지

다음 이야기

제4화모모의 변신 공장

이번에는 검사를 무사히 통과한 나무가 있어.

1 + 2

모모가 그 나무를 받아 들고 이리저리 살펴봐.

모모모양을 바꿔 볼까?뜻은 그대로 두고 말이야.

같은 코드가 전혀 다른 모습이 될 수 있을까?

다음에는 컴파일러가 코드를 다른 표현으로 바꾸는 과정을 만나 보자.