본문 바로가기
AI

객체지향 프로그래밍-Object Oriented Programming(OOP)

by Reodreamer 2022. 4. 27.
반응형

객체지향 프로그래밍이란....

"프로그램 설계 방법론이자 개념의 일종으로 프로그램을 단순히 데이터와 처리방법으로 나누는 것이 아니라, 프로그램을 수많은 객체(object)라는 단위로 나누고 이들의 상호작용으로 서술하는 방식의 프로그램 설계 방법론이자 개념의 일종을 의미한다.  

 

그럼 이제 객체지향 프로그래밍에 대해 본격적으로 알아보자.

 

객체지향 프로그램의 개념 

프로그램을 객체단위로 나누어 코드를 작성 및 수정한다.

객체간 특정 api로 연결 가능하며, 분업이 용이하다. 

 

객체지향 프로그램의 구성 요소와 설명 

Class 와 Object

클래스 안에는 객체가 있습니다. 각각의 클래스에는 하나의 객체만 존재하지는 않습니다. 하지만 각 객체의 데이터(attribute)는 달라도 method는 동일하다.

 

1. Class 선언

  1) 클래스 선언 시 예약어 -> 클래스 이름 -> 부모 클래스 의 순서로 선언

     class ClassName(object):

  2) 클래스 이름은 관습적으로 CamelCase*가 사용됩니다. 
      i) *클래스 이름에 들어가는 각각의 단어의 처음을 대문자로 시작

  3) 부모 클래스가 지정되지 않으면 object가 자동으로 상속됩니다. 

 

2. Class Attribute(클래스 속성)

  1) 클래스 전체가 공유하는 속성값

  2) 모든 객체(instance)가 같은 값을 참조 

  3) 남용 시 스파게티 코드*의 원인이 됨  *코드가 뒤죽박죽 

  4) Class.attribute 형태와 Instance.attribute 형태로 접근 가능 

 

3. Class Method(클래스 함수)

  1) 각 객체에 적용이 가능한 함수 

  2) 현재 수정하고자 하는 객체를 "self"로 지칭

      i) 이는 관습이며 C와 Java와 같은 다른 언어에서 "this"지칭 

      ii) 파이썬은 "self"를 첫번째 파라미터를 명시적으로 받음 

  3) Class.method(instance, args, ... )으로 혹은 instance를 파라미터로 받지 않고 Instance.method(args,...)으로 사용 가능

 

4. Instance Attribute (객체 속성)

  1) 각각의 객체가 개인적으로 가지는 값 

  2) Instance의 형태로 접근  

  3) Class 형태로 선언 되어 반환된 객체는 언제 어디서든 attribute 수정 가능 

 

5. Magic Method : method 이름이 "__METHOD__" 형태일 경우 

  1) Initializer (생성자) : __init__ 

      i) 객체를 생성할 때 호출 

      ii) 객체의 속성을 초기화 하는 사용
      iii) Class(args, ...) 형태로 호출하여 객체 생성 

      iv) 몇 안되는 Argument format이 없는 Magic Method 

  2) Destructor (소멸자): __del__

      i) 객체를 소멸할 때 호출 

      ii) 파이썬은 Garbage Collection으로 메모리 관리

         - 객체가 어디에도 참조되지 않을 때 객체가 소멸
           (del 예약어로 메모리를 정리할 수 있다고 생각했는데 그게 아니었다...)

         - 소멸 타이밍이 명확하지 않기 때문에 잘 사용되지 않음 

      iii) del 명령어 

         - 변수 이름을 명시적으로 삭제, 즉 참조하는것을 삭제하는것, 객체를 삭제하는 것이 아님 

파이썬의 3요소 구현방식 

1. 상속(Inheritance)
2. 다형성(Polymorphism)
3. 가시성, 캡술화(Visibilty & Encapsulation) 

1. 상속(Inheritance): 기존에 구현된 Class를 기반으로 새로운 Class 생성하는것을 의미

  1)기존의 Class: 부모 class, 새로운 class: 자식 class

  2) 자식 class에서는 부모의 기능을 이용가능 -> 같은 기능을 재작성할 필요가 없음 

      i) 부모 class의 method 사용가능

 

2. 다형성(Polymorphism) : 같은 이름의 메소드를 다르게 작성하는것을 의미

  1) 같은 이름의 메소드를 다르게 작성 

  2) 각각의 자식 class가 다른 class와 차별 

  3) 부모 method로 접근식 자식 method 실행 

  4) 외부에서는 동일한 API로 접근 

  5) 이전 단계의 객체에서는 코드 수정이 없음 

 

2.2 파이썬에서 상속과 다형성 

  1) 다중 상속 지원 -> 특정 class가 다수의 class를 동시에 상속가능 

      i) 죽음의 다이아몬드 문제 야기 

         - 자식클래스가 사용하려는 특정 method가 모든 직전 부모 class에 있을때 어떤 부모 class의 method를 쓸지
           애매해지는 문제

         - method 탐색순서를 따름 (mro)

  2) super 내장 함수를 이용하여 상위 class 접근 가능   

 

2.3 파이썬의 2가지 정적 함수 

  1) Instance.method 형태로도 접근 가능 

  2) 일반적으로 Class.method 형태로 사용 

      i) Static Method

         - staticmethod 꾸밈자 사용 

         - 특별한 argument를 받지 않음 

         - 일반적으로 class 안의 util 함수 사용 

         - class를 일종의 Namespace로 사용 

      ii) Class Method 

         - classmethod 꾸밈자 사용 

         - 호출된 class인 cls를 받음 (self 와 유사)

         - factory 패턴에서 사용 

     이 두가지의 method는 상속하면 차이가 발생함

       **static method는  상속받은 class의 attribute를 그대로 받아 쓰지만, class method는 cls로 받아와서 사용하기
          때문

 

3. 가시성, 캡술화(Visibilty & Encapsulation) 

  1) 가시성은 다른 클래스에게 객체의 내부를 숨기는 것을 의미

    i) 캡슐화, 정보 은닉

    ii) class 간 간섭 최소화

    iii) 최소한의 정보만을 지정된 API나 method로 공개 

    iv) C나 Java에선 private & protected로 구현 

  2) 파이썬에서의 가시성

    i) 명시적인 private & protected 범위 없이 모두 public 

    ii) Public 변수/ 함수 이름앞에 아무것도 붙이지 않음 

    iii) Protected 변수/ 함수 이름앞에 "_" 를 붙임 (언더스코어 1개) 

    iv) Private 변수/ 함수 이름앞에 "__" 를 붙임 (언더스코어 2개)

       ** 파이썬에서 protected나 privated 변수/함수 이름앞에 붙이는 밑줄은 가독성을 위한 관습일 뿐 특정 기능은 없음

 

Today I Felt

컴공과에선 객체지향 프로그래밍을 한학기 동안 배울 만큼 아주 중요한 부분이라고 한다. 그래서 단번에 이해하기 어렵겠지만 이번 기회를 통해서 대략적인 개념이라도 잡은거 같아 다행인 기분이다. 이제 다양한 구현 연습을 통해서 지식에 머무르지 않고 실력이 되게끔 노력해야겠다. 

 

반응형

'AI' 카테고리의 다른 글

[논문리뷰]Word2Vec  (0) 2022.09.05
[ML]회귀(Regression)  (0) 2022.05.20
[논문리뷰]StarGAN  (0) 2022.01.18
Data Augmentation  (0) 2022.01.13
Dense layer를 이용한 Fashion Mnist 예측모델 구현  (0) 2022.01.07

댓글