상속/오버라이딩/super/super()/다형성

조수경·2021년 9월 29일
0

JAVA

목록 보기
15/26

* 상속

  - 기존의 클래스를 물려받아 새로운 클래스를 만드는 것이다.
  - 작성방법: class 자식클래스명 extends 부모클래스명{} 
  - 부모 클래스의 생성자와 초가화블럭을 제외한 모든 멤버를 물려받는다.
  - 하나의 클래스만 상속받을 수 있다. --부모가 여럿일수 없고 하나임
  - 상속받지 않는 모든 클래스는 기본적으로 object 클래스를 상속받는다.
  - 자식 클래스는 부모 클래스의 멤버 외의 새로운 멤버를 가질 수 있으므로 
  자식 클래스는 부모 클래스보다 크거나 같다. --자식 클래스가 내용이 더 많음
  - 두개 이상의 클래스를 만드는데 공통된 멤버가 있는 경우 부모클래스로 만든다. --중복을 없앨수 있기때문에 사용
  - 똑같은 내용을 한곳으로 빼서 클래스를 만듬 그것을 상속받아 사용하면 내것이 되는것


 package g_oop2;

 public class SampleParent {

//변수
String var;//var1

//초기화 블럭
{
	var = "초기화 블럭은 물려주지 않는다.";
}

// 부모 생성자 - 변수를 초기화 하기 위해 존재하여 다른 클래스에 물려줄 필요가 없다.
SampleParent(){ 
	var = "생성자도 물려주지 않는다.";
}

//메서드
int method(int x, int y){
	return x=y;
   }
}

오버라이딩: 상속받은 메서드의 내용이 마음에 안들어서 다른 내용으로 바꿀때 메서드를 다시 만드는 것
super: [this:인스턴스와 지역변수 이름이 같을때 사용,this()]
부모클래스의 변수와 메서드가 자식 클래스의 변수와 메서드의 이름이 똑같을 때 구분하는 것
super(): 생성자안에서 부모클래스를 호출할때 사용
다형성: 변수가 다양한 형태를 가진다는 의미로 객체의 타입과 변수의 타입이 서로 다른것

package g_oop2;

public class SampleChild extends SampleParent { //extends 확장

void childMethod(){
	System.out.println(var); //상속받은 변수
	System.out.println(method(7,13)); //상속받은 메서드
}

//오버라이딩: 상속받은 메서드의 내용을 재정의 하는 것 , 
상속받아 자식클래스로 와보니까 변경이 필요해서 내용을 바꿔줌
@Override //어노테이션(골벵이로 시작하는것): 클래스, 변수, 메서드 등에 표시에 놓은 것 ,
이 메서드는 이런 기능이 있어~ + 오버라이딩이 클릴경우 컴파일에러를 내줌
int method(int x, int y){//똑같이 선언해서 메서드를 만들어줌(리턴타입 메서드이름 파라미터 이름 모두가 같아야함, 내용만 바뀌는것!)
	return x * y;
}

//super,super()
int var; //var2

//이름이 같을 경우에 this로 구분해 주는 것
void test(double var){//var3 : 2과 3을 비교할땐 this를 사용했음
	System.out.println(var);//지역변수(메서드안에서만 사용되는 변수)
	System.out.println(this.var);//인스턴스 변수=전역변수(클래스전체에서 사용되는 변수)
	System.out.println(super.var);//부모 클래스의 인스턴스 변수
	//super: 부모 클래스의 멤버와 자식 클래스의 멤버가 이름이 중복될때 둘을 구분하기 위해 사용 (멤버: 변수+메서드 모두)
	System.out.println(this.method(10, 20));// 상속받아 오버라이딩한 메서드
	System.out.println(super.method(10, 20));//부모클래스한테 상속받은 메서드
}

SampleChild(){//자식클래스의 생성자에는 super가 반드시 들어가야함(자동으로 들어감)
	super(); //자식클래스의 생성자에서 부모클래스의 생성자를 호출할때 사용한다.
	//super()를 통해 클래스의 생성자를 호출하고 부모클래스의 인스턴스 변수도 초기화한다.
	//super()가 없으면 컴파일러가 자동으로 super()를 넣어준다.
}

//다형성 : 부모타입 변수에 자식 타입 객체를 사용하는것
private static void main(String[] args) {
	SampleChild sc = new SampleChild();
	SampleParent sp = new SampleChild();//변수의 타입이 다를 수도 있다.
    : 형변환이 숨겨져 잇는 것 (둘이 상속관계에 있다는 전제 하에 가능하다)
	//SampleChild에 아무리 많은 값이 들어가 있어도 SampleParent에 있는 값만 사용가능
	//SampleChild2 //상속된계라 1,2,3을 넣을 수 있게 된다.
	//SampleChild3
	
	//SampleParent: 2개개 멤버 사용가능
	//SampleChild: 2개(기본적으로 부모에게 생속받은것) + 4 = 6 개 멤버 사용가능
     sc = (SampleChild)sp;
     //형변환이 들어가 있지 않은것(큰 값이 작은값으로 형변환 생략 불가능)
     / (SampleChild)를 붙혀 형변환 해줌
     //6개를 사용해야하는데 2개밖에 사용못함
     sp = sc;//형변환이 생략되어 들어가 있고
     //2개를 사용하는데 6개중에 사용하면 되서 가능
  
	
    }
 }
 
 package g_oop2;

출력

public class Store {

public static void main(String[] args) {
	
	Desktop d = new Desktop();
	AirCon ac = new AirCon();
	TV tv = new TV();
		
		Customer c = new Customer();
			
			c.buy(d);//고객이 d를 사는 메서드
			c.buy(ac);
			c.buy(tv);
	
	//가게에 있는 물건을 클래스로 만들것
	//부모클래스: 이름, 가격
	//구매할 소비자의 클래스 만들기

}

}

//부모 클래스 만들기(물건들이 공통으로 가지게 될것)
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(){//생성자를 만들어서 직접 초기화 하기(부모 생성자에 파라미터가 있기 때문에)
		super("삼성 컴퓨터", 1000000);	
		
	}
	//메서드도 따로 만들어쥼
	void programming(){
		System.out.println("프로그램을 만듭니다.");
	}
}


//상속받을 에어컨 만들기
class AirCon extends Product{
	//생성자 만들어서 부모클래스 생성하기
	AirCon(){
		super("LG 에어컨",2000000);
	}
	
	void setTemperature(){
		System.out.println("온도를 설정합니다.");
	}
}


//상속받을 티비 만들기
class TV extends Product{
	TV(){
		super("LG TV", 3000000);
	}
	
	void setChannel(){
		System.out.println("채널을 변경합니다.");
	}
	
}

// 손님 만들기
class Customer{
	int money = 100000000;
	
	//물건을 가지고 있을 배열 생성해 주기(위에 있는 모든 클래스를 넣을 수 있는 크기로 만들어야함: tv,에어컨, 데스크 타입...)
	//배열의 크기가 Product면 세개의 클래스를 다 넣을 수 있다.
	Product[] item = new Product[10]; //이것도 다형성임
	
	//물건사는 행위를 하는 메서드 생성
	void buy(Product p){
		//물건을 사기위해 무엇을 살지 정보가 필요함: 파는 물건들을 파라미터로 넣어줌 
        - 셋다 받을 수 잇는것은 Product(다형성 사용) (아니면 다따로 만들어야 하기 때문)
	            if(money < p.price){ //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()+"를 구매했습니다.");
	}
	

}

 
profile
신입 개발자 입니다!!!

0개의 댓글