반응형

클래스란 ?

 

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

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

 

 

객체와 인스턴스의 차이

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

- 인스턴스는 메소드 안에서 사용하며, 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
반응형

클래스

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

 

클래스를 만드는 주된 이유

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

 

 

클래스 형식

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