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
'(Before)BitSchool' 카테고리의 다른 글
2014/5/15 데이터베이스 - 오라클 (0) | 2014.05.15 |
---|---|
2014/5/14 데이터베이스 - Oracle (0) | 2014.05.14 |
2014/05/13 Java - Abstract추상클래스, interface 인터페이스, final, 예외처리, try, catch, throws (0) | 2014.05.13 |
2014/5/9 java 객체지향, class, static (0) | 2014.05.09 |
Java 로또기계 (0) | 2014.05.08 |