IT/Java & JSP & FW

java :: OOP-3, 상속, 다형성, pakage(패키지)

엑수시아 2011. 12. 19. 12:42
상속
상속이란?
코드의 재활용을 보다 체계적으로 하기 위한 하나의 방법으로 나온 개념.
(부모의 재산을 물려받는 것을 의미)

상속의 장점
1. 개발시간을 단축
2. 코드의 재활용

상속관계(... is a 관계가 성립해야한다.)
extends를 통해 상속받는다.
자바는 단일 상속 개념

상속형식

Class 자식클래스 extends 부모클래스{

내용 기술;


상속예제-1
(Itest.java)
class Super{
	int a=10;
	double b=20.0;
	
	public void fun(){
		System.out.println("fun메소드호출됨~");
	}
}

class Sub extends Super{  //super 클래스  상속
	int a=100;  
	//부모랑 중첩되는 변수들을 "중첩변수"라고 부른다. 중첩될 경우 자기자신의 변소를 먼저 사용한다.
	int c=30;
	
	public void sub(){  //대소문자가 다르므로 생성자 아님
		System.out.println("sub메소드호출됨~");
	}
	
	public void fun(){  //오버라이딩
		System.out.println("재정의한 fun()메소드가 호출됨");
		System.out.println("c="+c);
	}
}

public class ITest {
	public static void main(String[] args) {
		
		//부모객체 생성
		System.out.println("--Super객체--");
		Super sp=new Super();
		System.out.println("sp.a="+sp.a);
		System.out.println("sp.b="+sp.b);
		sp.fun();
		
		//자식객체생성
		System.out.println("--sub객체--");
		Sub sb=new Sub();
		System.out.println("sb.a="+sb.a);
		System.out.println("sb.b="+sb.b);
		System.out.println("sb.c="+sb.c);
		sb.sub();
		sb.fun();
		
		System.out.println("부모의 이름으로 자식 객체생성하기");
		Super s1=new Sub(); 
		System.out.println("s1.a="+s1.a);  //a값은 10을 호출함
		System.out.println("s1.b="+s1.b);  //
		//System.out.println("s1.c="+s1.c);  <-에러 Sub이라는 객체는 생성하지만 변수나 메소드는 사용할 수 없다.
		s1.fun();  //자식의 fun메소드를 호출하면서 위 줄에서 부르지 못한 c값까지 불러오는 것을 볼 수 있다.
		
		Sub s2=(Sub)s1;  //다운캐스팅 부모클래스에 있었던 s1을 자식클래스에 있는 s2로 옮김
		System.out.println("s2.c="+s2.c);
		s2.sub();
		
		Super arr[]=new Super[3];  //Super 배열을 만듬, 안에 공간만 만들어진 상태
		arr[0]=new Super();
		arr[1]=new Sub();
		arr[2]=new Super();
		//이렇게 하면 arr 공간 안에 Super클래스(부모), Sub클래스(자식) 모든 클래스를 관리할 수 있게 된다.
		
		for(int i=1;i<arr.length;i++){
			arr[i].fun();
		}
	}
}

상속예제-2
부모클래스
(BaseCar.java)
//부모클래스
public class BaseCar {

	String name;
	int maxspeed;
	
	public BaseCar(){
		//인자를 가진 생성자를 만들면 의무적으로 기본생성자를 만들어준다.
	}
	
	public BaseCar(String name, int speed){  
		//인자생성자를 하나라도 만들어주면 jvm에서 생성자를 만들어 주지 않는다.
		// 즉 기본 생성자가 없기 때문에 CarTest의 BaseCar c1=new BaseCar(); 구문 실행시 에러가 난다.
		this.name=name;
		maxspeed=speed;
	}
	
	public void getInfo(){
		System.out.println("이름:"+name);
		System.out.println("최고속도:"+maxspeed);
	}
}
자식클래스
(Gadian.java)
//BaseCar 클래스를 상속받는 자식 클래스
public class Gadian extends BaseCar {  //extends BaseCar를 적어 상속받을 클래스를 적는다.
	
	String item;
	
	public Gadian(String name, int speed, String item){
		//super()  이라는 자동으로 키워드를 호출하게 된다. <-부모의 생성자를 호출함
		super(name,speed);  // 직접 처리 방법
		this.name=name;
		maxspeed=speed;
		this.item=item;
	}
	
	public void getInfo(){  //다형성 OverRiding
		//System.out.println("이름은:"+name);
		//System.out.println("최고속도:"+maxspeed);
		super.getInfo();  //자기자신을 가르킬땐 this, 부모와 자식간에 부모를 가르킬땐 super를 사용
		System.out.println("아이템:"+item);
	}
	
	public void getInfo(String title){
		System.out.println(title);
		this.getInfo();  //위의 getInfo 메소드를 부르고 위의 getInfo메소드는 부모클래스의 getInfo를 호출
	}
}
자식클래스2
(BlackS.java)
public class BlackS extends BaseCar{
	
	String skill;
	
	public BlackS(String name,int speed, String skill){
		this.name=name;
		maxspeed=speed;
		this.skill=skill;
	}
	
	public void getInfo(){
		super.getInfo();
		System.out.println(skill);
	}
	
	public void getInfo(String title){
		System.out.println(title);
		this.getInfo();
	}
}
출력부분
(CarTest.java)
public class CarTest {
	public static void main(String[] args) {
		
		BaseCar c1=new BaseCar();
		c1.name="연습카트";
		c1.maxspeed=160;
		c1.getInfo();
		
		System.out.println("========================");
		
		Gadian c2=new Gadian("가디언",200,"황금아이템");  //BaseCar 클래스에서 Gadian이 상속받아 자기것 처럼 사용 함
		c2.getInfo();
		
		System.out.println("========================");
		
		c2.getInfo("슈퍼카아~!~~");
		
		System.out.println("========================");
		
		BlackS c3=new BlackS("블랙샤크",210,"물폭탄피하기");
		c3.getInfo();
		
		System.out.println("========================");
		
		c3.getInfo("블랙샤크!!");
	}
}

상속예제-3
(KakaTest.java)
class Kaka{
	public void kakaOpen(){
		System.out.println("과자를 뜯어 먹습니다.");
	}
}

class Prin extends Kaka{
	public void kakaOpen(){
		System.out.println("프링글스의 뚜껑을 열어먹습니다.");
	}
}

class Banana extends Kaka{
	public void kakaOpen(){
		System.out.println("바나나킥의 봉지를 뜯어먹습니다.");
	}
}

class Sea extends Kaka{
	public void kakaOpen(){
		System.out.println("고래밥의 상자를 뜯어 먹습니다.");
	}
}

public class KakaTest {
	public static void main(String[] args) {
		
		//일일이 접근해서 사용해서 출력하는 방법
		Banana ba=new Banana();
		ba.kakaOpen();
		Prin pr=new Prin();
		pr.kakaOpen();
		Sea s=new Sea();
		s.kakaOpen();
		
		System.out.println("=========================");
		
		//부모의 이름으로 가져와서 출력하는 방법
		Kaka ka[]=new Kaka[3];  //까까 클래스를 상속받은 자녀클래스를 담을 수 있는 공간 3개를 만든다
		ka[0]=ba;
		ka[1]=pr;
		ka[2]=s;
		
		for(int i=0;i<ka.length;i++){
			ka[i].kakaOpen();
		}
	}
}

다형성(OverRiding part)
OverRiding 이란?
부모클래스로부터 사용해 온 메소드를 더 이상 상속 받지 않고 자식클래스에서 새롭게 정의해서 메소드를 사용하도록 하는 것.