메서드 선언

Volc·2023년 3월 29일
0

Scala

목록 보기
4/9

메서드의 기본인자와 이름 붙은 인자

case class Point(x: Double = 0.0, y: Double = 0.0) {	// 초기값 정의
	def shift(deltax: Double = 0.0, deltay: Double = 0.0) = 
    	copy(x + deltax, y + deltay)// 자동으로 생기는 copy method를 활용하여 shift 함수 정의
}

val p1 = new Point( x= 3.3, y=4.4)  // 이름 붙은 인자를 명시적으로 사용
  • 이름 붙은 인자를 사용하면 메서드를 사용하는 코드를 더 읽기 쉽게 만들 수 있다.
  • 인자 목록이 너무 길어지지 않게 주의하여 사용한다.

인자 목록이 여럿 있는 메서드

abstact class Shape(){
	/*
    두 인자 목록을 받는다.
    한 인자 목록은 그림을 그릴 때 x, y축 방향으로 이동시킬 오프셋 값
    나머지 인자 목록은 앞에서 봤던 함수 인자다.
    */
	def draw(offset: Point = Point(0.0, 0.0))(f: String => Unit): Unit = 
    	f(s"draw(offset = $offset), ${this.toString}")
}

case class Circle(center: Point, radius: Double) extends Shape

case class Rectangle(lowerLeft: Point, height: Double, width: Double) extends Shape
  • draw 메소드는 두 인자를 갖는 인자 목록을 하나만 갖는것이 아닌 하나의 인자를 갖는 인자 목록 두개를 갖고 있다.
  • 원하는 만큼 인자 목록을 추가할 수 있지만 둘 이상을 사용하는 경우는 드물다.
  • 그럼 왜 인자 목록을 둘 이상을 사용할까?
    • 마지막 인자 목록이 함수 인자를 하나만 받는 경우 멋진 블록 구조의 구문을 사용할 수 있다.
      s.draw(Point(1.0, 2.0)){str => println(s"ShapesDrawingActor: $str")}
    • {...}은 darw에 전달하는 함수이며 익숙한 블록 구조의 구문과 더 비슷해져 보기 편하다
    • 타입 추론이 가능해진다.
      def m1[A](a: A, f: A => String) = f(a)
       def m2[A](a: A)(f: A => String) = f(a)
       m1(100, i => s"$i + $i")	// i에 대한 type을 몰라 에러 발생
       m2(100)(i => s"$i + $i")
    • m1, m2 함수는 Int와 Int => String 함수 인자를 전달한다.
    • m1의 경우 스칼라는 함수 인자 i의 타입을 추론하지 못한다.
    • 반면, m2의 경우 추론할 수 있다.
    • 즉, 마지막 인자 목록을 암시적 인자를 위해 사용할 수 있다는 장점이 있다.
    • 암시적 인자는 implicit 키워드를 사용해서 선언한 인자다.
    • 메서드를 호출할 때, 이런 인자에 명시적으로 인자를 지정하거나, 컴파일러가 영역 안에서 적절한 값을 찾아서 채워 넣도록 할 수 있다.
profile
미래를 생각하는 개발자

0개의 댓글