반응형

2020/05/10 - [python] - python - 상속

 

python - 상속

클래스에서 상속이란 ? - 부모 클래스의 내용을 받는 자식클래스가 받아서 사용하게 되는 것입니다. - 형태는 다음과 같습니다. class 부모클래스: 소스코드 class 자식클래스(부모클래스): 소스코��

lightchan.tistory.com

 

이전 포스팅 글에 의어서

 

상속 예제를 들어보겠습니다.

 

class Person:
    say = '안녕하세요 제 나이는 '
    nai = 20
    
    def __init__(self, nai):
        print('Persion 생성자')
        self.nai = nai
        
    def PrintInfo(self):
        print('이야기 :{} {}'.format(self.say, self.nai))
        
p = Person('22')
p.PrintInfo()


출력 결과

Persion 생성자
이야기 :안녕하세요 제 나이는  22

 

우선 Person 이라는 클래스를 생성하고, 생성자에 nai라는 변수를 주었습니다.

이후 p 객체를 생성하기 위에선 nai가 필요하기 때문에 나이를 22로 주었고 그에 따른 해당 출력 결과는

위와 같이 출력됩니다.

 

그럼 이제 자식 클래스를 만들어서 상속받아겠습니다.

 

class Student(Person):
    say = '공부하는 '
    subject = '학생'
    
    def __init__(self):
        print('Student 생성자생성')
        
    def PrintInfo(self):
        print('Student의 PrintInfo')    
                
    def EprintInfo(self):
        print(self.say, ' ' , super().say)
        super().PrintInfo() # super() 붙어서 처음부터 부모꺼
        self.PrintInfo() # 자기꺼 있으면 자기꺼 없으면 부모꺼
        
e = Student()
print(e.say, ' ' , e.nai, '살 ' , e.subject)
        
e.EprintInfo()  


출력 결과

Student 생성자생성
공부하는    20 살  학생
공부하는    안녕하세요 제 나이는 
이야기 :공부하는  20
Student의 PrintInfo

소스코드를 보시면

Student 클래스는 Person 부모클래스로부터 상속 받고있습니다.

 

그리고 Student 생성자를 생성하는 함수가 작성되어있습니다. 여기서 생성자가 작성되어있지 않다면 부모 클래스의 생성자를 따라가게 되어있습니다. 그렇다면 부모클래스의 생성자는 nai를 받기 떄문에 

 

Student 클래스에서 e 라는 변수로 객체를 생성할때 e = Student(나이값) 과 같이 나이 값을 넣어주어야 오류가 발생하지 않습니다.

 

 

EprintInfo() 함수에서 부모클래스의 say를 받아서 출력하는 것을 알 수 있습니다.

 

super() 여기서 super()는 부모클래스의 내용을 자식클래스에서 사용하고 싶은 경우 쓸 수 있습니다.

 

 

이번에는 다중 상속에 대해 알아보겠습니다.

 

다중 상속이란?

2개 이상의 클래스를 받아 사용하는 것을 뜻합니다.

 

우선 부모 클래스로 사용할 클래스 2개를 만들어보겠습니다.

 

class A:
    data = '파이썬'
    
    def Std(self):
        print('파이썬 공부')
        
    def Std1(self):
        print('파이썬 공부는 재밌다.')
        
        
class B:
    def Std(self):
        print('자바 공부')
        
    def dif(self):
        print('자바 공부는 어렵다')
        
    def kbs(self): 
        pass # 필수는 아니지만 다형성을 위해 강요 가능함

부모클래스 A와 B를 생성하였습니다.

 

이제 이 부모클래스를 호출할 자식 클래스를 만들어서 호출해보겠습니다.

 

class C(A, B):
    pass        

aa = C()

# 중복일 경우 먼저 상속한 값으로 가져옴 그래서 A.Std() 가져옴
aa.Std()
aa.Std1()
aa.dif()
print(aa.data)


출력 결과

파이썬 공부
파이썬 공부는 재밌다.
자바 공부는 어렵다
파이썬

자식클래스 C를 생성하였습니다.

부모 클래스 A에서 Std 함수가 존재하고 부모 클래스 B에도 Std 함수가 존재한다.

하지만 출력 결과를 보면 주석에도 언급하였듯, 먼저 상속받은 클래스의 함수를 출력 시키는 것을 알 수 있습니다.

 

이번에는 자식클래스 D를 만들어 C클래스와 반대로 해보겠습니다.

class D(B, A):
    data = '프로그래밍 천국'
    
    def Play(self):
        self.Std()
        super().Std()
        
    def dif(self):
        print('어려워도 열심히하려한다.')
        
bb = D()
# 중복일 경우 먼저 상속한 값으로 가져옴 그래서 B.Std() 가져옴
bb.Play()
bb.dif()


출력 결과

자바 공부
자바 공부
어려워도 열심히하려한다.

 

 

 먼저 호출한 부모클래스의 함수를 가져오는 것을 알 수 있습니다.

 

 

추상 클래스

추상 클래스란?

추상 클래스는 기본골격을 만들고 상속받는 클래스에서 그 구현을 강제로 시키는 클래스입니다.

형식을 다음과 같습니다.

 

from abc import *
class 추상클래스이름(metaclass=ABCMeta):

     @abstractmethod
        def 추상메소드(self):
            pass

 

바로 예제로 들어가도록 하겠습니다.

 

추상클래스 AbstractCalss

from abc import *

class AbstractClass(metaclass=ABCMeta):
    # ABCMeta 클래스의 서브 클래스는 추상 클래스
    
    @abstractclassmethod
    def abcMethod(self): # 추상 메소드
        pass
    
    
    def normalMethod(self):
        print('AbstractClass 클래스의 일반 메소드')
        

 

이 추상 클래스를 받아서 사용할 Child1 클래스

class Child1(AbstractClass):
    name = 'Child1입니다.'

    def abcMethod(self):
        print('추상메소드를 오버라이딩')

c1 = Child1()

print(c1.name)

c1.abcMethod()
c1.normalMethod()


출력 결과

Child1입니다.
추상메소드를 오버라이딩
AbstractClass 클래스의 일반 메소드

 

AbstractClass 추상클래스에서 abcMethod를 추상메소드로 주었고,

 

Child1 클래스에서 위 추상클래스를 받아서 사용 하도록 하였습니다.

 

위와 같이 작성하면 추상클래스의 미구현 메소드를 받아 사용하였기 때문에 아무런 문제가 없이 잘 출력됩니다.

 

이번에는 추상클래스를 좀 더 자세히 보기 위해 Child1 클래스에서 받았던 미구현 추상메소드를 지워보겠습니다.

 

class Child1(AbstractClass):
    name = 'Child1입니다.'

c1 = Child1()

print(c1.name)

c1.abcMethod()
c1.normalMethod()

 그럼 다음과 같은 오류 메세지를 출력합니다.

 

이러한 에러를 출력하는 이유는 임포트 과정에서 에러를 출력하진 않지만 추상클래스에서 미구현 메소드를 Child1 클래스에서 받지 않고 객체 생성을 하려했기 때문에 객체 생성 과정에서 오류가 발생하는 것입니다.

 

 

2020/05/10 - [python] - python - 상속

 

python - 상속

클래스에서 상속이란 ? - 부모 클래스의 내용을 받는 자식클래스가 받아서 사용하게 되는 것입니다. - 형태는 다음과 같습니다. class 부모클래스: 소스코드 class 자식클래스(부모클래스): 소스코��

lightchan.tistory.com

 

반응형

'python' 카테고리의 다른 글

python - 예외처리  (0) 2020.05.11
python - OS & pickle  (0) 2020.05.11
python - 상속  (0) 2020.05.10
python - 클래스  (0) 2020.05.10
python - 재귀함수  (0) 2020.05.10
반응형

클래스에서 상속이란 ?

 

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

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

 

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
반응형

상속이란 ?

 

자식 클래스는 부모 클래스에서 정의된 변수나 메소드를 자기 자신 것처럼 사용할 수 있다.

 

상속 형태

class 부모클래스명 {

        변수;

        메소드;

}

 

clasee 자식클래스명 extends 부모클래스명 {

        실행할 문장; 

}

 

오버라이딩

- 부모로부터 상속받은 메소드를 자식 클래스에서 자기 자신 클래스의 기능에 맞도록 재정의하는 기능

 

바로 예시로 들어가보겠습니다

동일 패키지에 존재한다는 가정하에 클래스 파일을 분리해서 만들었습니다.

 

부모클래스

GrandF.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class GrandF {
 
    public String name = "홍길동할아버지";
    protected String gahun = "열심히하자";
 
    public GrandF() {
        System.out.println("할아버지 생성자입니다");
    }
 
    public void say() {
        System.out.println("할아버지가 말씀하셨다.");
    }
 
}
 
 

3-4번 줄 : name과 gahun이라는 변수명과 변수 값을 정해줍니다.

6-7번 줄 : 생성자를 한번 더 복습해보았습니다.

10-11번 줄 : say라는 메소드를 생성해주었습니다.

 

자식클래스

gajok.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Fatherr extends GrandF {
 
    public String gabo = "지역변수"// 은닉화
 
    public Fatherr() {
        super(); // 부모 생성자 호출. 아규먼트에의해 선택적으로 호출
     
    }
 
    @Override
    public void say() {
        // TODO Auto-generated method stub
        System.out.println("자바 공부를 합시다");
    }
 
    public void showData() {
 
        String gabo = "멤버변수";
 
        System.out.println("gabo : " + gabo); // 멤버변수
        System.out.println("gabo : " + this.gabo); // 지역변수
        System.out.println("gabo : " + super.name);
 
    }
 
    public static void main(String[] args) {
        Fatherr fa1 = new Fatherr();
        fa1.say();
        fa1.showData();
 
    }
 
}
 
 

5번 줄 : GrandF 클래스를 gr이라는 새로운 객체로 생성해준다.

6번 줄 : super()는 부모 클래스의 생성자를 호출하기때문에 "할아버지 생성자"를 호출합니다.

10번 줄 : 기존  부모클래스에서 "할아버지가 말씀하셨다"를 호출해야하지만 자식클래스에서 상속을 받았기 때문에 "자바 공부를 합시다"가 출력됩니다.

16번 줄 : 변수별로 어떤 차이점을 가지는지 보여주기위해 작성하였습니다.

28번 줄 : 오버라이딩한 내용을 출력합니다.

 

 

 

반응형

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

8 - 생성자(Constructor)  (0) 2020.03.04
7 - 메소드  (0) 2020.03.04
6 - 클래스 ( class )  (0) 2020.03.03
5 - 배열(Arrary)  (0) 2020.03.03
4 - 조건문 if & switch  (0) 2020.03.03

+ Recent posts