참고자료

이 포스트는 아래에 링크된 블로그의 글을 참고하여 정리한 글 임을 미리 밝히는 바 입니다

OOP 포스트


OOP (Object Oriented Programing)


Object (객체)

  • 객체(Object)란 말 그대로 대상을 나타내는 단어
    • 예를들어 사람 한 명 한 명을 모두 객체라고 할 수 있다
    • 책 한권 한권을 객체라 말 할 수 있다

그러나 사람은 전부 생김새, 성격이 같을 수는 없다, 책 또한 내용이 같을지라도 모두 다른 책이다

100권의 책을 인쇄하여 판매한다고 했을때 그 책 중 한 권의 책에 흠집이 났다고 해서 나머지 99권의 책들이

전부 흠집이 나는것이 아니기 때문이다.


Class (클래스)

사람들을 일반적으로 같은 속성들을 갖고 있다

여기서 속성이란 -> 눈, 코, 입, 손, 발, 장기등을 의미한다

사람마다 같은 속성을 갖고 있지만 그 생김새와 크기 등등이 모두 다르기 때문에

다른 속성 값을 갖고 있다고 할 수 있다.

책도 책 이름, 작가, 출판사, 출판일 등 같은 속성을 갖고 있지만, 책 이름, 착가 등 속성의 값이 모두 다르다.

이처럼 사람 한명 한명을 객체(Object)라 하는데, 객체들이 공통적으로 갖는 속성들을 모아서 정의내린 것을 클래스라고 한다 -> 이것을 추상화라고 한다

즉 사람이라는 클래스는 눈, 코, 입 등의 속성이 존재하고 객체들은 눈, 코 입의 생김새가 다르기 때문에 다른 객체로 분류된다

객체와 클래스를 붕버빵과 붕어빵을 찍는 기계라는 많은 표현을 한다

붕어빵을 찍어내는 기계는 붕어빵이라는 객체들을 생성하기 위한 틀을 제공한다

그래서 붕어빵을 찍는 기계는 클래스라 표현할 수 있다


OOP (Object Oriented Programing)

OOP는 객체의 관점에서 프로그래밍 하는 것을 의미

C언어를 절차 지향 프로그래밍이라고 하는데, 절차 지향 프로그래밍은 함수 단위로 순서대로 프로세스가 진행되는 것을 의미한다

반면 OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다


OOP의 특징

1) 추상화

  • 추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념

지도에는 위성지도와 등고선지도 등 여러가지가 있다

그러나 각 지도마다 목적이 다르다

위성지도는 그 지형에 정확한 실제 모습을 담기 위한 목적의 지도

등고선 지도는 등고선을 표현하기 위한 목적의 지도

이처럼 목적에 맞지 않는 여러 부분을 제외하고 필요한 등고선만 나타낸 등고선 지도는 추상화가 이루어졌다 할 수 잇다

객체와 클래스의 관점에서 객체들은 실제 모습이다

클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다

다시 말하면, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라고 할 수 있다.

2) 캡슐화

클래스 입장에서 캡슐화를 알아보면

swift에서 접근 제어자 (public, private,…등)가 있다

private으로 정의된 속성은 외부에 노출 시키지 않고 자신의 클래스에서만 사용하기 위해 정의한다

즉, 이 속성은 외부에 알려줄 필요가 없다

정보은닉을 할 수 있다는 장점이 있다

예시를 들어 쉽게 캡슐화 설명

TV의 리모콘을 사용하는데 리모콘의 내부 회로(private으로 정의된 속성)을 알 필요가 있는가??

사용자 입장에서는 리모콘의 조작 기능, 즉 public으로 정의된 속성만 알면 된다.

또 다른 캡슐화의 의미는 포장의 개념이다

객체들의 여러 공통된 속성들은 하나의 클래스로 설계하는 추상화,

캡슐화는 이처럼 하나의 클래스로 포장하는 개념의 의미도 있다.


3) 상속

부모와 자식 관계를 맺는 클래스들이 존재

상위에 있는 클래스를 부모 클래스, 그 상위의 클래스를 상속받는 클래스가 자식 클래스

예를들어 탈것이라는 클래스가 있다고 생각하면

탈것에는 자동차, 이륜차, 자전거 등이 이에 해당한다

탈것에 해당하는 여러 속성들이 정의되어 있는데 자전거, 이륜차, 자동차는

이런 속성들을 가지고 있다

즉, 탈것이라는 클래스는 자전거, 이륜차, 자동차 클래스에 속성들을 물려준다

이것을 상속이라고 하고, 탈것과 자전거, 이륜차, 자동차 클래스는 상속관계에 있다고 한다

상속이 필요한 이유는 코드의 중복을 없애기 위함이다

코드의 중복이 많아지면 개발 단계에서도 피곤하기도 하고, 유지보수에 많은 비용이 들게 된다

그래서 개발을 할 때 코드의 중복은 반드시 피해야 한다.

OOP에서는 상속을 통해 코드의 중복 문제를 일부 해결할 수 있다

탈것 클래스에 여러 속성들을 정의해 놓고 탈것에 해당하는 자동차 클래스를 정의할 경우가 생기면

상속 관계를 맺어 자동차 클래스가 탈것의 클래스에 있는 여러 속성들을 그대로 물려받을 수 있다

탈것 클래스의 속성을 자동차 클래스에 정의하지 않아도 상속관계를 맺으면 자동으로

물려받기 때문에 또 다시 정의할 필요가 없다

이것이 상속이 필요한 이유이다


4) 다형성

  • 다형성은 형태가 같은데 다른 기능을 하는 것을 의마한다

예를들면, 고양이 클래스에는 “울음”이라는 속성이 정의되어 있다고 하자

사자는 고양이 과이기 때문에 사자 클래스는 고양이 클래스를 상속 받는다고 하면, 사자 클래스에도 “울음”이라는 속성이 자동으로 정의된다

이것을 상속이라 한다

그런데 고양이와 사자의 울음소리는 다르다

고양이는 “야옹~”, 사자는 “어흥”

같은 울음소리 속성임에도 실제 울음소리는 다르다

이것이 다형성이다

부모 클래스로부터 상속을 받은 속성에 대해, 자식 클래스에서 물려받은 속성을 재정의 할 수 있다

이것을 오버라이딩 이라고 한다

즉 사자 클래스는 고양이 클래스의 “울음” 속성을 상속 받았지만 사자 클래스에서 “울음” 속성을 오버라이딩 해서 사자 울음소리에 맞게 재정의해야 한다

OOP에서는 이러한 다형성을 허용한다

다형성을 사용하면 좋은 점은 같은 이름의 속성을 사용함으로써 사용하기 위한 인터페이스를 유지, 메서드 이름을 낭비하지 않는다

고양이와 사자의 울음소리를 호출하기 위해서는 각 객체에서 roar() 메서드를 호출하면 된다

roarCat(). roarLion()으로 정의할 필요가 없다는 것이다.

API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하다


정리

OOP

  • 객체들이 서로 유기적으로 동작하는 프로그래밍 이론

  • 코드의 재사용성과 중복제거가 가장 큰 목적

추상화

  • 목적과 관련이 없는 부분을 제외해서 필요한 부분을 포착하는 기법

  • 객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법

캡슐화

  • 외부에 노출될 필요가 없는 정보들은 숨기는 정보은닉

  • 객체의 공통된 속성들을 클래스로 정의하는 것

상속

  • 상속 관계에 있는 두 클래스에 대해, 부모 클래스가 자식 클래스레게 속성을 물려주는 것

  • 코드 재사용이 목적

다형성

  • 같은 형태이지만 다른 기능을 하는 것

  • 오버라이딩은 이와 관련된 기능


실습 코드

code github repo 로 이동