본문 바로가기

공부/java

java 상속

728x90

 

 

 

java 상속 개념과 구현

- 자식 클래스에서 부모 클래스 메서드 접근하는 방법
- 상속에서 메서드 오버라이딩 개념과 구현 방법


※ 상속의 개념
- 기존 클래스로부터 내용을 그대로 이어받아 사용하면서 필요에 따라 멤버변수, 메서드 등을 추가하거나 수정하여 새로운 클래스를 생성하는 작업의미
- 슈퍼 클래스(super class) : 부모의 개념으로 상속을 제공하는 상위 클래스
- 서브 클래스(sub class) : 자식의 개념으로 슈퍼클래스의 필드, 메서드를 자동으로 상속받으며 필요에 따라 필요한 필드와 메서드를 추가


※ 상속 구현

class 클래스명 extends 슈퍼클래스명
ex)
class circle_basic{
   int r;
   doble pi=3.14;
   public void circle_width(int a){
   r=a
   System.out.printIn("원의 넓이="+(a*a*pi));
   }
}

class circle_outside extends circle_basic{     //circlr_basic 클래스에 상속받겠다
   public void outside_width(){
   System.out.printIn("원구의 넓이="+(4*pi*(r*r)));
   }
}

public class sample{
public static void main(String[] args) {
   int my_val;
   System.out.printIn("반지름을 입력하세요");
   Scanner sc= new Scanner(System.in);
   my_val=sc.nextInt();
   circle_outside my_circle=new circle_outside();
   my_circle.circle_width(my_val);     //부모 클래스 메서드 호출
   my_circle.outside_width();
}
}


7을 입력할경우 아래처럼 결과가 나옴)

반지름을 입력하세요
7
원의 넓이=153.86
원구의 넓이=615.44

 

 

※ 구체적인 예시를 통한 자바 상속 실습

ex)
//슈퍼클래스 basic_salary 선언 후 수행
class basic_salary{
   int work_time;
   long work_pay;
   public void day_pay() {
   System.out.printIn("일 급여액="+(work_time*work_pay));
   }
}

//서브클래스 night_salary 선언 후 수행
class night_salary extends basic_salary{
   long danger_pay=50000;
   long special_pay=17000;
   public void night_work() {
   System.out.printIn("야간 총 추가액="+(danger_pay+special_pay));
   }
}

//메인에서 서브클래스의 인스턴스를 생성하고 메서드 호출
public class sample{
public static void main(String[] args) {
   night_salary n_work=new night_salary();
   n_work.work_time=7;
   n_work.work_pay=13000;
   n_work.day_pay();
   n_work.night_work();
}
}


결과는 아래와 같음)


일 급여액=91000
야간 총 추가액=67000

 

 

하위 메서드에서 상위 메서드를 불러올 때는  super.메서드명();  형식을 사용하고 위 급여 소스에 적용하면 아래 예제와 같다.

ex)
class basic_salary{
   int work_time;
   long work_pay;
   public void day_pay() {
   System.out.printIn("일 급여액="+(work_time*work_pay));
   }
}

class night_salary extends basic_salary{
   long danger_pay=50000;
   long special_pay=17000;
   public void night_work() {
   super.day_pay();     //이렇게 쓰면 부모클래스의 day_pay 메서드를 호출하겠다는 의미임
   System.out.printIn("야간 총 추가액="+(danger_pay+special_pay));
   }
}

public class sample{
public static void main(String[] args) {
   night_salary n_work=new night_salary();
   n_work.work_time=7;
   n_work.work_pay=13000;
   n_work.night_work();
}
}

 

 

정보은닉을 위해서 접근한정자를 private를 사용했는데 상속 클래스에서 접근하기를 바란다면 접근한정자를 protected로 변경해서 쓰도록한다.

ex)
class basic_salary{
   int work_time;
   protected long work_pay=13000;     //protected는 private와 같은 성격을 가지고 있지만 상속 클래스에는 접근을 허용
   protected void day_pay() {     //protected 대신 private를 쓴다면 본 소스에서는 하위 클래스가 접근을 못해서 오류가 뜸
   System.out.printIn("일 급여액="+(work_time*work_pay));
   }
}

class night_salary extends basic_salary{
   long danger_pay=50000;
   long special_pay=17000;
   public void night_work() {
   super.day_pay();     //private 쓰면 여기서 접근을 못해서 오류
   System.out.printIn("야간 총 추가액="+(danger_pay+special_pay));
   }
}

public class sample{
public static void main(String[] args) {
   night_salary n_work=new night_salary();
   n_work.work_time=7;
   n_work.night_work();
}
}

 

 

※ 메서드 오버라이딩
- 같은 이름의 메서드인데 동작은 다른 결과를 도출하고 싶을 때 오버라이딩을 사용

ex)
class basic_salary{
   int work_time;
   protected long work_pay=13000;   
   protected void day_pay() {   
   System.out.printIn("일 급여액="+(work_time*work_pay));
   }
}

class night_salary extends basic_salary{
   long danger_pay=50000;
   long special_pay=17000;
   public void day_pay() {
   long night_total=danger_pay+special_pay;
   System.out.printIn("야간수당포함 총 일급여액="+(nignr_total+(work_time*work_pay));
   }
}

public class sample{
public static void main(String[] args) {
   night_salary n_work=new night_salary();
   n_work.work_time=7;
   n_work.day_pay();
}
}


결과는 아래와 같음)
야간수당포함 총 일급여액=158000


이때 메인에서 객체 생성을 하위클래스인 night_salary가 아닌 basic_salary에서
basic_salary n_work=new basic_salary(); 라고 했다면 결과는 아래와 같음)
일 급여액=91000

 

 

 

반응형