0Pricing
Scala for Backend Engineering & Functional Programming · 강의

상속과 다형성

Scala의 상속, 추상 클래스와 다형성 같은 객체 지향 원칙을 살펴봅니다.

상속과 다형성은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 2개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 2개의 강의가 포함되어 있습니다.

상속이란 무엇인가요?

상속은 객체 지향 프로그래밍(OOP)의 기본 개념으로, 새 클래스가 기존 클래스의 속성과 동작(메서드)을 물려받을 수 있게 합니다.

'부모-자식' 관계라고 생각해 보십시오. '자식' 클래스(하위 클래스)는 '부모' 클래스(상위 클래스)의 코드를 재사용하므로 시간을 절약하고 일관성을 유지할 수 있습니다.

  • 코드 재사용을 촉진합니다.
  • '~이다' 관계를 설정합니다(예: Dog는 Animal입니다).
  • 코드를 계층 구조로 구성하는 데 도움이 됩니다.

첫 번째 기반 클래스

간단한 Animal 클래스를 정의해 보겠습니다. 이 클래스는 기반 클래스이며, 상위 클래스 또는 부모 클래스라고도 합니다. 기본 동작인 말하기를 포함합니다.

코드를 실행하여 일반적인 동물이 작동하는 모습을 확인해 보십시오!

class Animal {
  val name: String = "Generic Animal"
  def speak(): Unit = {
    println(s"$name makes a sound.")
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val myAnimal = new Animal()
    myAnimal.speak()
  }
}

`extends`로 확장하기

이제 더 구체적인 동물인 Dog를 만들어 보겠습니다. Dog는 Animal입니다. 따라서 extends 키워드를 사용해 Animal 클래스를 상속할 수 있습니다.

또한 speak 메서드를 재정의하여 Dog만의 고유한 소리를 내도록 만들 수 있습니다. override 키워드에 주목해 보십시오.

class Animal {
  val name: String = "Generic Animal"
  def speak(): Unit = {
    println(s"$name makes a sound.")
  }
}

class Dog extends Animal {
  override val name: String = "Dog"
  override def speak(): Unit = {
    println(s"$name barks!")
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val myAnimal = new Animal()
    val myDog = new Dog()
    myAnimal.speak() // Generic Animal makes a sound.
    myDog.speak()    // Dog barks!
  }
}

`override`의 강력한 기능

override 키워드는 Scala에서 다음과 같은 이유로 중요합니다.

  • 명확성: 이 메서드나 필드가 상위 클래스의 멤버를 대체한다는 사실을 다른 개발자에게 명시적으로 알립니다.
  • 안전성: 컴파일러가 실제로 기존 멤버를 재정의하는지 확인합니다. 오타를 내거나 상위 클래스의 메서드가 변경되면 컴파일러가 알려 줍니다.
  • 의도: 상속된 동작을 특화하거나 변경하려는 의도를 명확하게 나타냅니다.

상속된 멤버를 다시 정의할 때는 항상 override를 사용하십시오!

다형성: 다양한 형태

다형성은 '여러 형태'를 의미합니다. 객체 지향 프로그래밍에서는 서로 다른 클래스의 객체를 공통 상위 클래스의 객체로 다룰 수 있게 합니다.

따라서 Animal 타입의 변수에 Dog 객체, Cat 객체 또는 Animal의 다른 하위 클래스 객체를 담을 수 있습니다. 해당 변수에서 메서드를 호출하면 실제 객체의 타입에 맞는 메서드가 실행됩니다.

  • 유연하고 확장 가능한 코드를 만들 수 있습니다.
  • 서로 다른 데이터 타입에 하나의 인터페이스를 사용할 수 있습니다.
  • 메서드 재정의를 통해 구현됩니다.

실전에서의 다형성

다형성이 실제로 어떻게 작동하는지 살펴보겠습니다. Dog와 비슷한 Cat 클래스를 만들겠습니다. 그런 다음 서로 다른 타입의 동물을 공통 상위 타입인 Animal의 목록에 넣고 speak 메서드를 호출할 수 있습니다.

목록에서는 모두 Animal 타입으로 다루지만 각 동물이 자신만의 고유한 방식으로 말하는 것을 확인해 보십시오.

class Animal {
  val name: String = "Generic Animal"
  def speak(): Unit = {
    println(s"$name makes a sound.")
  }
}

class Dog extends Animal {
  override val name: String = "Dog"
  override def speak(): Unit = {
    println(s"$name barks!")
  }
}

class Cat extends Animal {
  override val name: String = "Cat"
  override def speak(): Unit = {
    println(s"$name meows!")
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val animals: List[Animal] = List(
      new Animal(),
      new Dog(),
      new Cat()
    )

    animals.foreach(_.speak())
  }
}

추상 클래스 소개

때로는 공통 인터페이스를 정의하되 일부 멤버에 대한 완전한 구현은 제공하지 않는 기반 클래스가 필요합니다. 이때 추상 클래스를 사용합니다.

추상 클래스는 다음과 같습니다.

  • 직접 인스턴스화할 수 없습니다(추상 클래스의 객체를 생성할 수 없습니다).
  • 추상 메서드(구현이 없는 메서드)와 구체 메서드(구현이 있는 메서드)를 포함할 수 있습니다.
  • 하위 클래스가 완성해야 하는 설계도 역할을 합니다.

추상 설계도 만들기

abstract class Shape를 정의해 보겠습니다. 모든 도형에는 넓이가 있지만, 넓이를 계산하는 공식은 각 도형(원, 직사각형 등)마다 다릅니다.

따라서 area를 추상 메서드로 선언합니다. 본문(= { ... })이 없는 것에 주목해 보십시오. 구현은 하위 클래스가 담당합니다.

abstract class Shape {
  def area: Double // Abstract method, no implementation
  
  def describe(): Unit = {
    println("This is a geometric shape.")
  }
}

// You cannot do: new Shape() - it's abstract!

object Main {
  def main(args: Array[String]): Unit = {
    println("Abstract class Shape defined.")
    println("Cannot instantiate Shape directly.")
  }
}

구체적인 구현

이제 abstract class Shape를 확장하는 Circle과 Rectangle 같은 구체적인 하위 클래스를 만들어 보겠습니다. 이러한 하위 클래스는 추상 area 메서드를 반드시 구현해야 합니다.

또한 Shape에서 구체적으로 구현된 describe() 메서드를 상속합니다.

abstract class Shape {
  def area: Double
  def describe(): Unit = {
    println("This is a geometric shape.")
  }
}

class Circle(radius: Double) extends Shape {
  override def area: Double = math.Pi * radius * radius
}

class Rectangle(width: Double, height: Double) extends Shape {
  override def area: Double = width * height
}

object Main {
  def main(args: Array[String]): Unit = {
    val circle = new Circle(5)
    val rectangle = new Rectangle(4, 6)

    println(s"Circle area: ${circle.area}")
    circle.describe()
    println(s"Rectangle area: ${rectangle.area}")
    rectangle.describe()
  }
}

상속 및 다형성 확인

Scala의 상속과 다형성에 관한 다음 설명 중 TRUE인 것은 무엇인가요?

복습: 상속 및 다형성

훌륭합니다! 이번 학습에서는 Scala의 핵심 객체 지향 프로그래밍 개념을 살펴보았습니다.

  • 상속: 하위 클래스가 extends를 사용해 코드를 재사용하고 상위 클래스와 '~이다' 관계를 정의하는 방식입니다.
  • override 키워드: 상속된 메서드와 필드를 명시적으로 다시 정의하는 데 필수적이며, 타입 안전성과 명확성을 보장합니다.
  • 다형성: 서로 다른 하위 클래스의 객체를 공통 상위 클래스의 객체로 다룰 수 있는 기능으로, 유연하고 확장 가능한 코드를 가능하게 합니다.
  • 추상 클래스: 직접 인스턴스화할 수 없는 설계도로, 공통 인터페이스와 하위 클래스가 구현해야 하는 추상 멤버를 정의하는 데 사용됩니다.

이러한 개념은 구조가 잘 잡히고 유지 관리하기 쉬운 Scala 애플리케이션을 만드는 데 필수적입니다!

자주 묻는 질문

“상속과 다형성” 강의는 무료인가요?

네 — “상속과 다형성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 2개의 강의가 포함되어 있습니다.

“상속과 다형성”에서 뭘 배우나요?

Scala의 상속, 추상 클래스와 다형성 같은 객체 지향 원칙을 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 2개 중 2번째 강의입니다.

“상속과 다형성” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 클래스, 객체와 패키징
  2. 상속과 다형성
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기