- 기존의 클래스를 물려받아 새로운 클래스를 만드는 것이다.
- 작성방법: 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()+"를 구매했습니다.");
}
}