본문 바로가기

(Before)BitSchool

2014/5/9 java 객체지향, class, static

반응형
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* 객체지향의 3요소
 * 1. 캡슐화 : 클래스를 디자인하는것--> 타입디자인
 * 2. 상속 : 클래스 사이에서의 관계
 * 3. 다형성 : 부모자식관계에서 혹은 클래스간의 관계에서의 행동
 */
 
// class 식별자
public class Person {  // 객체를 정의하기위한 구조
    // 속성(데이터)  --> 필드, 멤버변수, 속성값
    // private 멤버는 자기 자신(자기클래스)에서만 접근 가능 한것
    private int age;  // 나이
    private String name; //이름
    private int weight;  //체중
    
    // 행동(메서드)  --> 다양한메서드, 멤버함수, 프로시져(리턴이없는 함수)
    // public은 어디서든 누구나 접근 가능한것
    
    //생성자
    public Person() {  
        age=1;
        name="홍길동";
        weight=3;
    }
    // 싱글톤패턴 : 생성자가 private
    
    // 메서드 오버로딩
    public Person(int a, String n, int w){
        age = a;
        name = n;
        weight = w;
    }
    
    public void bab(){
        weight++;
    }
    
    public void jam(){
        age++;
    }
    
    public void Show(){
        System.out.println(age);
        System.out.println(name);
        System.out.println(weight);
    }
    
    public int getAge(){
        return age;
    }
    public String getName(){
        return name;
    }
    
    
    /*class 디자인패턴
    1. 필드는 private으로 설정 한다.
    2. 메소드는 일반적으로 public으로 설정한다. 단, 무조건은 아니다.
    
    문제점
    1. 필드가 private이면 필드값을 어떻게 초기화 시키냐?
    ----> 생성자를 이용한다. 
    -->생성자 : 객체가 생성이 될때 자동으로 호출되어지는 메소드
    -->객체의 필드 초기화의 역할을 수행
      
      * 생성자의 특징
      * 1) class와 이름이 동일하다.
      * 2) return이 없다. 프로시져.
      * 3) 오버로딩(다중정의) : 같은 이름의 메서드가 여러개 존재할 수 있는것.
          메서드 오버로딩(다중정의) : 같은 이름의 메서드가 매개변수의 차이와 갯수, 순서에 따라 서로 다르게 인식되는것
      * 4) 일부로 만들지 않아도 자동으로 생성된다. 하지만 매개변수가 있는 생성자를 만들면 자동으로 디폴트 생성자를
           만들어 주지 않는다.  
    
    2. 필드가 private이면 어떻게 접근하나?
        public한 메서드를 통해서 접근가능하게 한다. (getter/setter --> 프로퍼티)
        
        *프로퍼티 사용이유
        1. 접근권한에 대한 제어를 프로그래머가 직접할 수 있다.
        2. setter의 경우 예외처리를 가능하게 한다.
    
    */
}
 

* main메서드에 static이 붙는이유 

- new를 써서 객체를 생성해 메모리에 올려야하지만 new를 쓰지 않고 메모리에 올리려면 static을 써야한다. 그렇기 때문에 main메서드에 static을 붙여줘야 하며 main안에서 호출하는 메서드는 모두 static이여야 한다.

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
35
36
37
38
39
40
// 스타 크래프트 마린 클래스 추상화
public class CMarin {
    //속성
    private int hp; //체력 -  인스턴스 필드  - 개인적으로 쓸때 사용
    public static int att;  // 공격력 - 정적필드 - 공용으로 쓸때 사용
     public static int range;  // 사거리 - 정적필드 
    // static은 따로 static영역에 생긴다. 프로그램이 시작할때 올라라고 끝날때 내려온다.
 
     public static void Attplus(){   // 스태틱으로 쓰면 객체생성없이 클래스이름으로 사용이 가능하다.
         att++;
     }
     
    //생성자
    public CMarin() {
        // TODO Auto-generated constructor stub
        hp=30;
        att=5;
        range=7;
    }
    
    
    
    //행동
    public void Move(){
        System.out.println("gogogo!!!");
    }
    public void Attack(){
        System.out.println("dududududu!!!");
    }
    public void Die(){
        System.out.println("Ah~~~");
    }
    public void getHealing(){
        hp++;
    }
    public int gethp(){
        return hp;
    }
}
 



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
 
public class CMedic {
    private int hp;  // 체력
    private int mana;  // 치료력
    
    
    public CMedic(){
        hp=40;
        mana=40;
    }
    
    public void healing(CMarin marin){
        while(true){
            System.out.println(marin.gethp());
            System.out.println(mana);
            
            if(mana==0 || marin.gethp()==40)
                break;
            else
                marin.getHealing();
            
            mana--;
        }
    }
    
}
 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
public class CEnginering {
    private int pos_x;
    private int pos_y;
    
    public void AttUp(){
        CMarin.Attplus();
    }
    
    public void DefUp(){
        
    }
}
 


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
 
public class Base {
 
    public static void main(String[] args) {
    /*    
        //객체의 배열 --> 마린객체가 5개 모여있는 배열
        CMarin[] theMarin = new CMarin[12];
    
        //theMarin.Attack();
        
        for(int i=0;i<12;i++){
            theMarin[i] = new CMarin();
            theMarin[i].Attack();
        }
        */
        
        CMarin theMarin = new CMarin();
        CMedic medic = new CMedic();
        
        medic.healing(theMarin);
        // 마린과 메딕은 healing이라는 메시지를 주고 받는 상황이다.
        
        CMarin.Attplus();
        
        CEnginering eng = new CEnginering();
        
        eng.AttUp();
    }
}
 



반응형