본문 바로가기
etc.

[Java/Python] 문법 비교 정리 #9 Class

by Lee David 2022. 11. 12.
반응형

Java에서의 Class

// 실행 클래스
class Playground {
    public static void main(String[ ] args) {
        Sample sample = new Sample();
        
        System.out.println(sample.a); // 1
        sample.setA(5);
        System.out.println(sample.a); // 15
        sample.setAA(19);
        System.out.println(sample.a); // 285
    }
}

// 부모 클래스 선언
class TestClass {
    public TestClass() {}

    int a = 1;
    public void setA(int param) {
        this.a = param;
    }
}

// 부모 클래스 상속
class Sample extends TestClass {
    // 부모 메서드를 오버라이드 함
    @Override
    public void setA(int param) {
        a = param + 10;
    }
    
    // 자식 class에서만 호출 가능한 메서드
    public void setAA(int param) {
        a *= param;
    }
}

java에서의 부모 class를 상속 받을 시에 한개의 부모 클래스만 상속 받을 수 있습니다.

상속시에는 부모 클래스가 포함하는 메서드 및 변수 등을 자식 class에서 사용 가능합니다.

하지만 extends를 사용하여 class를 상속 받을시에는 부모에서 사용하는 메서드를 override하지 않아도 됩니다.

java에서 만약 여러개의 상속이 필요하다면 interface가 필요합니다.

class Playground {
    public static void main(String[ ] args) {
        Sample sample = new Sample();
        
        System.out.println(sample.a); // 10

        sample.setA(5);
        System.out.println(sample.a); // 15

        sample.setB(5);
        System.out.println(sample.b); // 5
    }
}

// interface 선언 1
interface TestClass1 {
	public void setA(int param);
}

// interface 선언 2
interface TestClass2 {
	public void setB(int param);
}

// // interface 다중 상속
class Sample implements TestClass1, TestClass2 {
    int a = 0;
    int b = 0;
    public Sample() {
        a = 10;
        b = 10;
    }

    @Override
    public void setA(int param) {
        a = param + 10;
    }

    @Override
    public void setB(int param) {
        a = param - 10;
    }
}

interface의 경우 class와 다르게 상속 받는 대상이 interface의 메서드 override를 강제하게 됩니다.

메서드의 형태는 유지해야 하지만 interface에서 강제하는 메서드의 내용은 자식 class에서 오버라이딩 하게 됩니다.


Python에서의 Class

# class 선언
class TestClass:

    def __init__(self):
        self.a = self.f()
    
    # class 스코프 내 변수 선언
    a = 1
        
    # class 스코프 내 함수 선언
    def f(self):
        # class 변수 내부에서 class 스코프 변수 사용
        return self.a + 10
    
# class 생성자 불러오기
t = TestClass()
print(t.a) # 11
# class 함수 변수에 담기
fFunction = t.f
print(fFunction()) # 21

python에서는 class를 선언하게 되면 해당 class의 끝부분까지를 scope라고 명명하고 개념을 이해해야 합니다.

class 내부에서 선언된 변수들 혹은 함수들은 내부에서 사용할때에 self 키워드를 붙여주어야 하며 참조시에도 self.변수 형식으로 사용해야 class 내에서 사용되는 변수/함수 임을 확인하고 사용됩니다.

 

class의 생성자는 def __init__(self [,....])과 같은 형태로 self 키워드가 강제 되어야 합니다.

# class 다중 상속
class Inheritance(Super1, Super2...):

python 에서는 class를 다중상속시에 interface처럼 다른 구조의 클래스가 필요하지 않습니다.

만약 부모의 상속값을 사용할때에는 왼쪽 class부터 시작해서 인자의 상속 정보를 탐색하게 됩니다.

예시) Super1.a 없음 -> Super2.a


출처:

https://docs.python.org/ko/3/tutorial/classes.html

반응형