객체지향 프로그래밍의 5가지 특징

Written by Tejay
on 

객체지향 프로그래밍의 5가지 특징

1. 추상화(Abstraction)

추상화는 공통의 속성이나 기능을 묶에 이름을 붙이는 것이다.
우리가 배우는 객체지향 프로그래밍 관점에서 보면 클래스를 정의하는 것이라고 할 수 있다.

2. 캡슐화(Encapsulation)

캡슐화는 변하는 기능을 분리해 개체의 프로퍼티나 메서드를 묶어 단일 단위 즉, 클래스로 묶는 프로세스를 말한다.
사용자는 이 클래스를 사용함에 있어 클래스가 제공하는 메서드의 기능만을 알고 그 기능만 사용할 뿐이지 실제로 그 메소드가 어떻게 작동하는지는 알 수 없다.
예를 들어, 우리가 자주 쓰는 print함수는 우리가 이 함수를 사용함으로 특정한 값이나 문자를 출력한다는 것은 알지만 실제로 어떻게 작동하는지는 알지 못한다.

3. 은닉화(Hidden)

은닉화는 캡슐화와 비슷하지만 약간의 차이가 있다.
캡슐화로 만든 클래스의 속성들을 외부에서 건드리지 못하게 접근을 하지 못하도록 private로 설정해서 클래스 밖에서 함부로 건드리지 못하게 한다.

4. 상속성(Inheritance)

상속성이란 상위 클래스(부모 클래스)의 특징을 하위 클래스(자식 클래스)가 물려받는 것을 말한다.
하나의 클래스가 가지고 있는 특징 (프로퍼티나 메서드)들을 그대로 다른 클래스가 물려줄 수 있는 특징을 가지고 있다.
이 상속은 스위프트에선 하나밖에 받을 수 없다.
상속성이라는 특징이 없다면 절차지향과 다를게 없고 객체 지향에서 제일 중요한 특징이다.

5. 다형성(Plymorphism)

다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 몇가지 예를 들어 다형성을 설명해보도록 하자.
오버로딩

다른 동작을 하는 메서드가 이름을 서로 공유하는 것을 오버로딩이라 한다.

예를 들어 클래스 내에 평균을 구하는 메서드를 같은 이름으로 두 개를 구현했다고 하자.

평균을 구할 때 하나의 메서드는 파라미터의 데이터타입을 Int로 로 받아서 평균을 구했고 다른 하나는 파라미터의 데이터타입을 Double로 받아서 평균을 구했다.

여기서 두개의 메서드는 같은 이름이고 같은 기능을 하지만 데이터를 받는 데이터의 타입이 다르기 때문에 서로 다른 동작을 한다고 볼 수 있다. 이것이 오버로딩의 다형성의 예이다.

여기서 메서드의 기능이 꼭 같아야만 하는 것은 아니다.

class printValue {
  var a: Int = 10
	func outValue (num: Int) {
		print(num - 2)
	}
	func outValue (name: String) {
		print(name + "good")
	}
}
오버라이딩

부모클래스에서 물려 받은 메서드를 자식 클래스에서 기능을 다시 정의 해서 사용하는 것을 뜻한다.

상속받는 여러 클래스들이 같은 이름으로 다른 기능을 하는 메소드를 정의하고 사용할 수 있다. 하지만 이를 이용하면 부모클래스에 있는 메서드는 더 이상 사용할 수 없다.

예를 들면, 아래와 같이 상속 받은 printString이란 클래스에서 printValue를 상속 받았다. 상속 받으면 부모 클래스의 outValue라는 메서드를 사용할 수 있지만 자식 클래스인 printString 클래스에서는 outValue라는 메서드를 다르게 설정해서 사용할 수 있다.

class printValue {
  var a: Int = 10
  
  func outValue (num: Int) {
      print(num - 2)
  }
}

class printString: printValue {
    override func outValue (name: String) {
        print(name + ", hello")
    }
}