본문 바로가기

Developer/Java-oop

#014. inheritance (상속) 알아보자...

#014. inheritance (상속) 알아보자...

 

1. 자바에서 상속은 부모클래스(SuperClass) 의 변수, 메서드, 생성자 등을 자식클래스(SubClass) 에게 사용 할 수 있도록 해주는 것이다.

1) 자식클래스는 하나의 부모클래스만 가질 수 있다.

2) 자식클래스는 부모의 모든 것을 받아야 하며, 부분적으로 받을 수 없다.

3) 부모의 private 접근제한자 와 생성자는 물려주지 않는다.

4) 자식객체가 생성될 때 부모의 객체도 같이 생성이 된다.

 

2. 아래 예제를 통해 자세히 알아보자.

우선 학교가 있다.

학교에는 학생과 교수가 있다.

학교에는 학과, 성명 의 저장공간이 있고, 그 내용을 출력하는 기능이 있다.

학교에서는 학생과 교수의 학과, 성명 이 필요하고, 그 내용을 확인할 수 있어야 한다.

학생은 학년, 성적 이란 저장공간이 필요하고, 수업을 듣는 기능이 필요하다.

교수는 과목 이란 저장공간이 필요하고, 연구하는 기능이 필요하다.

학생과 교수는 학과, 성명 의 공간을 따로 가질 필요가 없이 학교로부터 상속을 받으면 된다.

 

3. 위 가정을 통해서 우리는 아래와 같이 코딩을 해보겠다.

패키지는 oop2 로 한다.

학교 = School Class 로 한다. dept, name 변수와 printer() 메서드를 만든다.

학생 = Student Class 로 한다. grade, score 변수와 study() 메서드를 만든다.

교수 = Professor Class 로 한다. subject 변수와 research() 메서드를 만든다.

테스트 = SchoolDemo Class 로 테스트를 한다.

 

1) 학교 class (School.java)

코드

package oop2;

public class School {

    String dept;

    String name;

    

    public void printer(){

        System.out.println("학과:"+dept+", 성명:"+name);

    }

}

설명

학교 클래스에 학과, 성명 변수와 출력 기능을 만들었다.

 

2) 학생 class (Student.java)

코드

package oop2;

public class Student extends School {

    int grade;

    int score;

    

    public void study(){

        System.out.println("수업을 듣습니다...");

    }

}

설명

문장2: extends School 키워드를 통해 School 로 부터 상속을 받는다.

학생 클래스는 학년, 점수 변수와, 공부를 한다는 메서드를 하나 만들었다.

 

3) 교수 class (Professor.java)

코드

package oop2;

public class Professor extends School {

    String subject;

    

    public void research(){

        System.out.println("연구를 합니다...");

    }

}

설명

문장2: extends School 키워드를 통해 School 로 부터 상속을 받는다.

교수 클래스에 과목 변수와 연구 메서드를 만들었다.

 

4) 데모 class (SchoolDemo.java)

코드

package oop2;

public class SchoolDemo {

    public static void main(String[] args) {

        

        Student st = new Student();

        st.dept = "전산학과";

        st.name = "김동혁";

        st.grade = 2;

        st.score = 99;

        

        Professor pr = new Professor();

        pr.dept = "국어국문";

        pr.name = "김교수";

        pr.subject = "언어학";

        

        st.printer();

        pr.printer();

    }

}

결과

학과:전산학과, 성명:김동혁

학과:국어국문, 성명:김교수

설명

문장5,11: 학생과 교수는 각각의 객체를 생성한다.

문장6,7,12,13: School의 멤버변수에 값을 지정한다. (부모의 변수공간을 사용)

문장8,9,14: 자기 자신의 멤버변수에 값을 할당했다.

문장16,17: School의 멤버메서드 printer 기능을 사용해서 결과를 출력하고 있다.

 

4. 그럼 우리는 메서드 오버로드의 기능을 통해 학생과 교수의 기능을 사용할 수 있다.

SchoolDemo class 의 내용을 아래와 같이 변경 해보자.

코드

package oop2;

public class SchoolDemo {

    public static void printerTest(School sc) { sc.printer(); }

    public static void printerTest(Student st) { st.study(); }

    public static void printerTest(Professor pr) { pr.research(); }

    

    public static void main(String[] args) {

        Student st = new Student();

        st.dept = "전산학과";

        st.name = "김동혁";

        st.grade = 2;

        st.score = 99;

        Professor pr = new Professor();

        pr.dept = "국어국문";

        pr.name = "김교수";

        pr.subject = "언어학";

        printerTest(st);

        printerTest(pr);

    }

}

결과

수업을 듣습니다...

연구를 합니다...

설명

문장3,4,5: 파라메터의 타입이 다르기 때문에 오버로드 기능이 가능하다.

문장17: printerTest(st) 는 문장4 가 실행되어 수업을 듣습니다. 라고 문구가 출력이 된다.

문장18: printerTest(pr) 는 문장5 가 실행되어 연구를 합니다. 라고 문구가 출력이 된다.

여기서 main 메서드(문장7)가 static 임으로 문장3,4,5 도 static 으로 선언이 되어야 호출을 할 수가 있다.

 

그럼 다음 시간엔 위 예제로 up / down casting 을 알아보자...

 

잡담. 설명이 참 어렵네요. ㅠㅠ 오늘도 화이팅 입니다. 감사합니다.(__)