[CS] 객체지향 프로그래밍(OOP) 이해하기

2022. 3. 14. 23:38Programming/iOS_Swift

객체지향 프로그래밍(Object Oriented Programming)이란?

  어떠한 응용 프로그램을 만들때 사용되어지는 설계방법론 중의 하나이다. 프로그램의 각 기능과 요소들을 클래스 단위로 쪼개어 놓고 각 클래스 안에 역할에 맞는 메서드와 프로퍼티를 정의한 뒤, 클래스의 인스턴스(객체)를 생성하여 객체들간의 상호작용을 통해 프로그램을 구현하는 방법을 의미한다.

  말이 좀 어려울 수 있는데, 예를 들어 '지역대 전술 훈련'이라는 프로그램을 만든다고 했을 때 '훈련 방식'에 대한 클래스, '지역대'에 대한 클래스, '훈련 장소'에 대한 클래스, '훈련 시간'에 대한 클래스, '우발사항'에 대한 클래스, '작전지속지원'에 대한 클래스 등 각 역할과 기능에 맞게 클래스를 구성해놓고 각 클래스들의 인스턴스(객체)들의 상호작용을 통해 프로그램을 만드는 것이다!

객체지향 프로그래밍의 특성

1. 추상화

  우리가 클래스를 정의함에 있어서 해당 클래스는 역할에 맞게끔 공통적인 프로퍼티와 메서드등을 가지고 있어야 한다. 

  즉, 위의 예시를 다시 끌고와보면 지역대원1 김갑돌 병장, 지역대원2 박철수 이병 등 각각의 객체들의 공통된 특성과 기능을 모아서 '지역대'라고 하는 추상화된 클래스로 정의하여 묶는 것이다. 이렇게 추상화된 클래스에 묶음으로써 우리는 코드의 반복을 줄일 수 있다. 김갑돌 병장과 박철수 이병을 추상화된 클래스에 묶어두지 않는다면, 예를 들어 둘 다 남자라는 공통적인 속성이 있을 때, 불필요하게 해당 속성을 두 번 정의해야 한다.

2. 캡슐화

  우리는 각 역할별로 필요한 메서드와 프로퍼티들을 클래스로 묶어서 캡슐화해야 한다. 캡슐화함으로써 우리는 접근제어자를 통한 정보 은닉이 가능하다.

  외부로 굳이 알려줄 필요가 없는 프로퍼티나 메서드들이 있다면 우리는 private 키워드를 사용하여 외부로부터의 해당 내용에 대한 접근을 막을 수 있다. 다시 예를 들어 설명하면, '훈련 방식' 클래스의 프로퍼티 중에서 프로퍼티 '아침', '점심', '저녁'이 있다고 했을 때, 이들은 굳이 외부에서 접근할 필요가 없이 클래스 내에서 알아서 처리해주면 되는 프로퍼티들이다. 어차피 어떤 훈련 방식으로 하든 밥은 삼시세끼 챙겨먹을테니 말이다. 이런 경우 접근제어자 private 키워드를 통해 해당 프로퍼티들에 대한 정보은닉을 할 수 있다.

3. 상속

  우리는 클래스 끼리 중복되는 메서드나 프로퍼티들이 존재한다면 이를 상속을 통해 중복되는 코드를 줄이고 코드의 재사용성을 증가시킬 수 있다.

  즉 예를 들어, 일반적으로 군대에서는 지역대 밑에 4개의 중대가 존재한다. 따라서 '지역대' 클래스와 '중대' 클래스가 있다고 했을 때, 두 클래스 사이에 중복되는 메서드나 프로퍼티들을 부모 클래스 '지역대' 클래스에 정의해두고 '중대' 클래스는 '지역대' 클래스를 상속받아서 해당 프로퍼티와 메서드들을 사용할 수 있다.

4. 다형성

  우리는 클래스내의 메서드나 프로퍼티가 상황에 따라서 다르게 사용되게할 수 있다.

  이게 무슨 말이냐면, 어떤 클래스 안에 Run()이라는 메서드가 있을 때, 이 메서드가 어떤 상황이냐에 따라 다른 로직을 호출한다는 것이다. 상황이라는 말이 모호할 수 있는데, 이는 Overriding을 통해 상황이 나누어진다. 오버라이딩은 부모클래스와 자식클래스가 있을 때 자식클래스가 부모클래스의 메서드나 프로퍼티를 재정의 하는 것이다.

예를 들어, '지역대' 클래스에 countNumber()라는 메서드가 있을 때, '지역대' 클래스를 상속받은 '중대' 클래스에서 countNumber()를 오버라이딩해서 다른 결과값을 도출하게 할 수 있다. 

객체지향 프로그래밍의 장단점

1. 장점

(1) 코드의 재사용성이 증가하고 코드의 반복이 줄어든다.
(2) 유지보수가 간편하다.
(3) 생산성이 증가한다.

2. 단점

(1) 객체지향 프로그래밍을 위한 클래스를 설계하는 시간이 절차적 프로그래밍에 비해 오래 걸린다.
(2) 절차적 프로그래밍에 비해 처리속도가 느리다.
(3) 난이도가 높다.