빅데이터 프로그래밍/Python

[Python] 10. Class 선언, 클래스 멤버, 메소드, 인스턴스 멤버, 메소드의 실습, 생성자, 소멸자, 모듈 분리

밍글링글링 2017. 8. 2.
728x90

01. 클래스(Class: 반, 학급, 그룹)

- 데이터 표현 방법의 변화

.OOP 이전 시대: 문자 숫자 기반의 단순한 데이터 처리

예) String 성명, String, 기술력, String 프로젝트, int 경력, String  자격증, int salary, int tax

C언어의 구조체는 데이터를 묶어서 처리 지원

.OOP 이후 시대: 의미 있는 데이터의 집합, 개발자가 새로운 데이터 타입을 생성하는 구조

예) 개발자(String 성명, String 기술력, String 프로젝트, int 경력, String 자격증)

노트북{String brand, float cpu, int hdd, float lcd, boolean wifi, boolean bluetooth} 
리조트{String 객실, Date 입실, Date 퇴실, Option 바베큐, Option 요트}
영화{String 제목, int 년도, String  장르, int 상영 시간, String 국가...}   
배우{....

 

- 데이터 처리 방법의 변화

전통적인 프로그램은 순차식으로 구현되어 간결한 문법과 이해가 쉬웠습니다. 예) GW-BASIC...하지만 코드 라인수가 100라인만 지나가도 이해하기 어려워, 소스 변경이 매우 힘들었습니다.
순차 처리보다 발전된 프로그래밍 모델이 있는데 그것은 함수 기반 언어인 C언어가 대표적입니다. 예) Fortran, C, COBOL, Pascal...C언어는 함수기반언어로 반복되는 코드를 그룹화해서 실행할 수 있었으나 같은 메모리의 데이터가 여러 함수들에 의해서 접근되어 로직의 구분이 명확하지 않게되어 대규모 프로젝트를 진행하는데 어려움이 많았습니다. 메모리 에러를 잡기 어려운 문제 발생.메모리 관련 코드의 분석이 어렵습니다.
이를 개선한 OOP 모델은 각각의 기능과 데이터를 클래스라고 하는 독립적인 코드 파일로 나누어, 서로간의 간섭을 줄이고, 마치 레고블럭처럼 SW를 개발하는 모델을 말합니다.SW를 포함하여 이미 대부분의 산업이 레고처럼 블럭 구조기반으로 변경되고 있습니다.예) Python, C++, Win32 API, MFC, JAVA, .NET...

예) 타이어 23560R17: 한국 타이어 HL3, 금호 크루젠 프리미엄, 넥센 RU50.....


1) 객체 지향 원리를 구현하지 않은 경우, 캡슐화 미지원, 필드 처리 로직 중복 발생2) 객체 지향 원리를 구현한 경우, 캡슐화 지원, 필드 처리 로직 한번만 발생되어 개밞 및 유지보수 효율성 향상됨.- 실행 메세지 전송: OOP에서 다른 객체의 메소드로 데이터를 전달하거나 메소드를 실행하는 일, 비 OOP언어의 경우는 호출이라고 합니다.1. 클래스 멤버; 클래스명으로 사용되는 변수, 모든 객체들이 공유함- 변수 선언시 초기값을 선언해야합니다.[실행 화면]

년도: 2017
제품: SSD256
가격: 80000
할인율: 3.5
서비스: True
▷ Class1.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class Class1:
    year = 0
    product = ''
    price = 0
    dc = 0
    service = False

if __name__ == '__main__':
    Class1.year = 2017
    Class1.product = 'SSD256'
    Class1.price = 80000
    Class1.dc = 3.5
    Class1.service = True
    
    print('년도: ' + str(Class1.year))
    print('제품: ' + Class1.product)
    print('가격: ' + str(Class1.price))
    print('할인율: ' + str(Class1.dc))
    print('서비스: ' + str(Class1.service))
      

-------------------------------------------------------------------------------------
 

 

2. 인스턴스 멤버: 객체를 생성하면 사용가능한 변수로 객체생성시 마다 새롭게 할당됨

- self: 클래스의 객체

 

[실행 화면]

1. <class '__main__.Class2'>
2. <class '__main__.Class2'>
년도: 2017
제품: SSD512
가격: 150000
할인율: 3.5
▷ Class2.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class Class2:
    def setData(self):
        print('2. ' + str(type(self)))

    def setData2(self, year):
        self.year = year  # instance 변수의 선언, Field, Property
        self.product = '';
        self.price = 0
        self.dc = 0

if __name__ == '__main__':
    class2  = Class2()  # 객체 생성
    print('1. ' + str(type(class2)))
    
    class2.setData()
    
    class2.setData2(2017)
    class2.product = 'SSD512'
    class2.price = 150000
    class2.dc = 3.5
    
    print('년도: ' + str(class2.year))
    print('제품: ' + class2.product)
    print('가격: ' + str(class2.price))
    print('할인율: ' + str(class2.dc))
    
    # print('년도: ' + str(Class2.year)) # ERROR 클래스 변수방법 에러
    
    


------------------------------------------------------------------------------------
 

 

3. 메소드

- 데이터를 전달 받은 메소드는 println('')를 이용하여 처리 결과를 출력 할 수 있지만, 처리된 값을 다양한 형태로 이용하기 위하여 메소드를 호출한 곳으로 처리된 값을 리턴 할 수도 있으며, 자주 이용됩니다.

- 지역변수: 메소드 안에서만 사용가능한 변수

 

[실행 화면]

한국
일본
중국
 
28738
37539
6747
-------- 비권장---------
KOREA
Seoul
--------------------------
▷ Class3.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class Class3:
    def getNation(self, code):
        str1 = "미결정"  # 지역 변수
        if code == "KOR":
            str1 = "한국"
        elif code == "JAP":
            str1 = "일본"
        elif code == "CHA":
            str1 = "중국"
        
        return str1

    def getGDP(self, code):
        gdp = 1000   # 지역 변수
        if code == "KOR":
            gdp = 28738
        elif code == "JAP":
            gdp = 37539
        elif code == "CHA":
            gdp = 6747
        
        return gdp
            
# print(Class3.getNation("KOR")) # 메소드임으로 ERROR

class3 = Class3(); # 객체 생성
# print(class3.str1)  # 메소드 지역변수임으로 객체명으로 사용 불가능
# print(class3.gdp)
# print('--------------------------')
print(class3.getNation("KOR"))
print(class3.getNation("JAP"))
print(class3.getNation("CHA"))
print()
print(class3.getGDP("KOR"))
print(class3.getGDP("JAP"))
print(class3.getGDP("CHA"))

print('-------- 비권장---------')
class3.nation = "KOREA" # 필요시 동적으로 instance 변수 추가, Field
class3.city = 'Seoul'
print(class3.nation)
print(class3.city)
print('--------------------------')

  
-------------------------------------------------------------------------------------

 

 

 

4. 생성자, 소멸자

- 생성되는 객체의 인스턴스 변수를 초기화하는 역활을하며 자동으로 호출되며 생략가능합니다.
- 소멸자는 객체가 메모리해서 소멸할 때 자동으로 호출되며 생략가능합니다.

 


[실행 화면]


객체가 메모리에 생성되었습니다.
count: 0
한국
일본
중국
count: 3
 
28738
37539
6747
count: 6
객체가 메모리에서 소멸되었습니다.
▷ Class4.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class Class4:
    def __init__(self):
        self.count = 0
        print('객체가 메모리에 생성되었습니다.')
            
    def __del__(self):
        print('객체가 메모리에서 소멸되었습니다.')    
        
    def getNation(self, code):
        self.count = self.count + 1
        str1 = ""  # 지역 변수
        if code == "KOR":
            str1 = "한국"
        elif code == "JAP":
            str1 = "일본"
        elif code == "CHA":
            str1 = "중국"
        
        return str1

    def getGDP(self, code):
        self.count = self.count + 1
        gdp = 0   # 지역 변수
        if code == "KOR":
            gdp = 28738
        elif code == "JAP":
            gdp = 37539
        elif code == "CHA":
            gdp = 6747
        
        return gdp
            
class4 = Class4();
print('count: ' + str(class4.count))
print(class4.getNation("KOR"))
print(class4.getNation("JAP"))
print(class4.getNation("CHA"))
print('count: ' + str(class4.count))
print()
print(class4.getGDP("KOR"))
print(class4.getGDP("JAP"))
print(class4.getGDP("CHA"))
print('count: ' + str(class4.count))
            
del class4  # 소멸자 호출

-------------------------------------------------------------------------------------
 
 

 

5. Class의 import
- 'oop1' 패키지를 추가하고 클래스를 생성합니다.

[실행 화면]
Class5Use에서 class5 객체 생성

객체가 메모리에 생성되었습니다.
한국
일본
중국
 
28738
37539
6747
객체가 메모리에서 소멸되었습니다.
▷ /src/oop1/Class5.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class GDP:
    def __init__(self):
        self.count = 0
        print('객체가 메모리에 생성되었습니다.')
            
    def __del__(self):
        print('객체가 메모리에서 소멸되었습니다.')    
        
    def getNation(self, code):
        self.count = self.count + 1
        str1 = ""  # 지역 변수
        if code == "KOR":
            str1 = "한국"
        elif code == "JAP":
            str1 = "일본"
        elif code == "CHA":
            str1 = "중국"
        
        return str1

    def getGDP(self, code):
        self.count = self.count + 1
        gdp = 0   # 지역 변수
        if code == "KOR":
            gdp = 28738
        elif code == "JAP":
            gdp = 37539
        elif code == "CHA":
            gdp = 6747
        
        return gdp
             
            
-------------------------------------------------------------------------------------
 
▷ Class5Use.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

# import Class5 # ERRO, 패키지 누락
import oop1.Class5  # 패키지명.파일명

print('Class5Use에서 class5 객체 생성')
# obj = Class5.GDP(); # ERROR, 패키지 누락
obj = oop1.Class5.GDP(); # 객체 생성시 패키지 명시
print(obj.getNation("KOR"))
print(obj.getNation("JAP"))
print(obj.getNation("CHA"))
print()
print(obj.getGDP("KOR"))
print(obj.getGDP("JAP"))
print(obj.getGDP("CHA"))
              
              
             
-------------------------------------------------------------------------------------
 

728x90

댓글