-
[Scala]5-기본 타입과 연산scala 2020. 3. 13. 14:04
기본적으로 자바와 동일 차이점 중심으로 정리
5.1 기본타입
값 타입 범위 Byte 8비트 2의 보수 표현을 사용하는 부호 있는 정수 Short 16비트 2의 보수 표현을 사용하는 부호 있는 정수 Int 32비트 2의 보수 표현을 사용하는 부호 있는 정수 Long 64비트 2의 보수 표현을 사용하는 부호 있는 정수 Char 16비트 부호 없는 유니코드 문자 String Char의 시퀀스 Float 32비트 IEEE 754 단정도(기본정밀도) 부동소수점 수 Double 64비트 IEEE 754 배정도(2배정밀도) 부동소수점 수 Boolean true 또는 false java.lang 패키지에 있는 String을 제외하면, 표 5.1에 있는 모든 타입은 scala패키지의 멤버다.
5.2 리터럴
표5.1에 쓴 기본 타입은 모두 리터럴로 적을 수 있다. 리터럴은 상수 값을 코드에 직접 적는 방법을 의미한다.
//5.2 println("---hex---") val hex = 0x5 println(hex) val hex2 = 0x00FF println(hex2) val magic = 0xcafebabe println(0xcafebabe) //val oct = 035 // 2.11 부터 사용못함 println("---dec---") val dec1 = 31 println(dec1) val dec2 = 255 println(dec2) val dec3 = 20 println(dec3) println("---long---") val prog = 0XCAFEBABEL println(prog) val tower = 35L println(tower) val of = 31l println(of) println("---short,byte,double---") val little: Short = 367 println(little) val littler: Byte = 38 println(littler) val big = 1.2345 println(big) val bigger = 1.2345e1 println(bigger) val biggerStill = 123E45 println(biggerStill) val little1 = 1.2345F println(little1) val littleBigger = 3e5f println(littleBigger) val anotherDouble = 3e5 println(anotherDouble) val yetAnother = 3e5D println(yetAnother) println("---char literal---") val a = 'A' println(a) val c = '\101' println(c) val d = '\u0041' println(d) val f = '\u0044' println(f) val B\u0041\u0044 = 1 println(BAD) val backslash = '\\' println(backslash) println("---String literal---") val hello = "hello" println(hello) val excapes = "\\\"\'" println(excapes) println("""Welcome to Ultamix 3000. Type "HELP" for help.""") println("""|Welcome to Ultamix 3000. |Type "HELP" for help.""".stripMargin) println("---boolean literal---") val bool = true println(bool) val fool = false println(fool)
심볼 리터럴
심볼 리터럴은 'ident 처럼 쓴다. 작은따옴표 뒤에 오는 식별자(ident)부분은 알파벳과 숫자를 혼합한 올바른 식별자라면 아무것이나 가능하다. 스칼라는 이런 러터럴을 scala.Symbol이라는 클래스의 인스턴스 매핑한다.
5.3 연산자는 메소드다
이런 연산자는 실제로는 일반적인 메소드 호출에 대해 더 나은 문법을 제공해주는 것일 뿐이다. 예를 들어 , 1 + 2는 (1).+(2) 와 같다. 다시 말해, Int 클래스에는 Int를 인자를 받아 Int를 결과로 돌라주는 +라는 이름의 메소드가 있다. 두 Int를 더하면 이 +메소드를 호출하는 것이다.
모든 메소드는 연산자가 될 수 있다
스칼라에서 연산자는 문법적으로 틀별한 겟이 아니다. 어떤 메소드이든 연산자가 될 수 있다. 메소드가 연산자 역할을 할지 여부는 프로그래머가 메소드를 사용하는 방법에 따라 결정된다. s.indexOf('o') 라고 쓴다면 indexOf는 연산자가 아니다. 하지만 s indexOf 'o' 라고 쓴다면 연산자 표기법을 썼기 때문에 indexOf가 연산자다.
피연산자가 연산자 오른쪽과 왼쪽에 하나씩 2개 있는 중위 표기와 달리, 전위나 후위 연산자는 단항unary 연산자다.
전위 연산자로 쓰일 수 있는 식별자는 +, -, !, ~ 네 가지뿐이다.
후위 연산자는 인자를 취하지 않는 메소드를 '.'이나 괄호 없이 호출하는 경우다.
5.4 산술 연산
%로 구할 수 있는 부동소수점 나머지는 IEEE754 표준과 다르다. IEEE754 표준에서는 나머지 계산 시 반올림 나눗셈을 사용하며, 버럼 나눗셈을 사용하지 않기 때문에 스칼라의 정수 나머지 연산과 많이 다르다. 만약 IEEE754 나머지가 정말 필요하다면, 다음과 같이 scala.math의 IEEEremainder 를 호출한다.
scala> math.IEEEremainder(11.0, 4.0) resl4: Double = -1.0
5.5 관계 및 논리 연산
연산자가 단순한 메소드인데 어떻게 쇼트 서킷이 가능한지 궁금할 것이다. 보통 모든 인자를 메소드에 전단하기 전에 먼저 계산하는데, 어떻게 연산자 메소드가 두 번째 피연산자를 계산하지 않을 수가 있을까? 해답은 스칼라 메소드에는 인자 계산을 미루는 기능이 있다는 것이다. 심지어 사용할 필요가 없다면 인자를 전혀 계산하지 않을 수도 있다. 이런 기능을 이름에 의한 호출 파라미터라 부르며, 9.5절에서 설명할 것이다.
스칼라의 ==는 자바와 어떻게 다른가?
자바에서는 ==를 사용해 참조 타입과 원시 타입을 비교할 수 있다. 자바의 ==는 원시 타입을 비교할 때 두 값이 같은지 본다. 이는 스칼라와 동일하다. 하지만 참조 타입에서는 두 참조가 같은지를 비교한다. 즉, 두 변수가 JVM 힙에서 같은 객체를 가리키고 있는지를 비교한다. 스칼라도 또한 참조 동일성을 검사하는 기능을 제공한다. 그 이름은 eq이다. 하지만 eq와 그 역인 ne는 자바 객체에 직접 매핑한 객체에만 사용할 수 있다.