Scala.10장 | 상속과 구성


  1. 2차원 레이아웃 라이브러리

    1. 콤비네이터

      특정 도메인의 요서를 결합해 새로운 요소를 만듦

  2. 추상 클래스

    1. abstract class Element {
        def contents: Array[String]
      }
      
    2. contents는 구현이 없는 method => 추상 멤버

    3. abstract => 추상 클래스 => 인스턴스 생성 불가
  3. 파라미터 없는 메소드 정의

    1. abstract class Element {
        def contents: Array[String]
        def height: Int = contents.length
        def width: Int = if (height == 0) 0 else contents(0).length
      }
      
    2. def height VS def height() 차이

      1. 파라미터 없는 메소드 VS 빈 괄호 메소드
        1. 초기화 시 값을 미리 계산 => 약간 빠름
        2. 그러나 값을 저장할 별도의 메모리 공간이 필요
        3. 부수 효과가 없을 경우 () 사용하지 않음 / 반대로 부수 효과가 있을 경우 () 사용
        4. 결론, 호출하는 함수가 어떤 작업을 수행 => 빈 괄호 사용
  4. 클래스 확장

    1. class ArrayElement(conts: Array[String]) extends Element {
        def contents: Array[String] = conts
      }
      
    2. ArrayElement를 Element의 서브타입으로 만듦

    3. ArrayElement = Element의 서브 클래스 / Element는 슈퍼클래스

    4. ArrayElement는 Element에서 비공개(private)가 아닌 멤버를 모두 상속

    5. 슈퍼클래스의 멤버와 이름과 파라미터가 모두 동일한 멤버가 서브 클래스에 있는 경우 오버라이드
  5. 메소드와 필드 오버라이드

    1. class ArrayElement(conts: Array[String]) extends Element {
        val contents: Array[String] = conts
      }
      
    2. 필드와 메소드를 동일한 네임스페이스로 취급하는 이유는 정확히 파라미터 없는 메소드를 val로 오버라이드하기 위해

    3. 자바에선 불가능
  6. 파라미터 필드 정의

    1. class ArrayElement(
      	val contents: Array[String]
      ) extends Element {
      }
      
    2. contents와 conts와 불필요한 네이밍 중복+반복 => 코드냄새…?!

    3. 앞에 val 임을 주목 => 재할당 불가 (그러나 var로도 할수 있고 재할당 가능)

    4. 파라미터 필도에 private, protected, override 같은 수식자 추가 가능

    5. class Cat {
        var dangerous = false
      }
      class Tiger(
      	override val dangerous: Boolean,
      	private var age: Int
      ) extends Cat
      
      ====== 같다 ======
      
      class Tiger(par1: Boolean, par2: Int) extends Cat{
        override val dangerous = par1
        private var age = par2
      }
      
  7. 슈퍼클래스의 생성자 호출

    1. class LineElement (s: String) extends ArrayElement(Array(s)) {
        override def width = s.length
        override def height = 1
      }
      
  8. override 수식자 사용

    1. 부모 클래스에 있는 구체적 멤버를 오버라이드하는 모든 멤버에 override 수식자 붙여야만 함
    2. But, 추상 멤버를 구현할 경우엔 생략 가능
    3. ‘우연한 오버라이드’는 ‘깨지기 쉬운 기반 클래스’
  9. 다형성과 동적 바인딩

    1. 다양한 서브 클래스 만들수 있다…
    2. override를 하지 않으면 슈퍼클래스의 메소드를 사용한다..
  10. final 멤버 선언

    1. 서브 클래스가 override 못하도록 방지
    2. 클래스에도 사용가능
  11. 상속과 구성 사용

    1. is-a 관계 모델링…? => 상위 클래스가 하위 클래스를 모두 포함
  12. above, beside, toString 구현

  13. 팩토리 객체 정의

  14. 높이와 너비 조절

  15. 한데 모아 시험해보기

  16. 결론