문자열 : 문자열은 문자들의 나열로, 큰 따옴표(")로 묶어 나타냅니다. 예를 들어, "hello"나 "world"와 같이 문자들을 나열한 것이 문자열입니다. 문자열은 내용이 같더라도 서로 다른 객체로 취급됩니다.
심볼 : 심볼은 작은 따옴표(')로 묶어 나타내며, 따옴표 다음에 나오는 단어나 구를 나타냅니다. 예를 들어, 'hello 나 'world와 같이 따옴표로 묶은 것이 심볼입니다. 심볼은 내용이 같으면 항상 동일한 객체로 취급됩니다.
#lang plai
(define sym1 'hello)
(define sym2 (string->uninterned-symbol "hello"))
(define sym3 (string->symbol "hello"))
(symbol=? sym1 sym2) ; Output: #f
(eq? sym1 sym2) ; Output: #f (not same memory address)
(symbol=? sym1 sym3) ; Output: #t
(eq? sym1 sym3) ; Output: #t (same memory address)
Racket에서 심볼은 기본적으로 인터닝됩니다. 이는 동일한 내용을 가진 두 개의 심볼이 동일한 객체로 취급된다는 것을 의미합니다. 인터닝된 심볼은 메모리에서 하나의 고유한 위치를 가리킵니다.
예를 들어, sym1과 sym3는 모두 내용이 "hello"인 심볼이므로 같은 객체로 취급됩니다. 따라서 (symbol=? sym1 sym3)와 (eq? sym1 sym3)는 둘 다 참(True)입니다.
eq?는 두 객체의 메모리 주소가 정확히 같은지를 확인합니다. 즉, 두 객체가 동일한 것인지를 검사합니다.
symbol=?는 두 심볼의 내용이 정확히 같은지를 확인합니다. 즉, 두 심볼이 동일한 내용을 가지고 있는지를 검사합니다.