본문 바로가기
Swift 개발 이야기

Swift 로 알아보는 객체지향 프로그래밍 - 2

by 방화동한량 2020. 2. 19.
728x90

전 시간에서는 객체 지향의 기본 요소들에 대해 알아보았는데요.

 

이번 시간에는 객체 지향의 핵심 개념! 에 대해서 알아보도록 하겠습니다.

 

1. 캡슐화 (Encapsulation)

 

2. 상속 (Inheritance)

 

3. 다형성 (Polymorphism)

 

 

먼저 캡슐화에 대해서 알아보겠습니다.

 

캡슐화는 말 그대로 객체를 하나의 캡슐로 만들어서 내부에 있는 것들을 보호할 수 있게 하는 것이라고 보시면 되겠습니다. 즉 내부에 있는 것들에 직접적으로 접근할 때 일어날 수 있는 예외적인 사항들을 제거하기 위해 접근을 인위적으로 제어하는 것이라고 보시면 편하실 듯 합니다. 이를 위해 접근제한자들을 프로퍼티 앞에다가 지정해두는데, 이 부분은 다음 시간에 자세하게 알아보도록 하겠습니다.

 

두번째는 상속인데요.

 

상속은 제가 생각했을 때 객체지향 프로그래밍에서 가장 중요한 개념이라고 보여집니다. 상속은 말 그대로 부모가 자식에게 자신의 성질을 상속해주는 것이라고 보시면 될것 같습니다.  이전에 만들었던 Person 이라는 클래스를 가지고 예를 들어보도록 하겠습니다.

 

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
     func talk(_ message: String) {
        print("\(name): \(message)")
    }
}

class Korean: Person {

}

class Japanese: Person {

}

let chulsoo: Korean = Korean(name: "철수", age: 30)
let saito: Japanese = Japanese(name: "Saito", age: 30)

chulsoo.talk("안녕하세요!")
saito.talk("こんにちは")

 

위의 예제에서처럼, Korean 클래스와 Japanse 클래스는 Person 이라는 부모 클래스를 상속 받았기 때문에 별도의 생성자나 함수를 내부에서 선언하지 않아도 talk 메소드를 호출할 수가 있습니다.

 

마지막은 다형성 입니다.

 

다형성은 상속에서 이어지는 개념으로 생각하시면 될 것 같습니다. 부모 클래스에서 선언되었던 메서드들이 각 자식 클래스들에서 동일하게 사용되는 것이 아니라, 여러가지 다양한 형태로 사용될 수 있다는 것이죠. 바로 예시로 들어가겠습니다.

class Korean: Person {

	override func talk(_ message: String) {
    	print("저는 한국인입니다.", message)
    }
}

class Japanese: Person {

	override func talk(_ message: String) {
    	print("저는 일본인입니다.", message)
    }
}

 

이렇게 talk 메서드를 override 하여 동일한 형태의 메서드에서 다른 결과값을 반환할 수가 있게 됩니다. 그리고 부모 클래스에서 지원하는 행동을 그대로 사용하고 싶다면 super 를 사용하시면 됩니다.

 

class Korean: Person {

	override func talk(_ message: String) {
    	super.talk(message)
    	print("저는 한국인입니다.")
    }
}

 

이렇게 되면 super 로 부모 클래스 함수의 메서드를 호출하고, 그 이후 "저는 한국인입니다" 라는 추가적인 자식 클래스의 메서드까지 호출할 수가 있게 됩니다.

 

여기까지 간단하게 객체지향의 핵심 개념 3가지를 알아보았습니다.

 

다음에 또 만나요 제발~