2019년 4월 10일 수요일

Hackerrank Day 12 Inheritance







알고리즘 연습 사이트
www.hackerrank.com


Day 12:Inheritance



상속의 개념에 대해 정리해본다.

아래 소스 코드의 예시에서 Person은 부모클래스(superclass) 이며 Student 는 자식클래스(subclass) 이다.
자바의 상속은 오직 '한번' 만 허용한다.
즉 subclass는 superclass를 extents 딱 한 번만 할 수 있다.

자식 클래스가 부모 클래스의 변수, 메소드들을  그대로 상속받는데, 유일하게 상속되지 않는 것이 생성자(Constructor) 이다.

생성자라는 것 자체가 자기 자신의 클래스의 인스턴스를 초기화하는 것이다. 때문에 절대로 상속되지 않는다. 

생성자를 특별히 만들지 않으면 기본적으로 자동으로 디폴트 (비어있는) 생성자가 만들어 진다.
생성자를 새로 정의하여 파라미터를 추가하여 값을 초기화하는 경우 디폴트 생성자는 생성되지 않는다.

부모클래스를 상속하는 자식클래스는 부모클래스의 생성자를 반드시 먼저 호출해야만 한다.
그 호출을 하기 위한 방법은 super();이다.
부모클래스와 자식 클래스 둘 다 아무런 생성자를 명시하지 않은 경우에도, 자식 클래스의 자동으로 만들어지는 생성자 안에는 부모의 생성자를 호출 할 수 있게 하는 super(); 가 존재한다.

subclass인 Student 클래스에서 생성자를 이용하여 인스턴스 변수들을 초기화 하는데, 생성자가 아래의 코드와 같이 정의 되어 있는 경우에는 디폴트 생성자가 생성 되지 않기 때문에 자식 클래스의 생성자 안에서 반드시 부모 클래스의 생성자를 호출해야만 한다. 

그러면 Student 클래스를 new 할 때 Studnet의 생성자가 호출되고 super로 인해 부모의 생성자까지 호출되면서 부모의 인스턴스 변수까지 초기화 된다.

Student 객체를 생성하면 Student는 Person의 속성들을 전부 상속받았기 때문에, 
Person의 속성을 지니는 Student 객체가 한 개 만들어지게 진다. 



class Person {
 protected String firstName;
 protected String lastName;
 protected int idNumber;
 
 // 부모클래스 생성자 정의. 디폴트 생성자는 없다.
 Person(String firstName, String lastName, int identification){ 
  this.firstName = firstName;
  this.lastName = lastName;
  this.idNumber = identification;
 }
 
 // Print person data
 public void printPerson(){
   System.out.println(
    "Name: " + lastName + ", " + firstName
   +  "\nID: " + idNumber);
 }
 
}

class Student extends Person{
 private int[] testScores;

    /* 
    *   자식클래스 생성자 정의
    *   super 키워드로 부모 클래스의 생성자를 호출하여 부모 클래스의 인스턴스 변수를 초기화.
    *   그리고 자신의 인스턴스 변수를 초기화 한다.
    */
    // Write your constructor here
        public Student(String firstName, String lastName, int id, int[] scores){
            super(firstName,lastName,id);
            testScores = scores;
        }
    // 계산 메소드. 
    public char calculate (){         char grade;         int arg = 0;;         for(int i = 0 ; i < testScores.length;i++){             arg += testScores[i];         }         arg = arg / testScores.length;         if(arg >= 90 && arg <= 100){             grade = 'O';         }else if(arg >= 80 && arg <= 90){             grade = 'E';         }else if(arg >= 70 && arg <= 80){             grade = 'A';         }else if(arg >= 55 && arg <= 70){             grade = 'P';         }else if(arg >= 40 && arg <= 55){             grade = 'D';         }else{             grade = 'T';         }         return grade;     } }

위 클래스를 사용할 때는 아래와 같다.

Student s = new Student(firstName, lastName, id, testScores);
s.printPerson(); //자식 클래스에서 오버라이드를 하지 않았기 때문에 부모클래스의 메소드를 호출한다.
System.out.println("Grade: " + s.calculate() );

[결과예시]
Name: Memelli, Heraldo
ID: 8135627
Grade: O

댓글 없음:

댓글 쓰기