본문 바로가기

Java/Java Advance

자바 상속과 생성자 활용하기

728x90
반응형

안녕하세요! 이번 포스트에서는 자바에서 상속과 생성자를 활용하여 학생과 학생 리더를 표현하는 클래스를 만들어보겠습니다. 이 예제는 객체 지향 프로그래밍의 중요한 개념 중 하나인 상속을 다룹니다.

 

학생 클래스 (Student)

public class Student {
    String name;
    String major;
    int age;
    int grade;

    // 기본 생성자
    public Student() {
        System.out.println("Student의 기본 생성자");
    }

    // 이름을 받는 생성자
    public Student(String name) {
        this.name = name;
        System.out.println("Student의 이름을 받는 생성자");
    }

    // 이름과 전공을 받는 생성자
    public Student(String name, String major) {
        this(name);
        this.major = major;
        System.out.println("Student의 이름, 전공을 받는 생성자");
    }

    // 이름, 전공, 나이를 받는 생성자
    public Student(String name, String major, int age) {
        this(name, major);
        this.age = age;
        System.out.println("Student의 이름, 전공, 나이를 받는 생성자");
    }

    // 학년을 반환하는 메서드
    public int grade() {
        System.out.println("Student의 grade() 메서드");
        grade = 1;
        return grade;
    }
}

 

반장 클래스 (StudentLeader)

public class StudentLeader extends Student {
    int grade; // 부모 클래스의 grade와 동일한 이름의 멤버 변수

    // 기본 생성자
    public StudentLeader() {
        System.out.println("StudentLeader의 기본 생성자");
    }

    // 이름을 받는 생성자
    public StudentLeader(String name) {
        super(name);
        System.out.println("StudentLeader의 이름을 받는 생성자");
    }

    // 이름과 전공을 받는 생성자
    public StudentLeader(String name, String major) {
        this(name);
        this.major = major;
        System.out.println("StudentLeader의 이름, 전공을 받는 생성자");
    }

    // 이름, 전공, 나이를 받는 생성자
    public StudentLeader(String name, String major, int age) {
        super(name, major);
        this.age = age;
        System.out.println("StudentLeader의 이름, 전공, 나이를 받는 생성자");
    }

    // 이름, 전공, 나이, 학년을 받는 생성자
    public StudentLeader(String name, String major, int age, int grade) {
        this(name, major, age);
        this.grade = grade;
        System.out.println("StudentLeader의 이름, 전공, 나이, 학년을 받는 생성자");
    }

    // 학년을 반환하는 메서드 (부모 클래스의 메서드 오버라이딩)
    @Override
    public int grade() {
        System.out.println("StudentLeader의 grade() 메서드");
        grade = 3;
        return grade;
    }

    // 학년을 출력하는 메서드
    public void callGrade() {
        System.out.println("Student의 학년은: " + super.grade());
        System.out.println("StudentLeader의 학년은 1: " + this.grade());
        System.out.println("StudentLeader의 학년은 2: " + grade());
    }

    public static void main(String args[]) {
        // StudentLeader sl1 = new StudentLeader("반장님");
        // StudentLeader sl2 = new StudentLeader("반장님", "컴공");
        // StudentLeader sl3 = new StudentLeader("반장님", "컴공", 25);
        StudentLeader sl4 = new StudentLeader("반장님", "컴공", 25, 3);
        System.out.println("\n");
        // System.out.println("overriding 된 grade : "+sl4.grade());
        sl4.callGrade();
    }
}



이 예제에서는 `Student` 클래스를 상속하여 `StudentLeader` 클래스를 만들었습니다. 생성자를 통해 다양한 속성을 가진 객체를 생성할 수 있으며, 메서드 오버라이딩을 통해 부모 클래스의 메서드를 재정의하였습니다. 결과적으로, `StudentLeader` 클래스의 객체를 생성하고 학년을 출력하는 예제를 실행하면 다음과 같은 결과가 나옵니다.

Student의 이름을 받는 생성자
Student의 이름, 전공을 받는 생성자
StudentLeader의 이름, 전공, 나이를 받는 생성자
StudentLeader의 이름, 전공, 나이, 학년을 받는 생성자

Student의 grade() 메서드
Student의 학년은: 1
StudentLeader의 grade() 메서드
StudentLeader의 학년은 1: 3
StudentLeader의 grade() 메서드
StudentLeader의 학년은 2: 3


이를 통해 상속과 생성자가 어떻게 작동하는지 이해할 수 있습니다. 계층 구조를 통해 코드를 구성하면 코드의 재사용성을 높이고 유지보수가 용이해집니다.

728x90
반응형