스칼라 언어의 계층 구조(Hierarchy)
View: 187
0
0
작성자: 달빛제이크
카테고리: Scala Language
발행: 2024-05-29
수정
2024-06-21
안녕하세요. 달빛제이크입니다.
스칼라의 객체 지향에 이어서 클래스 계층 구조(Class Hierarchy)에 대해 알아보겠습니다.
클래스의 계층 구조는 객체 지향 프로그래밍과 타입 시스템에 공통으로 속해있는 주제이기 때문에 독립된 내용으로 설명하려고 합니다.
-
스칼라의 Any 클래스는 모든 클래스의 최상위 부모 클래스이다. 모든 클래스는 Any의 Subclass이다.
-
Any class는 ==, !=, equals, ##, hashCode, asInstanceOf, isInstanceOf, getClass, toString 메소드를 갖는다. equals, hashCode, toString 외에는 모두 final로 선언되어 Overriding 할 수 없다. ==, !=의 변경은 equals method를 overriding함으로 가능하다.
-
Any는 AnyVal과 AnyRef, 2개의 Subclass를 갖는다.
-
AnyVal은 Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit, 9개 Value Class의 부모 클래스이다. Value Class들은 Java의 primitive type에 해당하며, 해당 Instance들은 literal로 작성되고, Instance를 생성할 때 new keyword를 사용하지 않는다.
*스칼라에서 literal은 소스 코드에서 값을 직접 나타내는 표현식으로 보통 Number, Character, String, Boolean, Symbol, Tuple을 사용하고, 함수 리터럴은 람다 식으로 나타내며 익명 함수를 표현할 때 사용합니다. -
AnyRef는 모든 참조 클래스 (reference class)의 부모 클래스 (base class)이다. 실제로 AnyRef는 java.lang.Object의 alias이다.
-
모든 클래스는 Nothing이라는 가장 낮은 하위 타입을 갖는다. Null은 모든 참조 타입의 하위 타입니다.
Null과 Nothing은 일관된 방식으로 스칼라 Type System의 corner case를 다루는 특별한 타입이다.
Class Null은 null의 참조 타입이고 value type에 사용할 수 없다.
Nothing은 다음과 같이 활용이 가능하다.
// Nothing을 반환하는 method
def error(message: String): Nothing = throw new RuntimeException(message)
// Int를 반환하는 method
// 분모 y가 0이 아니면 Int를 반환하지만 분모가 0이면 Runtime Exception을 발생 시키는데,
// error method가 Nothing을 반환하고 Nothing은 Int의 subclass이기 때문에 type 충돌 없이
// method가 정상적으로 수행됨.
def divide(x: Int, y: Int): Int =
if y != 0 then x / y
else sys.error("can't divide by zero")
스칼라의 클래스 계층 구조는 스칼라의 객체 지향 프로그래밍과 타입 시스템을 이해하기 위해 매우 중요한 특징입니다.
Any, AnyRef, AnyVal, Null, Nothing 등의 특별한 타입들을 이해하면 스칼라의 타입 시스템을 더 잘 활용할 수 있고, 예외 처리나 타입 안정성을 높이는 데 도움을 받을 수 있습니다.
감사합니다.
