이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.


참고 자료


객체지향 프로그래밍 패러다임

  • 객체지향 프로그래밍 패러다임프로그래밍 패러다임의 한 종류객체지향 프로그래밍(Object-Oriented Programming, OOP)이라고 불린다.

  • 객체지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어나 여러 개의 독립된 단위인 객체의 모임으로 파악하고자 하는 시각이다.

  • 객체지향 프로그래밍은 프로그램을 유연하고 쉽게 변경할 수 있도록 작성할 수 있어 대규모 소프트웨어 개발에 많이 사용된다.

  • 객체만 잘 이해하면 프로그래밍을 더 쉽게 배울 수 있고, 소프트웨어 개발과 유지보수를 간편하게 할 수 있으며, 직관적으로 코드를 분석할 수 있다.

  • 소프트웨어 공학의 관점에서 소프트웨어의 질을 향상하려면 강한 응집력(Strong Cohesion)과 약학 결합력(Weak Coupling)을 지향해야 한다.

    • 객체지향 프로그래밍은 클래스에 하나의 문제 해결을 위한 데이터와 메서드를 모야놓은 방식으로 응집력을 강화한다.

    • 객체지향 프로그래밍은 각 클래스를 독립적이 되도록 디자인해 결합력을 약화한다.

  • 실제 세계의 모습을 프로그램 안에 구현하고자 했던 객체지향 프로그래밍 패러다임이지만, 지나친 프로그램의 객체화 경향 때문에 오히려 실제 세계의 모습을 그대로 반영하기 어렵다는 비판을 받기도 한다.

  • 객체지향 프로그래밍의 주요 특징으로는 자료 추상화, 상속, 다형성, 동적 바인딩 등이 있다.

  • 객체지향 프로그래밍 패러다임을 차용한 언어에는 스몰토크(Smalltalk), Objective-C, C++, C#, JAVA, Python, Ruby, Swift등이 있다.


객체지향 프로그래밍에서 주요하게 다루는 용어

  • 클래스 (Class)

    • 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성과 행위를 정의한것이다.

    • 객체지향 프로그램의 기본 사용자정의 데이터 타입이라고 할 수 있다.

    • 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 한다.

  • `객체 (Object)

    • 클래스의 인스턴스(실제로 메모리에 할당되어 동작하는 모양을 갖춘 것, instance)이다.

    • 객체는 자신 고유의 속성이 있으며 클래스에서 정의한 행위를 할 수 있다.

    • 스위프트에서는 ‘객체’라는 용어보다는 ‘클래스의 인스턴스’라는 표현을 사용한다.

  • 객체(Object)와 인스턴스(Instance)

    • 객체와 인스턴스는 동의어가 아니다.

    • '객체 == 클래스의 인스턴스', '객체 != 인스턴스' 이다.

    • 즉, 인스턴스는 구조체의 인스턴스도 있고, 열거형의 인스턴스도 있을 수 있다 그러므로 객체는 인스턴스 중에도 클래스 인스턴스만 가리키는 말로 좀 더 한정적인 의미이다.


클래스와 객체

  • 클래스는 객체가 만들어지기 위한 청사진으로 비유할 수 있다.

  • 클래스는 실제 메모리에 객체를 할당해 인스턴스를 만들기 위한 일종의 설계코드이다.

  • 클래스에 구현된 코드대로 실제로 객체가 메모리에 올라가 활동하게 된다.

  • 클래스에 정의된 모양대로 객체가 생성되고 객체간의 메시지를 통해 프로그램의 각 명령이 실행된다.


스위프트에서 객체지향 프로그래밍 패러다임의 사용

class SomeClass {
    var someProperty: Any = 1
    func someMethod() {
        // some task...
    }
}

let myInstance: SomeClass = SomeClass()
// SomeClass라는 이름의 클래스의 이니셜라이저를 호출하여
// myInstance라는 이름의 상수에 할당한다.
// 클래스의 이니셜라이저를 통해 메모리에 할당되고 초기화한 객체를 인스턴스라고 부른다.

myInstance.someProperty = 100 // 인스턴스의 프로퍼티에 값을 할당할 수도 있다.
print(myInstance.someProperty) // 인스턴스의 프로퍼티의 값을 가져올 수도 있다.

myInstance.someMethod() // 인스턴스의 메서드를 호출하여 작업을 수행하도록 할 수 있다.
  • 위의 코드를 보면 알 수 있듯이 스위프트뿐만 아니라 객체지향 프로그래밍 패러다임을 차용한 언어는 필수로 명령형 프로그래밍 패러다임을 사용한다.

  • 프로퍼티, 변수 등에 해당하는 메모리 값의 변화(상태변화)가 있기 때문이다.