AVA DAY 17-オブジェクト向けプログラミングII-1継承


継承
  • の既存のクラスを継承し、新しいクラスを作成します.
  • 子クラス名extends親クラス名{}
  • 親クラスの作成者と初期化ブロック以外のすべてのメンバーを継承します.
  • クラスのみが継承できます.
  • 継承されていないクラスはすべてObjectクラスを継承します.
  • 子クラスは、親クラスのメンバー以外の新しいメンバーを持つことができ、したがって、子クラスは親クラス以上である.
  • は、2つ以上のクラスを作成し、共通のメンバーがある場合は親を作成します.
  • public class SampleParent {
    	String var;
        
        	{
        		var = "초기화 블럭은 물려주지 않는다.";
        	}
        
        	SampleParent(){
        		var = "생성자도 물려주지 않는다.";
        	}
        
        	int method(int a, int b){
        		return a + b;
        	}
    }
    public class SampleChild extends SampleParent {
    	void childMethod(){
        		//상속받은 변수와 메서드를 사용할 수 있다.
            	System.out.println(var); //상속받은 변수
            	System.out.println(method(7, 13)); //상속받은 메서드
        	}
    }
    に火をつける
    継承メソッドの内容の再定義
    public class SampleChild extends SampleParent {
    	@Override
    	int method(int a, int b){ //리턴타입, 메서드명, 파라미터 모두 같아야 한다.
    		return a * b;
    	}
    }
    
    @Override
    宣言:クラス、変数、メソッドなどに表示
    ->メソッド名が間違っている場合は、エラーを通知します.
    super, super()
  • super:親メンバーと子メンバー名が重複している場合に両者を区別するために使用します.
  • public class SampleChild extends SampleParent {
    	int var;
        
        	void test(double var){
        		System.out.println(var); //지역변수
            	System.out.println(this.var); //인스턴스 변수
           		System.out.println(super.var); //부모클래스의 인스턴스 변수
            
            	System.out.println(this.method(10, 20));
            	System.out.println(super.method(10, 20));
        	}
    }
  • super():クラスのジェネレータを呼び出し、親クラスのインスタンス変数を初期化します.super()がない場合、コンパイラは自動的にsuper()を入れます.
  • public class SampleChild extends SampleParent {
    	super(); //부모클래스 생성자 호출
    }
    たけいせい
    子タイプのオブジェクトを親タイプの変数として使用するのは多形です.
    public class SampleChild extends SampleParent {
    	
        public static void main(String[] args) {
        	SampleChild sc = new SampleChild();
            SampleParent sp = new SampleChild();
            //SampleChild2
            //sp = new SampleChild2();
            //SampleChild3
            //sp = new SampleChild3();
            
            //부모와 자식간에는 서로 형변환이 가능하다.
            sc = (SampleChild)sp;
            sp = (SampleParent)sc; //sp = sc;
           	//자식타입 -> 부모타입 형변환은 생략할 수 있다.
            
            SampleChild sc2 = (SampleChild)new SampleParent();
            //SampleParent는 2개의 멤버를 가지고 있다.
    	//SampleChild는 5개의 멤버를 가지고 있다.
    	//SampleChild 타입의 변수는 5개의 멤버를 사용할 수 있어야 하는데
    	//SampleParent 객체는 2개의 멤버만 가지고 있다.
    	//그러므로 부모타입의 객체를 자식타입으로 형변환 하는것은 에러를 발생시킨다.
        
         	//SampleParent 타입의 변수로는
        	//SampleChild 객체를 가지고도 2개의 멤버만 사용할 수 있다.
        	sp = sc; //형변환 생략 가능
        	System.out.println(sp.var);
        	System.out.println(sp.method(10, 20));
        }
        
    }
    public class Store {
    
    	public static void main(String[] args) {
    		Desktop d1 = new Desktop("삼성 컴퓨터", 100000);
    		Desktop d2 = new Desktop("LG 컴퓨터", 100000);
    		
    		AirCon ac1 = new AirCon("삼성 에어컨", 200000);
    		AirCon ac2 = new AirCon("LG 에어컨", 200000);
    		
    		TV tv1 = new TV("삼성 TV", 300000);
    		TV tv2 = new TV("LG TV", 300000);
    		
    		Customer c = new Customer();
    		
    		System.out.println(d1.getInfo());
    		System.out.println(d2.getInfo());
    		c.buy(d1);
    		
    		System.out.println(ac1.getInfo());
    		System.out.println(ac2.getInfo());
    		c.buy(ac2);
    		
    		System.out.println(tv1.getInfo());
    		System.out.println(tv2.getInfo());
    		c.buy(tv2);
    		
    		c.showItem();
    	}
    
    }
    
    class Product{
    	
    	String name;	//이름
    	int price;	//가격
    	
    	Product(String name, int price){
    		this.name = name;
    		this.price = price;
    	}
    	
    	//상품의 정보를 반환하는 메서드
    	String getInfo(){
    		return name + "(" + price + "원)";
    	}
    	
    }
    
    class Desktop extends Product{
    	Desktop(String name, int price){
    		super(name, price);
    	}
    	
    	void programming(){
    		System.out.println("프로그램을 만듭니다.");
    	}
    }
    
    class AirCon extends Product{
    	AirCon(String name, int price){
    		super(name, price);
    	}
    	
    	void setTemperature(){
    		System.out.println("온도를 설정합니다.");
    	}
    }
    
    class TV extends Product{
    	TV(String name, int price){
    		super(name, price);
    	}
    	
    	void setChannel(){
    		System.out.println("채널을 변경합니다.");
    	}
    }
    
    class Customer{
    	int money = 10000000;
    	
    	Product[] item = new Product[100];
    	
    	void buy(Product p){ //다형성
    		if(money < p.price){
    			System.out.println("잔돈이 부족합니다.");
    			return;
    		}
    		
    		money -= p.price;
    		
    		for(int i = 0; i < item.length; i++){
    			if(item[i] == null){
    				item[i] = p;
    				break;
    			}
    		}
    		System.out.println(p.getInfo() + "를 구매했습니다.");
    	}
    	
    	void showItem(){
    		System.out.println("=============== 장바구니 ===============");
    		for(int i = 0; i < item.length; i++){
    			if(item[i] == null){
    				break;
    			}else{
    				System.out.println(item[i].getInfo());
    			}
    		}
    		System.out.println("========================================");
    	}
    }