IMCAT.DEV
로그인 가입
Scala 입문 객체지향

Scala 클래스와 객체 기초

Scala 클래스와 객체 기초 — 초급

클래스와 객체 기초

1. 도입 (왜 배워야 하는가)

Scala는 객체 지향 프로그래밍(Object-Oriented Programming, OOP) 언어로, 클래스와 객체는 이 언어의 핵심 개념입니다. 클래스는 객체의 설계도이며, 객체는 클래스의 인스턴스입니다. 이런 구조는 코드의 재사용성을 높이고, 프로그램을 더 조직적으로 만들 수 있게 해줍니다. 실무에서 복잡한 시스템을 개발할 때, 클래스를 활용하지 않으면 유지보수와 확장성이 떨어져 한정된 기능만을 수행하는 비효율적인 코드가 만들어질 수 있습니다.

예를 들어, 쇼핑몰 시스템을 개발한다면 '상품'이라는 개념을 객체로 모델링하지 않으면 상품의 특성이나 행동을 명시적으로 나타내기 어려워집니다. 이로 인해 코드의 가독성과 관리가 힘들어질 수 있습니다.

2. 핵심 개념 설명

  • 클래스(Class): 객체를 생성하기 위한 청사진입니다. 클래스는 속성(필드)과 행동(메서드)을 정의합니다.
  • 객체(Object): 클래스의 인스턴스입니다. 즉, 클래스에서 정의된 속성과 행동을 가진 구체적인 실체입니다.
  • 비유하자면, 클래스는 '자동차의 설계도'이고, 객체는 '실제 자동차'라고 볼 수 있습니다. 설계도에는 자동차의 색상, 모양, 엔진의 종류 등이 명시되어 있지만, 실제 자동차는 이 설계도를 바탕으로 만들어진 것입니다.

    용어정의
    클래스객체의 설계도
    객체클래스의 인스턴스
    속성객체가 가지는 데이터
    행동객체가 수행할 수 있는 기능

    3. 기본 코드 예제

    아래는 간단한 클래스와 객체의 예제입니다:

    // 자동차 클래스를 정의합니다.
    class Car(val brand: String, val model: String) {
      def drive(): String = {
        s"$brand $model가 주행 중입니다."
      }
    }
    
    // 자동차 클래스의 객체를 생성합니다.
    val myCar = new Car("현대", "아반떼")
    
    // 자동차를 주행합니다.
    println(myCar.drive())

    실행 결과:

    현대 아반떼가 주행 중입니다.
  • class Car(...): 'Car'라는 클래스를 정의하고, 두 개의 속성 brand와 model을 초기화합니다.
  • def drive(): 자동차가 주행할 때 호출되는 메서드를 정의합니다.
  • val myCar = new Car(...): 'Car' 클래스의 인스턴스인 myCar를 생성합니다.
  • println(myCar.drive()): myCar의 drive 메서드를 호출하여 결과를 출력합니다.
  • 4. 실전 활용 예제

    쇼핑몰에서 장바구니를 구현할 때

    class ShoppingCart {
      private var items: List[String] = List()
    
      def addItem(item: String): Unit = {
        items = items :+ item
        println(s"$item이 장바구니에 추가되었습니다.")
      }
    
      def viewCart(): List[String] = {
        items
      }
    }
    
    val cart = new ShoppingCart()
    cart.addItem("사과")
    cart.addItem("바나나")
    println(cart.viewCart())

    상황 설명: 장바구니에 상품을 추가하고, 현재 장바구니에 담긴 상품을 보여주는 클래스입니다.

    학생 관리 시스템에서 학생 정보를 관리할 때

    class Student(val name: String, val age: Int) {
      def info(): String = {
        s"학생 이름: $name, 나이: $age"
      }
    }
    
    val student1 = new Student("홍길동", 20)
    println(student1.info())

    상황 설명: 학생의 이름과 나이를 속성으로 가진 클래스를 정의하고, 학생 정보를 출력하는 메서드를 구현합니다.

    5. 흔한 실수와 주의사항

    1. 객체 초기화 문제

    잘못된 코드:

    class Person {
      var name: String
    }

    올바른 코드:

    class Person(var name: String)
  • 설명: 속성을 초기화하지 않으면 오류가 발생합니다. var 선언 시 초기값이 필요합니다.
  • 2. 메서드 호출 시 괄호 실수

    잘못된 코드:

    println(myCar.drive) // 괄호 없음

    올바른 코드:

    println(myCar.drive()) // 괄호 포함
  • 설명: 메서드를 호출할 때 괄호를 잊지 않아야 합니다.
  • 6. 정리

  • 클래스는 객체의 설계도이며, 객체는 클래스의 인스턴스입니다.
  • 객체 지향 프로그래밍의 핵심은 재사용성과 유지보수성입니다.
  • 클래스를 활용하면 복잡한 시스템을 조직적으로 설계할 수 있습니다.
  • 다음에 학습하면 좋은 주제는 '상속(Inheritance)'과 '다형성(Polymorphism)'입니다. 이를 통해 OOP의 강력한 기능을 이해할 수 있습니다.