반응형

클래스에서 상속이란 ?

 

- 부모 클래스의 내용을 받는 자식클래스가 받아서 사용하게 되는 것입니다.

- 형태는 다음과 같습니다.

 

class 부모클래스:
	소스코드
    
class 자식클래스(부모클래스):
	소스코드

 

class Animal: # 부모클래스
    def __init__(self):
        print('animal 생성자')
        
    def move(self):
        print('움직이는 동물')
        
class Dog(Animal):  # 자식클래스
    def __init__(self): # 해당 클래스의 생성자가 없으면 부모 생성자를 부르고 생성자가 있으면 자신을 호출한다.
        print('Dog 생성자')
    
    def my(self):
        print('나는 개')

dog1 = Dog()

dog1.my()
dog1.move()


출력 결과

Dog 생성자
나는 개
움직이는 동물

 

부모클래스 Aninal의 '움직이는 동물'을 자식클래스 Dog가 가져다가 사용하여 위와 같은 출력 결과를 가지고 온 것을 알 수 있습니다.

 

여기서 부모클래스의 생성자를 가지고 오지 않는 이유는 주석에도 알 수 있듯이, 자식클래스에서 생성자가 있기 때문입니다.

 

 

오버라이딩 

 

-  부모 클래스의 메소드를 자식 클래스에서 재정의 하는 것입니다.

 

다형성

 

- 부모 클래스로부터 물려받은 내용을 자식 클래스 내에서 오버라이딩하여 사용하는 것입니다.

 

class Parent: # overriding
    def Prindata(self):
        pass
    
class Child1(Parent):
    def Prindata(self):
        print('Child1에서 overrding')
            
            
class Child2(Parent):
    def Prindata(self):
        print('Child2에서 재정의')
        
    def abc(self):
        print('Child2 고유 메소드')
        
c1 = Child1()
c1.Prindata()

c2 = Child2()
c2.Prindata()   


출력 결과


Child1에서 overrding
Child2에서 재정의

 

부모클래스인 Child1 에서 Printdata 메소드는 'child1에서 overrding'을 출력해준다.

하지만 오버라이딩 성질을 이용하면 Child2에서 Printdata 메소드의 출력문인 'Child2에서 재정의' 를 출력해줍니다.

 

 

2020/05/10 - [python] - python - 상속 (2)

 

python - 상속 (2)

이전 포스팅 글에 의어서 상속 예제를 들어보겠습니다. class Person: say = '안녕하세요 제 나이는 ' nai = 20 def __init__(self, nai): print('Persion 생성자') self.nai = nai def PrintInfo(self): print('..

lightchan.tistory.com

 

반응형

'python' 카테고리의 다른 글

python - OS & pickle  (0) 2020.05.11
python - 상속 (2)  (0) 2020.05.10
python - 클래스  (0) 2020.05.10
python - 재귀함수  (0) 2020.05.10
python - 함수 장식자 ( Decorator )  (0) 2020.05.10
반응형

클래스란 ?

 

- 객체의 구조를 나타낸다.

- 클래스에 의해 만들어진 객체를 인스턴스라고도 부른다.

 

 

객체와 인스턴스의 차이

- 객체는 클래스 정의시 메소드 밖에 존재하며, 클래스명.변수명 으로 사용한다. 

- 인스턴스는 메소드 안에서 사용하며, self.변수명으로 사용한다.

 

# 모듈의 멤버로 클래스

class TestClass:
    kk = 1 # 멤버변수 ( 전역 )
    
    def __init__(self):
        print('생성자')
        
    def __del__(self):
        print('소멸자')
        
    def printMsg(self): # 메소드 (public)
        name = '한국인' # 지역변수
        print(name)
        print(self.kk)
        
test = TestClass() # 생성자 호출. instance
print(test.kk) # 1을 출력
print(TestClass.kk) # prototype(원형) 클래스의 멤버 직접 호출
 
print()

test.printMsg() # Bound Method call
# TestClass.printMsg() # 이렇게 주면 아규먼트를 주지 않아서 ERR
print()
TestClass.printMsg(test) # UnBound Method call


출력 결과

생성자
1
1

한국인
1

한국인
1

소멸자

 

# Bound Method Call는 self가 붙은 쪽에 사용하고, UnBound Method Call 이란 self 를 안 붙은 쪽을 말합니다.

 

파이썬에서 사용하는 특별한 메소드

 

# __init__ : 

- 초기화(initialize) 메서드라고도 합니다.

- 어떤 클래스의 객체가 만들어질 때 자동으로 호출되어서 그 객체가 갖게 될 여러 가지 성질을 정해주는 역할을 함

- 위 소스에서는 TestClass() 를 작성하여 TestClass 객체를 생성하자마자 초기화가 되고 '생성자'를 출력하였습니다.

 

# __del__ :

- 객체가 없어질때 사용하는 메소드입니다.

- 위 소스에서는 그래서 맨 마지막에 '소멸자'가 출력되었습니다.

 

 

 

이번에는 __init__ 메소드에 인자를 받아야만 생성자가 생성되는 예제를 들어보겠습니다.

 

class Car:
    handle = 0
    speed = 0

    def __init__(self, name, speed):
        self.speed = speed
        self.name = name
        
    def showData(self):
        km = '킬로미터'
        msg = '속도:' + str(self.speed) + km
        return msg
    
print(Car.handle)
print(Car.speed)
#print(Car.name) # type object 'Car' has no attribute 'name'
print()
car1 = Car('tom',10)
print(car1.handle, car1.name, car1.speed)
print('------')
car2 = Car('james',20)
print(car2.handle, car2.name, car2.speed)

print()
print(car1.showData())
print(car2.showData())
car1.speed = 88
car2.speed = 100
print(car1.showData())
print(car2.showData())

Car.handle = 1
print(car1.handle)
print(car2.handle)


출력 결과

0
0

0 tom 10
------
0 james 20

속도:10킬로미터
속도:20킬로미터
속도:88킬로미터
속도:100킬로미터
1
1

 

위 소스코드는 __init__ 생성자에 self, name, speed 를 주었기 때문에 새로운 객체를 생성할때 name,과 speed를 가지고 가야 생성이 가능합니다. 그렇지 않으면 다음과 같은 에러를 출력합니다.

 

 

car1 객체와 car2 객체를 생성 한 후에는 speed 값을 기존 10에서 각각 88과 100으로 변경해주었습니다.

그 출력 결과 속도들의 변경된 점을 확인 가능했습니다.

 

# 클래스는 포함자원의 재활용 목적으로 다른 클래스를 불러다가 사용 가능합니다.

 

handle.py

 

# 다른 클래스에서 공유할 클래스

class PohamHandle:
    quantity = 0
    
    def LeftTurn(self, quantity): # self에 quantity 가 들어옴
        self.quantity = quantity
        
        return '좌로 돌아';
    
    def RightTurn(self, quantity): # self에 quantity 가 들어옴
        self.quantity = quantity
        
        return '우로 돌아';

 

PohanCar.py

 

import etc.handle

class PohanCar:
    turnShow = '정지'
    
    def __init__(self, ownerName):
        self.ownerName = ownerName
        self.handle = etc.handle.PohamHandle()
        
        
    def TurnHandle(self, q):
        if q > 0:
            self.turnShow = self.handle.RightTurn(q)
        elif q < 0:
            self.turnShow = self.handle.LeftTurn(q)
        else:
            self.turnShow = '직진'
            
if __name__ == '__main__':
    tom = PohanCar('tom')
    tom.TurnHandle(10)
    print(tom.ownerName + ' 의 회전량은 ' + tom.turnShow + str(tom.handle.quantity))            
    
    print()
    james = PohanCar('james')
    james.TurnHandle(0)
    print(james.ownerName + ' 의 회전량은 ' + james.turnShow + str(james.handle.quantity))

 

출력 결과

 

반응형

'python' 카테고리의 다른 글

python - 상속 (2)  (0) 2020.05.10
python - 상속  (0) 2020.05.10
python - 재귀함수  (0) 2020.05.10
python - 함수 장식자 ( Decorator )  (0) 2020.05.10
python - 파이썬은 1급 함수인가 ?  (0) 2020.05.08
반응형

Module 이란 ?

함수나 변수 또는 클래스를 모아 놓은 파일

모듈은 이미 만들어져있는 것을 사용할 수도 있고 사용자가 직접 만들어서도 사용이 가능합니다.

 

파이썬에서 기본적으로 제공하는 함수들을 다 작성 할 순 없어서 아래 링크를 참조하면 확인 가능합니다.

 

https://docs.python.org/ko/3.7/library/index.html

 

파이썬 표준 라이브러리 — Python 3.7.7 문서

파이썬 표준 라이브러리 파이썬 언어 레퍼런스 는 파이썬 언어의 정확한 문법과 의미를 설명하고 있지만, 이 라이브러리 레퍼런스 설명서는 파이썬과 함께 배포되는 표준 라이브러리를 설명합�

docs.python.org

 

Module의 사용 목적 ?

코드의 재사용을 가능하게 하며, 하나의 이름 공간으로 별도 관리가 가능하다.

 

Module의 사용 위치

 package 내에서 작성해야 한다.

 

Module import 방법

 

방법 1)

import 불러올모듈A

불러올모듈A 전체를 가져온다.

이 방식을 이용하는 경우 '불러올모듈A.메소드' 처럼 모듈명을 적고 사용하여야한다.

 

방법 2)

from 불러올모듈B import 메소드 or 변수

불러올모듈B 내에 있는 특정 메소드 또는 모듈에 정의된 변수를 가져온다.

방법 1과 다르게 불러온 메소드 또는 변수 앞에 모듈명을 적지 않고 사용 가능하다.

 

 

 

 

Ex 1)

# import math

# math의 모듈 함수 : fabs(절대값), ceil(올림), floor(버림), exp(지수함수), log(로그), sqrt(루트), sin(사인함수),

# asin(사인 역함수), cos(코사인), acos(코사인역함수), tan(탄젠트), degrees(라디안을 각도로), radians(각도를 라디안)

# math의 모듈 상수 : pi, e

 

import math
print(math.ceil(1.2), math.ceil(1.6)) # 정수 근사치 중 큰 수
print(math.floor(1.2), math.floor(1.6)) # 정수 근사치 중 작은 수
print()

 

출력 결과

 

 

이번에는 사용자 모듈을 생성하고 불러와서 사용해보겠습니다.

 

mymod1.py

gvar = 123
def ListHap(*ar):
    print(ar)
    
def kbs():
    print('채널9')
    
def mbc():
    print('문화방송')

mymod2.py

def Hap(a, b):
    return a + b

def Cha(a, b):
    return a - b


 

불러오기 위한 사용자 모듈 2개를 생성하였습니다. 이번에는 불러올 최상위 모듈에서 호출해보겠습니다.

방법 1.

import pack1.mymod1
list1 = [1,2]
list2 = [3,4,5]
pack1.mymod1.ListHap(list1, list2)

pack1.mymod1.kbs()

 

출력 결과

 

방법 2.

from pack1 import mymod1
mymod1.kbs()

 

방법 3.

from pack1.mymod1 import kbs, mbc, gvar
kbs()
mbc()
print(gvar)

 

방법 4.

from etc.mymod2 import *
print(Hap(5, 3))
print(Cha(5, 3))

해당 방법은 etc 패키지 안에 있는 mymod.py 에 있는 것들을 전부 import 하겠다는 의미입니다.

 

 

if __name__ == '__main__': 

 

불러올 모듈에서 함수뿐 아니라 내용까지 전부 실행할 경우 __name__ 변수에 __main__이 저장되어 전부 실행된다.

하지만 다른 모듈에서 불러와서 사용할 경우 __name__ 변수에 불러올 모듈명 저장된다.

 

main.py

# 여러 모듈 중 응용프로그램의 시작 모듈을 명시적으로 표시하기
# 이곳은 모듈을 불러온 파이썬 모듈
if __name__ == '__main__':
    print('여기가 최상위 모듈')
    
pack1.mymod1.kbs()

from pack1 import mymod1
mymod1.kbs()

mymod1.py

gvar = 123
def ListHap(*ar):
    print(ar)
    # 최상위 모듈이 아니라 출력되지 않음
    if __name__ == '__main__':
        print('최상위메인모듈')
    
def kbs():
    print('채널9')
    
def mbc():
    print('문화방송')

mymod1.py의 파일에 if __name__ == '__main__' 부분을 추가하였습니다.

 

여기서 위 mymod1.py 에서 직접 실행하면 __name__ 이 참이 되면서 mymod1.py 에서의 print 문이 출력됩니다.

 

하지만 main.py 에서  부를 경우 mymod1.py 의 if문이 거짓이 되면서 print문이 출력되지 않습니다.

 

해당 이유는 위에 작성하였습니다.

 

 

 

 

클래스를 포함한 모듈 

 

class TestClass:
    kk = 1 # 멤버변수 ( 전역 )
    
    def __init__(self):
        print('생성자')
        
    def __del__(self):
        print('소멸자')
        
    def printMsg(self): # 메소드 (public)
        name = '한국인' # 지역변수
        print(name)
        print(self.kk)
        
test = TestClass() # 생성자 호출. instance
print(test.kk) # 1을 출력
print(TestClass.kk) # prototype(원형) 클래스의 멤버 직접 호출
 
print()

test.printMsg() # Bound Method call
# TestClass.printMsg() # 이렇게 주면 아규먼트를 주지 않아서 ERR
print()
TestClass.printMsg(test) # UnBound Method call

 

__init__과 self에 대해서는 다음에 추가 설명 작성 또는 포스팅을 하도록 하겠습니다.

 

위에 작성한 클래스들을 호출한 출력 결과

 

반응형

'python' 카테고리의 다른 글

python - 가변인수  (0) 2020.05.08
python - range  (0) 2020.05.08
python - 함수  (0) 2020.05.07
python - 반복문 (for)  (0) 2020.05.07
python - 반복문 (while)  (0) 2020.05.07
반응형

클래스

자바에서 생성되는 프로그램의 최소 단위

 

클래스를 만드는 주된 이유

- 나만의 타입 코드를 클래스를 생성하기 위해서

 

 

클래스 형식

class 클래스명 {

     변수 정의;

     메소드 정의;

 

}

 

클래스 형식 예시

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Bank {
    
    // 클래스에서의 변수 지정
    String name;
    int num;
    int addmoney;
    
    // 메소드 지정
    void addMoney() {
        System.out.println("돈을 넣었습니다.");
    }
    
    void minusMoney() {
        System.out.println("돈을 뺏습니다.");
    }
 
 
}
 
 

객체 생성

Car mycar1; // Car 클래스 타입인 mycar1 레퍼런스 변수를 선언

mycar1 = new Car(); // new 연산자를 사용해서 메모리상에 mycar1 객체를 생성

그림으로는 다음과 같이 표현이 가능합니다

 

 

 

 

객체를 생성하고 객체의 변수와 메소드 사용하는 예시를 들어보겠습니다.

 

변수와 메소드를 정의해준 클래스

Car.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Car { // 접근지정자 class 클래스명(대문자로 시작하고 source명과 동일해야함)
    // 멤버 필드(전역변수) : 속성(특성, 구성 요소)
 
    
    int speed; 
    public String irum; 
    
    //메소드 정의
    void speedUp() {
        speed++;
    }
    
    void speedDown() {
        speed--;
    }
 
}
 
 

객체를 생성하고 위에 만든 Car.java를 사용해보겠습니다.

MyCar.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MyCar { 
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Car myCar = new Car();
        
        //변수 사용
        myCar.speed = 60;
        myCar.irum = "홍길동";
        
        //메소드사용
        System.out.println("차주인은 : "+myCar.irum + " 현재 속도는 : " +myCar.speed);
        myCar.speedUp();
        System.out.println("speedUp하였습니다. 현재 속도는 : " + myCar.speed);
        
        myCar.speedDown();
        System.out.println("speedDown하였습니다. 현재 속도는 : " + myCar.speed);
        
    }
 
}
 
 

 

6번째 줄 - Car 클래스를 새로운 객체 myCar로 생성합니다.

9-10번째 줄 - Car 클래스에 정의되어있는 변수를 사용합니다.

13-18번째 줄 - Car 클래스에 정의되어있는 메소드를 불러와서 사용합니다.

 

출력 결과

1
2
3
4
차주인은 : 홍길동 현재 속도는 : 60
speedUp하였습니다. 현재 속도는 : 61
speedDown하였습니다. 현재 속도는 : 60
 

 

이번에는 변수의 종류에 대해서 알아보도록 하겠습니다.

 

default 현재 패키지 내에서 호출 가능
private 캡슐화 - 현재 클래스 내에서만 홏출 가능
public 현재 프로젝트 내에서 호출 가능

 

 

 

 

 

반응형

'JAVA > JAVA' 카테고리의 다른 글

8 - 생성자(Constructor)  (0) 2020.03.04
7 - 메소드  (0) 2020.03.04
5 - 배열(Arrary)  (0) 2020.03.03
4 - 조건문 if & switch  (0) 2020.03.03
3 - 반복문 for & while  (0) 2020.03.03

+ Recent posts