본문 바로가기

(Before)BitSchool

2014/5/12 Java - this,상속, 다형성

반응형

각 클래스의 필드는 객체 생성시 각각 소유하고 메서드는 마치 static필드와 같이 하나만 만들어진다.

 그렇다면 하나의 클래스로 두개의 객체를 이용해서 메서드를 사용한다면 무엇으로 구분 지을까?

그것이 바로 this이다.


this

this - 메소드가 속하는 객체의 참조 값을 나타내는 예약어.  메서드 내에서만 사용 가능.

메서드에는 보이지않는 매개변수 this가 존재한다. 컴파일이 자동생성 해주는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
 
public class Memo {
    public static void main(String[] args) {
        Mama m1 = new Mama();
        Mama m2 = new Mama();
        
        m1.Attack();
        System.out.println(m1);
        m2.Attack();
        System.out.println(m2);
    }
}
 

1
2
3
4
5
6
7
8
9
public class Mama {
    private int hp;
 
    public void Attack() {
        hp = 40;
        System.out.println(this);
    }
}
 




결과값


결과 값을 보면 알수 있듯이 각각 m1, m2객체의 참조를 한다.


그렇다면 static메서드와 그냥 메서드는 둘다 똑같이 하나만 생성되는데 무엇이 틀릴까?


static메서드는 객체정보가 필요없어 this가 안넘어온다. 그리고 static필드만 사용 할 수 있다.

즉, m1.Attack();과 Mama.Attack();으로 class이름으로도 사용 가능하다.  



상속

상속 : 상위클래스의 멤버필드와 메서드를 하위 클래스가 계승. 확장성. java는 단일상속이다.

상속의 장점 : 기존코드의 재사용, 가독성높임, 상위클래스 자체 및 변수와 메서드의 재사용


is - a 관계 : 

학생은 is a 사람

학생은 사람이다.  --> 상속 (속성)

고양이는 동물이다. --> 상속

상속 --> is - a 관계가 성립이 된 경우 상속



has - a 관계(포함관계) 

사람이 핸드폰을 가지고 있다.  --> has - a관계


1. is-a 관계만 상속하자---> 가장 확실한 방법

2. has-a 관계로 포함관계로 구현하자.

3. 인터페이스 상속을 적극 활용하자.  --> 행동 구현(메서드 구현)


예)

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
package inheritance;
 
public class Unit {   // 부모클래스,상위클래스, 기반클래스,base Class,superClass,Classic Class라고 부른다.
    protected int hp;  // protected : 자기 자신 클래스와 자식클래스
    protected int att;
    protected int def;
    protected int price;
    protected int UnitCount;
    protected int Range;
    
public void Create(){  // 행동
        
    }
    public void Die(){
        
    }
    public void Stop(){
        
    }
    public void Hold(){
        
    }
    public void Patroll(){
        
    }
    public int getHp() {
        return hp;
    }
    public void setHp(int hp) {
        this.hp = hp;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    
    
}
 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package inheritance;
 
public class Marin extends Unit{ // 자식클래스,하위클래스,파생클래스 라고 부른다.
    //Marin의 특징적인 것들만 추가적으로 구현
    
    public void Att(){
        
    }
    public void Healing(){
        
    }
    
    public void Show(){
        System.out.println(hp);
    }
    
    public void Steampack(){
        
    }
    
}
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package inheritance;
 
public class SCV extends Unit{
    private int getM;
    private int getG;
    
    public void Repair(){
        
    }
    public void Work(){
        
    }
    public void Show(){
        System.out.println(this.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
package inheritance;
 
public class Base {
    public static void main(String[] args) {
        Marin m1 = new Marin();
        Marin m2 = new Marin();
        
        m1.setHp(20);
        m2.setHp(40);
        
        m1.setPrice(20);
        m2.setPrice(40);
        
        System.out.print("m1 hp : ");
        m1.Show();
        System.out.print("m2 hp : ");
        m2.Show();
        
        SCV s = new SCV();
        System.out.print("SCV hp : ");
        s.setHp(50);
        s.Show();
    }
}
 


결과값 :

m1 hp : 20

m2 hp : 40

SCV hp : 50


각 객체에 공통적으로 쓰이는 속성인 필드는 static으로 쓰고, 각 객체에 각각 가지는 값은 this를 이용하여 구분하여 나타낼 수 있다.


다형성

다형성 : 메시지에 따라서 다양한 형태의 행동을 취하는 것


예)

사원관리 프로그램

사원들을 저장할 자료구조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package polymorphsm;
//사원클래스
public class Emp {
    private int empno;  // 사원번호
    
    public Emp(int no) {
        // TODO Auto-generated constructor stub
        this.empno = no;
    }
    
    //override:재정의
    // 부모의 행동을 그대로 상속받을 수도 있지만 부모의 행동을 자식에서 다르게
    // 행동할 경우 부모의 메서드와 동일한 메서드를 자식에서 새롭게 정의한다.
    public void work(){
        System.out.println("G_emp.work()");
    }
    
    public void getSalary(){
        System.out.println("Emp.getSalary()");
    }
}
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package polymorphsm;
 
public class G_emp extends Emp{
    private int salary;  //연봉
    private int grade;  // 직급
    
    public G_emp(int no) {
        // TODO Auto-generated constructor stub
        super(no);
        salary = 1000;
    }
    
    public void work(){
        System.out.println("G_emp.work()");
    }
    
    public void getSalary(){
        System.out.println(salary/12);
    }
}
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package polymorphsm;
//알바 사원 클래스
public class PartEmp extends Emp{
    private int TimePay;
    private int WorkTime;
    
    public void work(){
        System.out.println("ParkEmp.work()");
    }
    public PartEmp(int no){
        super(no);
        this.TimePay = 5000;
        this.WorkTime = 30;
    }
    
    public void getSalary(){
        System.out.println(TimePay*WorkTime);
    }
}
 

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
package polymorphsm;
 
public class Base {
    public static void main(String[] args) {
        //일반사원을 저장하기 위한 배열
        G_emp[] g_emp_list = new G_emp[10];
        
        //알바 사원을 저장할 배열
        PartEmp[] PartEmpList = new PartEmp[10];
    
        //부모클래스의 배열을 통해서 자식 객체들을 저장한다.
        Emp[] EmpList = new Emp[20];
        
        Emp emp1 = new G_emp(1);  //G_emp객체가 생성이지만 Emp라고 부른다.
        Emp emp2 = new PartEmp(2);//PartEmp객체가 생성이지만 Emp라고 부른다.
        
        
        EmpList[0] = new G_emp(1);
        EmpList[1] = new PartEmp(2);
        // 부모의 객체로 자식객체를 참조할수 있다.(가리킬수 있다.) 모든 oop의 개념이다.
        
        for(int i=0;i<20;i++){
            if(i%2==0){
                EmpList[i] = new G_emp(i);
            }else{
                EmpList[i] = new PartEmp(i);
            }
        }
        
        for(int i=0;i<20;i++){
            EmpList[i].getSalary();
        }
    }
}    
 

출력값 : 

83

150000

83

150000

83

150000

83

150000

83

150000

83

150000

83

150000

83

150000

83

150000

83

150000



반응형