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
반응형
'공부 > java' 카테고리의 다른 글
java 클래스와 객체 코딩 (0) | 2023.01.11 |
---|---|
java 배열코딩(array) : 1차원 배열과 2차원 배열 (0) | 2023.01.10 |
java 반복문 : while문, do ~ while문 (0) | 2023.01.10 |
java 반복문 : for문, 확장 for문 (0) | 2023.01.10 |
java 조건제어 if문, switch문 (0) | 2023.01.10 |