본문 바로가기

스칼라

스칼라 기본(3)

1. 배열에 타입 파라미터를 지정하기

new : 객체를 인스턴스화할 때 쓰는 키워드

이때, 값과 타입을 파라미터로 넘길 수 있다.

파라미터화(parameterization)라는 말은 인스턴스를 생성할 때 그 인스턴스를 '설정(configure)'한다는 뜻.

예제

val big = new java.math.BigInteger("123456")

 

인스턴스를 타입으로 파라미터화할 때는 하나 이상의 타입을 각괄호([]) 사이에 지정한다.

val greetStrings = new Array[String](3)	// String의 배열, array of string
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "Scala!\n"

for(i <- 0 to 2)
	print(greetStrings(i))

greetingStrings의 타입을 명시적으로 지정할 수 있다.

val greetStrings: Array[String] = new Array[String](3)

 

greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "Scala!\n"

위 세줄의 코드는 greetingStrings 배열의 원소를 초기화한다.

이 세 줄의 코드는 스칼라 val의 의미와 관련해 중요한 개념을 보여준다.

어떤 변수를 val로 지정하면 그 변수를 재할당할 수 없다. 하지만 그 변수가 나타내는 객체는 잠재적으로 여전히 변경 가능하다. 이 경우, greetingStrings에 다른 변수를 넣을 수는 없다. 즉 greetingStrings는 항상 초기화 시 설정한 것과 같은 Array[String] 타입의 배열을 가리킨다. 하지만 Array[String]의 원소는 언제나 변경할 수 있다. 따라서 배열 자체는 변경가능(mutable)하다.

 

스칼라에서는,

'메소드가 파라미터를 하나만 요구하는 경우, 그 메소드를 점(.)과 괄호 없이 호출할 수 있다.'

0 to 2는 (0).to(2)라는 메소드 호출로 바뀐다.

 

스칼라는 기술적으로는 연산자 오버로드를 제공하지 않는다. 스칼라에는 실제로 전통적인 의미의 연산자가 없기 때문이다. 대신에 +, -, *, / 등의 문자를 메소드 이름으로 사용할 수 있다. 따라서 1 + 2는, 1이라는 Int객체에 있는 +라는 이름의 메소드를 인자로 2를 넣어서 호출한 것이다. (1).+(2)

 

이 예가 보여주는 또 다른 중요한 아이디어는 스칼라에서 왜 괄호를 사용해 배열에 접근할 수 있는가이다. 스칼라는 자바보다 예외적인 경우가 적다. 스칼라 배열도 여타 객체와 마찬가지로 평범한 클래스의 인스턴스다. 변수 뒤에 하나 이상의 값을 괄호로 둘러싸서 호출하면 스칼라는 그 코드를 변수에 대해 apply라는 메소드를 호출하는 것으로 바꾼다. greetingStrings(i) 는 greetingStrings.apply(i)로 바뀐다.

이렇게 스칼라에서 배열의 원소에 접근하는 것은 일반적인 메소드 호출과 같다. 이런 원칙은 배열에만 국한되지 않는다. 어떤 종류의 객체이든 괄호 안에 인자를 넣어서 호출하면 apply 메소드를 호출하는 것과 같다. 물론, 해당 객체 안에 apply 메소드가 있어야만 코드를 제대로 컴파일할 수 있다. 따라서 배열 원소 접근은 특별한 형태가 아니고 일반적인 규칙에 따른 것이다.

 

마찬가지로,

greetingStrings(0) = "Hello"

다음과 같이 변환한다.

greetingString.update(0, "Hello")

 

스칼라는 배열부터 수식에 이르는 모든 것을 메소드가 있는 객체로 다룬다.

 

배열을 만드는 더 간편한 방법이 있다.

val numNames = Array("zero", "one", "two")

위 예제는 apply라는 이름의 팩토리 메소드를 호출한다. 새로운 배열을 만들어서 반환하는.

'스칼라' 카테고리의 다른 글

스칼라 기본(5)  (0) 2021.12.26
스칼라 기본(4)  (0) 2021.12.12
스칼라 기본(2)  (0) 2021.12.06
스칼라 기본(1)  (0) 2021.12.05
스칼라 시작하기  (0) 2021.12.05