본문 바로가기
Programming/Scala

[13강] scala 계층 구조

by 유주원 2018. 4. 3.

스칼라의 계층 구조는 아래의 트리 구조를 따른다.


최상위 슈퍼 클래스는 scala.Any이다. 모든 클래스가 Any를 상속하기 때문에 객체 간의 ==, !=, equals 등의 비교가 가능하다. 또한 Any 클래스에서는 == , !=는 final로 설정이 되어 있기 때문에 override가 불가능 하다.


Any는 서브 클래스를 두 개 가지고 있는데 바로 AnyVal과 AnyRef이다. 

AnyVal의 경우는 Scala에 존재하는 값 클래스의 부모 클래스이며, Byte, Short, Char, Int, Float, Double, Boolean, Unit 이렇게 9 가지 클래스가 값 클래스에 해당한다.

값 클래스는 내부적으로 final 클래스로 선언이 되었기 때문에 new 연산자로 인스턴스화가 불가능 하다.

즉 아래와 같은 사용이 불가능 하다.


new Int


Unit 클래스는 다른 언어의 void에 해당한다. 


그 다음으로 AnyRef는 스칼라의 모든 참조 클래스의 부모 클래스이다. 자바로 작성한 클래스나 스칼라로 작성한 클래스는 모드 AnyRef를 상속한다. 


스칼라에서는 메서드 동작이 일관성 있게 동작한다. 아래의 자바 코드를 보자.


boolean isEqual(int x, int y) { return x == y; }

boolean isEqual(Integer x, Integer y) { return x == y; }


위의 두 함수에 각각 isEqual(5, 5)를 입력하면 어떻게 될까??

하나는 True, 하나는 False로 결과가 떨어지게 될 것이다.


== 연산자의 경우 값의 경우 값의 비교이지만, 참조 객체의 경우 참조 객체의 주소 비교이기 때문이다.


하지만 스칼라에서는 == 연산자가 일관성 있게 동작한다.


def isEqual (x: Int, y: Int) = x == y

def isEqual (x: Any, y: Any) = x == y


하지만 scala에도 역시 참조 동일성 비교를 위한 함수가 존재 한다.


val x = new String("abc")

val y = new String("abc")


x eq y

x ne y


eq는 두 객체의 참조가 동일한지를 비교하는 함수이고 ne는 동일하지 않는 경우를 다루는 함수이다. 

위의 결과는 False, True 이렇게 결과가 나타날 것이다.


마지막으로 scala.Nothing 타입이 있다. Nothing 타입은 언제 어떻게 쓰이는 것일까?

Nothing은 비정상 종료를 나타낼 때 쓰일 수가 있다.


def error(message: String) : Nothing = throw new RuntimeException(message)


def divide(x: Int, y: Int): Int = 

    if ( y != 0) x / y

    else error("can't divide by zero")


위의 식에서 if문이 참인 경우에는 Int 타입이 리턴된다. 또한 if문이 거짓인 경우에는 error가 호출이 되고 Nothing 객체가 리턴이 된다. Nothing 객체는 Int 객체의 서브 클래스이기 때문에 위와 같이 선언이 가능한 것이다.