기초

기초 에서 Crystal

1개의 연습 문제

기초 소개

Crystal은 컴파일 언어이면서 객체 지향 프로그래밍 언어예요. 다음은 이 언어가 추구하는 목표 중 일부예요:

  • Ruby에서 영감을 받은 문법

  • 정적 타입 검사를 하지만, 변수나 메서드 인자의 타입을 직접 지정할 필요는 없어요

  • Crystal로 바인딩을 작성해 C 코드를 호출할 수 있어요

  • 보일러플레이트 코드를 피할 수 있도록 컴파일 타임 평가와 코드 생성을 지원해요

  • 효율적인 네이티브 코드로 컴파일해요

Crystal 개발은 2011년에 시작됐어요. Ruby의 우아함과 생산성을 갖추면서도 컴파일 언어의 성능과 타입 안전성을 갖춘 언어를 만드는 것이 목표였죠. 언어 컴파일러는 처음에는 Ruby로 작성됐지만, 2013년에 Crystal로 다시 작성됐어요. Ary Borenszweig, Juan Wajnerman, Brian Cardiff가 이 언어를 개발하고 설계했어요.

시작하기

변수

변수를 선언하려면 = 대입 연산자를 사용해요. Crystal에서는 변수 이름을 snake_case 형식으로 작성해요.

number = 1
puts number # => 1

number = 2
puts number # => 2

상수

상수도 같은 = 대입 연산자로 선언하지만, SCREAMING_SNAKE_CASE라고 하는 모두 대문자인 이름을 사용해요.

NUMBER = 1
puts NUMBER # => 1

이미 정의된 상수에 값을 대입하면 컴파일 타임 오류가 발생해요.

NUMBER = 1

NUMBER = 2
# Error: already initialized constant NUMBER

타입

Crystal은 컴파일 언어예요. 즉, 모든 변수와 메서드 인자는 컴파일 시점에 타입이 정해져요. 컴파일러는 변수나 메서드 인자의 타입을 추론할 수 있어요. 하지만 경우에 따라 타입을 직접 지정해야 할 때도 있어요. 타입을 지정해야 하는 경우는 이후 개념에서 설명해요.

메서드

메서드는 재사용할 수 있는 명령을 묶는 방법이에요. Crystal에서 메서드는 보통 클래스, 모듈, 구조체 안에 정의해요. 하지만 클래스, 모듈, 구조체 밖에도 메서드를 정의할 수 있어요. 메서드는 def 키워드 뒤에 메서드 이름을 붙여 선언해요. Crystal에서는 메서드 이름도 snake_case 형식으로 작성해요. 메서드에 인자가 없으면 괄호를 생략할 수 있어요. 메서드의 끝을 표시하려면 end 키워드를 사용해야 해요.

def hello
  puts "Hello World!"
end

변수나 메서드 인자의 타입에 존재하지 않는 메서드를 사용하면 컴파일 타임 오류가 발생해요.

number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String

인자

메서드는 인자를 가질 수 있어요. 인자는 메서드에 전달되는 데이터예요. 메서드에 인자를 넘기려면 인자의 이름을 지정해야 해요. Crystal에서 인자 이름은 snake_case 형식으로 작성해요. 메서드는 여러 개의 인자를 가질 수 있는데, 인자 사이는 쉼표로 구분해야 해요.

def hello(name)
  puts "Hello #{name}!"
end

메서드는 여러 인자를 가질 수도 있어요. 이때는 인자들을 쉼표로 구분해야 해요.

def hello(name, language)
  puts "Hello #{name}! You are learning #{language}."
end

메서드 호출하기

클래스, 모듈, 구조체에 속한 메서드를 호출할 때는 점 연산자(.)를 사용해야 해요. 형식은 <ClassName>.<method_name>이에요. 메서드가 클래스, 모듈, 구조체에 속하지 않는다면 이름만 써서 호출하면 돼요. 메서드는 항상 마지막 표현식의 값을 암시적으로 반환해요.

메서드에 인자가 있으면, 메서드 호출과 정의에서 인자를 지정할 때 다음과 같이 괄호를 사용할 수 있어요: <method_name>(<argument_1>, <argument_2>, ...). 메서드에 인자가 없으면 괄호는 생략해요.

def hello(name)
  "Hello #{name}!"
end

hello("Crystal")
# => Hello Crystal!

인자가 여러 개인 메서드를 호출할 때는 인자 사이를 쉼표로 구분해요. 인자는 메서드에 정의된 순서와 같은 순서로 전달해야 해요.

def hello_language(name, language)
  "Hello #{name}! You are learning #{language}."
end

hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.

인자의 개수를 잘못 지정해 메서드를 호출하면 컴파일 타임 오류가 발생해요.

hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)

덧셈, 뺄셈, 곱셈

Crystal에서는 + 연산자로 두 수를 더할 수 있어요. - 연산자로 두 수를 뺄 수도 있어요. 그리고 * 연산자로 두 수를 곱할 수도 있어요.

1 + 1
# => 2

2 - 1
# => 1

2 * 2
# => 4

주석

Crystal에서 주석은 # 문자 뒤에 공백을 하나 두고 작성해요. 주석은 코드를 설명하는 데 사용해요. 컴파일러는 주석을 실행하지 않아요.

# This is a comment
GitHub에서 편집 링크가 새 창이나 탭에서 열려요

기초 배우기