JAVA DAY17 - 객체지향 프로그래밍 Ⅱ - 1 상속

어뮤즈온·2020년 12월 7일
0

초급자바

목록 보기
24/31
post-custom-banner

상속

  • 기존의 클래스를 물려받아 새로운 클래스를 만드는 것이다.
  • 자식클래스명 extends 부모클래스명{}
  • 부모클래스의 생성자와 초기화블럭을 제외한 모든 멤버를 물려받는다.
  • 하나의 클래스만 상속받을 수 있다.
  • 상속받지 않은 모든 클래스는 Object 클래스를 상속받는다.
  • 자식클래스는 부모클래스의 멤버 외의 새로운 멤버를 가질 수 있으므로 자식클래스는 부모클래스보다 크거나 같다.
  • 두개 이상의 클래스를 만드는데 공통된 멤버가 있는 경우 부모클래스로 만든다.
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("========================================");
	}
}
profile
Hello, world!
post-custom-banner

0개의 댓글