본문 바로가기

Julia

Julia - Julia에서 특별한 점들

Julia라는 언어를 배우면서 Julia에 있어서 다른 언어와 다른, 특별한 점이 있다면 여기에 적어놓으려고 한다.

 

스트링 합체

다른 언어에서는 "+"를 통해서 두 스트링을 합치지만, Juliad에서는 "*"를 통해서 두 스트링을 합친다.

 

julia> a = "hello"
"hello"

julia> b = "world"
"world"

julia> a * b
"helloworld"

 

따라서 어떠한 스트링을 반복하고 싶을 때에는, 그 스트링을 거듭제곱하는 것이라고 생각하면 되기 때문에, 다음과 같이 작성하여 반복된 스트링을 얻을 수 있다.

julia> "hi" ^ 5
"hihihihihi"

 

어레이의 정의 (또는 벡터)

Julia에서는 기본적으로 어레이 또는 벡터에 어떤 자료형의 값이 들어가는 지가 정의되어 있다. 그러므로 다음과 같은 일이 일어난다.

julia> a1 = [1,2,3,4,5]
5-element Vector{Int64}:
 1
 2
 3
 4
 5

julia> a2 = [1,2.0,3,4,5]
5-element Vector{Float64}:
 1.0
 2.0
 3.0
 4.0
 5.0

julia> a3 = ["a",1,2,3]
4-element Vector{Any}:
  "a"
 1
 2
 3

 

a2의 경우 자동적으로 Julia가 Float64로 이루어진 array라고 판단하여 안에 들어가는 Int64 자료형의 요소들을 자동으로 Float64로 바꾸어 array에 넣어주었다.

 

만약 Array의 요소들의 자료형을 정의해주고 싶다면, 다음과 같이 적어주면 된다.

julia> array = String["abc"]
1-element Vector{String}:
 "abc"

julia> push!(array, "def")
2-element Vector{String}:
 "abc"
 "def"

julia> push!(array, 10)
ERROR: MethodError: Cannot `convert` an object of type Int64 to an object of type String

 

위와 같이 정의된 자료형과 다른 자료형의 객체를 array에 넣으려고 하면 에러가 뜬다.

 

인덱싱

Julia의 경우 인덱싱이 1부터 시작한다. (1-based indexing)

julia> array = [1, 2, 3, 4, 5]
5-element Vector{Int64}:
 1
 2
 3
 4
 5

julia> array[1]
1

 

매트릭스와 벡터

Julia에서 1차원 벡터는 Vector라고 표시되고, 2차원부터는 Matrix라고 표시된다. Matrix는 다음과 같이 선언할 수 있다. 물론 n * 1 의 Matrix도 선언할 수 있다. Vector는 객체 사이를 콤마 (,) 로 구분하고, Matrix는 같은 행의 객체는 띄어쓰기 (Whitespace) 로 구분하고, 그리고 각 행은 세미콜론 (;) 으로 구분한다.

julia> vector = [1, 2, 3, 4]
4-element Vector{Int64}:
 1
 2
 3
 4

julia> array_2d = [1 2 3 4; 5 6 7 8]
2×4 Matrix{Int64}:
 1  2  3  4
 5  6  7  8
 
 julia> array_2d = String["abc" "def"; "ghi" "jkl"]
2×2 Matrix{String}:
 "abc"  "def"
 "ghi"  "jkl"
 
 julia> array_1d = [1 2 3 4]
1×4 Matrix{Int64}:
 1  2  3  4

 

레인지 (Range)

Julia의 기본 자료형 중 Range라는 것이 있다. 이 자료형은 첫 값과 마지막 값, 그리고 각 단계 별 차이로 구성되어 있다. 각 단계 별 차이가 정의되어 있지 않다면 기본적 으로 1로 설정된다.

 

julia> 1:5
1:5

julia> typeof(1:2:5)
StepRange{Int64, Int64}

julia> typeof(1:5)
UnitRange{Int64}

julia> 0.5:4.5
0.5:1.0:4.5

julia> 0.5:0.25:4.5
0.5:0.25:4.5

julia> collect(0.5:0.25:1.5)
5-element Vector{Float64}:
 0.5
 0.75
 1.0
 1.25
 1.5

julia> collect(1:5)
5-element Vector{Int64}:
 1
 2
 3
 4
 5

 

array 내 객체 접근

다음과 같이 range 또는 vector를 사용하여 array 내의 해당하는 인덱스를 가진 객체들을 지닌 Vector를 반환받을 수 있다. 마지막 객체까지 접근하고 싶을 경우 end 키워드를 사용한다.

julia> array = [10, 20, 30, 40, 50]
5-element Vector{Int64}:
 10
 20
 30
 40
 50

julia> array[2:4]
3-element Vector{Int64}:
 20
 30
 40

julia> array[[1, 3, 5]]
3-element Vector{Int64}:
 10
 30
 50
 
 julia> array[2:end]
4-element Vector{Int64}:
 20
 30
 40
 50

 

튜플에 요소 저장

튜플에 다음과 같이 요소를 저장할 수 있다.

 

julia> t1 = (maths = 60, english = 70)
(maths = 60, english = 70)

julia> t1.maths
60

julia> t1.english
70

 

딕셔너리 선언 및 조회

다음과 같이 딕셔너리를 선언 및 조회한다.

julia> d1 = Dict("a1" => 1000, 2 => "hello")
Dict{Any, Any} with 2 entries:
  2    => "hello"
  "a1" => 1000

julia> d1["a1"]
1000

julia> d1[2]
"hello"

 

심볼 (Symbol)

자료형의 하나로, 앞에 콜론 (:) 을 붙여 선언한다. 딕셔너리 등에서 사용될 수 있다.

julia> :hello
:hello

julia> typeof(:hello)
Symbol

 

인플레이스 함수 (In-Place)

인자로 들어가는 변수가 함수 내부에서 연산을 통해 바뀌게 될 경우 이 함수를 인플레이스 함수라고 한다. 이 경우 함수의 끝에 느낌표 (!) 를 넣어 표시해준다. 이와 같은 함수로는 기본 함수인 delete!, push!, append! 등이 있다.

 

삼항식

삼항식의 앞에는 무조건 불린 값만 들어가야 한다.

 

julia> "a" ? "hello" : "bye"
ERROR: TypeError: non-boolean (String) used in boolean context
Stacktrace:
 [1] top-level scope
   @ REPL[1]:1

julia> "a" == "a" ? "hello" : "bye"
"hello"

 

end 키워드

Julia에서는 루프, 조건문, 함수 등의 블록을 작성하다가 끝났다는 것을 인지시키기 위해서 end 키워드를 사용한다.

julia> a = 10
10

julia> if a > 10
           print("a is greater than 10")
       elseif a < 10
           print("a is less than 10")
       else
           print("a is equal to 10")
       end
a is equal to 10

 

함수인자의 타입 설정

Julia는 덕타이핑도 지원하고 함수인자의 타입 설정도 지원한다. 그러나 같은 이름의 함수라면 타입 설정된 함수가 가장 먼저 적용된다.

julia> function sayHi(name)
           println("Hello, duck-type $(name)")
       end
sayHi (generic function with 1 method)

julia> function sayHi(name::String)
           println("Hello, String $(name)")
       end
sayHi (generic function with 2 methods)

julia> sayHi(112)
Hello, duck-type 112

julia> sayHi("Beom Seok")
Hello, String Beom Seok

 

이름이 같지만 들어가는 타입에 따라서 다른 작용을 하는 것을 Multiple Dispatch라고 한다.

파이썬과 비슷한 comprehension

빠른 Vector 정의

julia> arr = [i*2 for i in 1:5]
10-element Vector{Int64}:
  2
  4
  6
  8
 10

 

빠른 Matrix 정의

julia> mat = [(x, y) for x in 1:3, y in 1:2]
3×2 Matrix{Tuple{Int64, Int64}}:
 (1, 1)  (1, 2)
 (2, 1)  (2, 2)
 (3, 1)  (3, 2)

 

뒤에 if문을 넣어 더 다양하게 활용 가능하다.

julia> arrif = [i for i in 1:10 if i%2 == 0]
5-element Vector{Int64}:
  2
  4
  6
  8
 10

 

계산식

Julia에서의 거듭제곱은 다른 언어처럼 곱셈기호 두 번을 사용하는 것이 아닌 ^ 기호를 사용한다.

julia> 2 ^ 5
32

 

간단한 함수 만들기

함수를 아주 간단하게 다음과 같이 만들 수 있다.

julia> f(x) = x ^ 2
f (generic function with 1 method)

julia> f(15)
225

 

그리스 문자/특수부호의 사용

다른 언어에서는 그리스 문자의 사용을 권장하지 않는다. 아니, 오히려 지양하라고 한다. 그러나 Julia의 경우에는 Julia는 애초에 과학 연구를 위해서 만들어진 언어이기 때문에 그리스 문자의 사용이 크게 이상하지 않다. 따라서 유니코드에 들어가는 어느 문자던 원하는 대로 사용할 수 있으며, 당연히 컴파일 때나 그 어느 때에도 오류가 발생하지 않는다.

 

LaTeX와 비슷하게, \ 를 사용하여 해당 문자를 쓸 수 있다.

 

'Julia' 카테고리의 다른 글

Julia - 유용한 함수들  (0) 2022.02.24
Julia - 코딩 컨벤션  (0) 2022.02.24