OOP란 무엇인가?

0

코틀린

목록 보기
7/11

OOP

  • 객체 : 명사로 끝나는 모든것들. 대상을 나타내는 단어.
  • 객체(상태와 행위를 갖는다)
  • 클래스 : 객체들이 갖는 공통적인 속성들을 모아서 정의 내린것.
  • 보편적인 특징을 뽑아내는 것이 모델링(클래스에 어떤 요소가 들어갈것인지)
  • 언어에서 객체지향 3요소를 지원하지 않으면 객체지향언어라고 하지 않는다.

객체지향 3요소 : 상속, 캡슐화, 다양성


객체의 예시

ex) 마커 : 행위 : 쓰다. 받아쓰다.
ex)농구 : 행위 : 패스하다. 슛을쏘다. 드리블을 하다. 리바운드를 하다.
: 상태 : 점수 , 공격권, 공!!
농구라는 객체에서 행위를 통해서 공이라는 상태가 변한다. —→ 캡슐화
잘 만들어진 객체는 행위와 상태를 나눌수 있어야한다.
모든 객체는 복제 가능, 비교 가능, 일회성을 가져야한다(메모리에서 독자적인 위치 값을 가져야한다.)


코틀린 단어 변경

  • 객체 : 농구 : Class
  • 행위 : 패스,슛,드리블하다 : Method , fun ( Int타입으로 1,2,3점을 나누는 느낌)
  • 점수 : Private var (변하기때문에, 캡슐화(초기화 0점부터 시작)를해야하기때문에) 타입추론 : Int로 될것.

이런식으로 객체가 어떤 행위와 상태를 가질것인지 예상하고 뜯어내는 작업을 모델링, ADT, 추상화작업 라고 한다.

만들어진 객체는 캡슐화가 이루어져야 한다.

행위를 통해서 상태를 제어하는것.

농구라는 객체를 완성하기 위해 여러개의 행위, 상태가 얽혀있다.

농구라는 객체는 플레이어라는 객체,심판,타임 이라는 여러가지 객체랑 얽혀있다. Accesion

이런 얽혀있는 상태를 "has a" 라고 한다.


OOP의 특징

추상화

  • 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현한 개념
예를들면 가방은 여러가지 종류가 있을수 있다.
백팩 - 양어깨에 끈을 매고 비교적 큰 물건을 담는 가방
메신저백 - 등이나 허리에 밀착되는 가방
클러치 - 끈이 없는 가방으로 간단한 물건들을 수납하는 가방

이를 객체와 클래스의 관점에서 살펴보면
객체들은 실제 그 모습이지만, 클래스는 객체들의 공통된 특징들이 있어야 한다고 정의하는 추상적인 개념이다.

상속

재산을 상속받는다. 엄마 아빠 유전정보를 받는다?
우리가 일상에서 쓰는 상속과 같은 의미를 지닌다.

공통된 특성을 물려받는 의미이다.

예를 들면 호랑이 클래스, 고양이 클래스, 사자 클래스, 강아지 클래스가 있다고 하자.
호랑이와 고양이는 위로 거슬러 올라가면 같은 동물에서 뿌리가 시작된다.
또한 호랑이,고양이,사자,강아지 클래스는 모두 공통적으로 포유류에 해당된다.
암컷의 뱃속에서 태아가 자라며 특정 기간동안 품고 있어야 하며 숨을 쉴 수 있고 
머리,몸통,다리등으로 구분이 되어있다. 이 외에 여러가지 포유류의 속성들을 상속 받고 있습니다.

OOP에서 상속을 사용하는 이유는 코드의 중복을 없애기 위함입니다.

만약 올림픽에 대한 코드를 작성할 때 축구,농구,배구,야구의 클래스를 상속없이 따로 작성할 수 있지만, 공으로 하는 운동이라는 큰 클래스로 묶어서 시작을 하게된다면 많은 부분에서 코드 절약을 할 수 있을 것입니다.


캡슐화

말 그대로 캡슐처럼 만드는 행위를 일컫는다.

접근 제어자편을 보면 어떤 속성은 외부에 노출시키고 어떤 속성은 클래스 외부로 노출시키지 않을 수 있다.

즉, 불필요한 정보를 감출 수 있다는 특징이 있다.


다양성

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

예를 들면
호랑이는 고양이 과이므로 고양이 클래스를 상속 받는다고 하자.
호랑이와 고양이는 둘다 "울음"이라는 속성이 존재한다.
하지만, 고양이는 "야옹", 호랑이는 "어흥"이라고 다른 울음소리를 가지고 있는데 이것을 다형성이라고 한다.

호랑이는 부모 클래스인 고양이에서 "울음"이라는 속성을 상속받는다.
즉, "울음"을 오버라이딩해서 호랑이에 맞게 재정의 한다.

이런 다형성의 장점은 무엇일까?

같은 이름의 속성을 유지함으로서 속성을 사용하기 위한 인터페이스를 유지하고 메서드 이름을 낭비하지 않는다.
roar()라는 메서드가 존재한다면 roarCat(),roarTiger()으로 각각을 정의할 필요가 없다.


profile
러닝커브를 따라서 등반중입니다.

0개의 댓글