본문으로 바로가기

상속-1

category 프로그래밍/java 2017. 9. 1. 22:47

상속


예를들어 경기용 레이싱 카를 만든다고 할 때 


기존에 만들었던 Car클래스를 바탕으로 레이싱을 표현하는 RacingCar클래스를 만들 수 있다. 
이 처럼 새로운 클래스를 만드는 행위를 클래스를 확장한다(extends)라고 한다. 



class 자동차


{

챠량 번호;

연료 양;

차량 번호와 남은 연료의 양을 표시하는 기능;

}


class 레이싱 카 상속받는다 자동차


{

ex) 경기용 코스

경기용 코스를 제공하는 기능(메소드)

}



자동차 클래스 ---> 슈퍼 클래스

레이싱 카 클래스 ---> 서브 클래스


클래스 확장하기


서브 클래스 선언

class 서브 클래스 이름 extends 슈퍼 클래스 이름

{

서브 클래스에 추가하는 멤버 . . .

서브 클래스의 생성자(인수 목록)

}


클래스 확장하기


// 자동차 클래스


// 자동차 클래스


class Car


{

    

private int num;

    

private double gas;

    

    


public Car()

    

{

        

num = 0;

        

gas = 0.0;

        

System.out.println("자동차가 만들어졌습니다.");

    

}

    

public void setCar(int n, double g)

    

{

        

num = n;

        

gas = g;

        

System.out.println("차량 번호를 " + num + "으로, 연료 양을 " + gas + "로 바꾸었습니다.");

    

}

    

public void show()

    

{

        

System.out.println("차량 번호는 " + num + "입니다.");

        

System.out.println("연료 양은 " + gas + "입니다.");

    

}


}


// 레이싱 카 클래스


class RacingCar extends Car  서브 클래스를 선언

{

    

private int course; 추가되는 필드

    


public RacingCar()  추가되는 메소드

    

{

        

course = 0;

        

System.out.println("레이싱 카가 만들어졌습니다.");

    

}

    

public void setCourse(int c) 추가되는 메소드

    

{

        

course = c;

        

System.out.println("코스 번호를 "+ course + "로 했습니다.");

    

}


}

///후반부

RacingCar클래스는 Car클래스를 물려받지만 그 클래스 안에서는 물려받은 멤버를 따로 작성할 필요가 없고

Car 클래스에 없는 고유의 멤버를 추가하면 되는것이다.


서브 클래스의 객체 생성하기


객체를 생성하는 것도 똑같다.

///전반부



class Sample1


{

    

public static void main(String[] args)

    

{

        

RacingCar rccar1;

         

rccar1 = new RacingCar();  서브 클래스의 객체 생성

        

        


rccar1.setCar(1234, 20.5);  상속받은 메소드 호출

        

rccar1.setCourse(5); 추가되는 메소드 호출

    

}


}



실행결과


자동차가 만들어졌습니다. 슈퍼클래스의 인수 없는 생성자가 출력한 문구

레이싱 카가 만들어졌습니다.

차량 번호를 1234으로, 연료 양을 20.5로 바꾸었습니다. 서브 클래스의 생성자가 출력한 문구

코스 번호를 5로 했습니다.

서브 클래스의 생성자 호출에 앞서, 슈퍼 클래스의 생성자가 호출되되는것이 기본, 슈퍼클래스의 생성자는 서브 클래스에게 상속되지 않늗다.



슈퍼 클래스의 생성자 지정하기


생성자를 가공하지 않는다면 인수없는 메소드 호출

슈퍼 클래스의 생성자가 여러개 존재한다면 호출되는 생성자를 명시적으로 지정해야 할 수도 있을 것이다.


// 자동차 클래스


class Car


{

    

private int num;

    

private double gas;

    

public Car()

    

{

        

num = 0;

        

gas = 0.0;

        

System.out.println("자동차가 만들어졌습니다.");

    

}

    


public Car(int n, double g)

    

{

        

num = n;

        

gas = g;

        

System.out.println("자동차가 만들어졌습니다.");

    

}

    

public void setCar(int n, double g)

    

{

        

num = n;

        

gas = g;

        

System.out.println("차량 번호를 " + num + "으로, 연료 양을 " + gas + "로 바꾸었습니다.");

    

}

    

public void show()

    

{

        

System.out.println("차량 번호는 " + num + "입니다.");

        

System.out.println("연료 양은 " + gas + "입니다.");

    

}


}

//레이싱 카 클래스


class RacingCar extends Car


{

 

private int course;

 


public RacingCar()

 

{

     

course = 0;

     

System.out.println("레이싱 카가 만들어졌습니다.");

 

}

public RacingCar(int n, double g, int c)

{

super(n,g);  슈퍼 클래스에 존재하는 두 개의 인수를 받는 생성자가 호출

course = c;

System.out.println("코스 번호가" + course + "인 레이싱 카가 만들어 졌습니다.");

}

 

public void setCourse(int c)

 

{

     

course = c;

     

System.out.println("코스 번호를 "+ course + "로 했습니다.");

 

}


}


public class Sample2 {


public static void main(String[] args)

{

// TODO Auto-generated method stub

RacingCar rccar1 = new RacingCar(1234, 20.5, 5); 서브 클래스에 존재하는 세 개의 인수를 받는 생성자 출력

}


}



실행결과

차량 번호가 1234이며, 연료 양이 20.5인 자동차가 만들어졌습니다.

코스 번호가5인 레이싱 카가 만들어 졌습니다. 2개인수를 가지는 슈퍼 클래스의 생성자 출력




멤버에 접근하기


서브 클래스 안에서 접근하기




class Car


{

    

private int num;

    

private double gas;

 }

class RacingCar

{

private int course;

...

public void newShow()

}

class RacingCar extends Car


{

 

. . .

public RacingCar()

 

{

     

course = 0;

     

System.out.println("레이싱 카가 만들어졌습니다.");

 

}


슈퍼 클래스의 private 멤버도 상속자인 서브 클래스조차 접근 불가능하다.

그러나 슈퍼클래스에서 protected라는 제한자를 사용할 수 있다.


// 자동차 클래스


class Car


{

    

protected int num;

    

protected double gas;

    

public Car()

    

{

        

num = 0;

        

gas = 0.0;

        

System.out.println("자동차가 만들어졌습니다.");

    

}

    


public Car(int n, double g)

    

{

        

num = n;

        

gas = g;

        

System.out.println("차량 번호가 " + num + "이며, 연료 양이 " + gas + "인 자동차가 만들어졌습니다.");

    

}

    

public void setCar(int n, double g)

    

{

        

num = n;

        

gas = g;

        

System.out.println("차량 번호를 " + num + "으로, 연료 양을 " + gas + "로 바꾸었습니다.");

    

}

    

public void show()

    

{

        

System.out.println("차량 번호는 " + num + "입니다.");

        

System.out.println("연료 양은 " + gas + "입니다.");

    

}


}

//레이싱 카 클래스


class RacingCar extends Car


{

 

private int course;

 


public RacingCar()

 

{

     

course = 0;

     

System.out.println("레이싱 카가 만들어졌습니다.");

 

}

public RacingCar(int n, double g, int c)

{

super(n,g);

course = c;

System.out.println("코스 번호가" + course + "인 레이싱 카가 만들어 졌습니다.");

}

 

public void setCourse(int c)

 

{

     

course = c;

     

System.out.println("코스 번호를 "+ course + "로 했습니다.");

 

}

public void newShow()

{

System.out.println("레이싱 카의 차량 번호는" + num + "입니다.");

System.out.println("연료 양은" + gas + "입니다.");

System.out.println("코스번호는"+  course + "입니다." );

}


}


public class Sample3 {


public static void main(String[] args)

{

// TODO Auto-generated method stub

RacingCar rccar1 = new RacingCar();

rccar1.newShow();

}


}


실행결과

자동차가 만들어졌습니다.

레이싱 카가 만들어졌습니다.

레이싱 카의 차량 번호는0입니다.

연료 양은0.0입니다.

코스번호는0입니다.

슈퍼 클래스에서 protected 접근을 제한한 멤버는 private멤버의 경우와 다르게 서브 클래스가 접근가능하다.