Scala CH01. 확장 가능한 언어
아래의 글은 마틴 오더스키,렉스 스푼,빌 베너스 공저 / 오현석,이동욱,반영록 공역, 『Programming in Scala 3/e
』,에이콘출판사(2017), CH01의 내용을 기반으로 작성하였습니다.
optional
- scala
- scalable
- object oriented
- functional
- statically typed language
- library abstraction
- trait : pluggable like interface ( 하지만 메소드 정의 가능 (java 8 디폴트 메서드), 필드도 정의 가능)
- mixin : like multiple inheritance
- function literal
언어를 사용자가 필요한 방향으로 고칠수 있게 허용
함수 값도 객체다
함수 타입은 서브클래스가 상속할 수 있는 클래스다
함수와 객체의 통합
순수한 객체 지향 언어 (모든 값은 객체이며, 모든 연산은 메소드 호출)
스칼라는 함수형이다
함수형 프로그래밍의 기초는 lambda 계산법
OOP 관점에서
객체 : 데이터와 연산
객체의 미결 측면
객체가 아닌 값 존재 : primative type
어떤 객체의 멤버도 아닌 필드, 메소드 : static filed and method
함수형 프로그래밍 조건
- 일급함수
함수 : first class 즉 정수나 문자열 같음
함수를 다른 함수에 인자로 넘기거나,
함수의 결과를 함수로,
함수를 변수에 저장
다른 함수의 내부에서 함수 정의
함수를 1급 계층으로 만들면, 한수가 내부에서 함수를 반환하면, 그 함수 값 안에서 모든 변수를 단은 환경을 저장해 두어야 문제가 생기지 않는다. 이 처리를 위해서 클로저
2. 변경 불가능 immutable 데이터, 메소드 side effect 가 없어야 함, 입력값 함수 출력값, referentially transparent
메소드는 인자를 받아서 결과를 반환하는 방식에서 새로운 값을 반환하는 것 이외에는 다른 영향을 시스템에 주지 않아야 함.
주어진 입력에 대해서 영향을 주지 않음.
s.replace
함수를 일반화 하면 표현력이 늘어남
scala가 프로그래밍 언어로 좋은 이유
- 스칼라는 호환성이 좋다.
- 스칼라는 jvm의 바이트 코드로 컴파일 된다
- 스칼라 코드는 자바 메소드를 호출할 수 있고, 자바 필드에 접근할 수 있고, 자바 클래스 상속하거나, 자바 인터페이스를 구현할 수 있다
- 대부분의 스칼라 코드는 자바 라이브러리를 사용함.
- 스칼라는 간결하다
- 코드수가 자바대비 절반정도
- class Myclass(index : Int, name : String) : 클래스 선언, private 2개 선언, 2개까지 생성자 선언 완료 : 간결함
- 스칼라는 고수준이다
- 저차원 (데이터 직접 접근)이 아닌 고차원 질의 에 의한 처리
- val nameHasUpperCase = name.exists(_.isUpper)
- function literal : _.isUppper
- 스칼라는 정적타입언어이다
- 제네릭, 교집합, 추상타입
- 정적타입 시스템 이지만, 타입 추론, 패턴매치, 타입합성
- 프로퍼티 검증 - 타입 테스트 코드
- 안전한 리팩토링 - 변경하면 컴파일 안되는 부분 표시
- 문서화
타입이란 : 프로그램에서 어떤 변수 등이 취할 수 있는 값의 범위와 그 변수에 적용할 수 있는 연산의 종류를 정하고, 컴파일러나 인터프리터가 이를 미리 검증해주는 것
자바와 차이나는 점 : 자바는 변수 선언형태 (타입 변수 String aaa)인데 스칼라는 (변수 타입 aaa String) 임, 변수 타입의 형태는 타입 추론에 유리하며, 생략하기가 쉬움.