[230725] 상속 관계의 생성자, 메소드 오버라이드, 업캐스팅, 다운캐스팅, Object (DAY 20)

MJ·2023년 7월 26일

수업 TIL🐣💚

목록 보기
21/68

상속 관계의 생성자

  1. 자식 클래스를 생성할 땐 "반드시" 부모 클래스를 "먼저" 생성해야 한다
  2. 서브 클래스를 생성할 땐 "반드시" 슈퍼 클래스를 "먼저" 생성해야 한다
  3. 서브 클래스의 생성자가 호출될 때는 "반드시" 슈퍼 클래스의 생성자를 "먼저" 호출해야 한다
  4. 만약 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 호출하지 않으면 Java에 의해서 슈퍼 클래스의 "디폴트 생성자"가 호출된다
  5. 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 호출하는 방법은 super()
  //new Student("홍길동", "가산대학교")에서 호출되는 생성자
  public Student(String name, String school) {
    //파라미터 String name을 슈퍼 클래스의 생성자를 호출할 때 전달한다
    super(name); //인수 name은 String 타입이므로 파라미터가 String인 Person 생성자가 호출된다
    this.school = school;
  }

메소드 오버라이드(method override)

1. 슈퍼 클래스의 메소드를 서브 클래스가 다시 만드는 것 (메소드 덮어쓰기)
2. 오버라이드하는 메소드는 @Override Annotation을 추가하는 것이 좋음 (권장이지만 필수로 하자)
3. 반드시 동일한 모습으로 오버라이드해야 함

package ex04_override;

public class Espresso {
  public void taste() {
    System.out.println("쓴 맛");
  }
}
public class CafeLatte extends Espresso {
  @Override //오버라이드한 메소드 (덮어쓰기하는 메소드), @Override를 붙여주면 문법 체크를 해주고 슈퍼 클래스랑 다르면 오류 표시
  public void taste() {
    System.out.println("라떼 맛");
  }
}

업캐스팅(upcasting)

  1. 서브 클래스 객체를 슈퍼 클래스 타입으로 저장할 수 있다.
  2. 강제로 캐스팅(형변환)할 필요가 없다. 자동으로 변환된다.
  3. 장점
    1) 슈퍼 클래스 타입으로 모든 서브 클래스 객체를 저장할 수 있다.
    2) 서로 다른 타입의 객체를 하나의 타입으로 관리할 수 있다.
  4. 단점
    1) 슈퍼 클래스 타입으로 저장하기 때문에 슈퍼 클래스의 메소드만 호출할 수 있다.
    2) 이 단점을 해결하기 위해서 메소드 오버라이드(method override)를 이용할 수 있다.
  • 슈퍼 클래스에 실행이 목적이 아닌 호출이 목적인 메소드 넣어주고 서브 클래스에서 구현
  • 서로 다른 타입을 하나의 타입으로 저장하는 방법은 상속밖에없음, 업캐스팅 = 상속에서 제일 중요
    Person p1 = new Student("고길동", "강원대학교"); //자식 객체 Student를 부모 타입으로 저장
    Person p2 = new Alba("홍길동", "가산대학교", "투썸"); //자식 객체 Albe를 부모 타입으로 저장
    // 서로 다른 타입의 Student와 Alba를 하나의 타입 Person으로 관리
    
    p1.eat(); //eat = Person 메소드
    p1.sleep(); //sleep = Person 메소드
    p1.study(); //study = student 메소드
    //원래 자식 메소드를 부모가 사용 못하지만 person에 있어야 호출할 수 있으니 person에 study 넣어주고 student에서 오버라이드하면 person으로도 사용할 수 있어짐

다운캐스팅(downcasting)

  • 슈퍼 클래스 타입 -> 서브 클래스 타입으로 변경
  public static void ex01() {
    Person p = new Student();
    p.eat();
    p.sleep();
    ((Student) p).study(); //슈퍼 클래스 타입 -> 서브 클래스 타입으로 변경(다운캐스팅) 

    ((Worker) p).work(); //잘못된 캐스팅 (student를 work로 바꾸는것)   
  }
  • 오버라이딩하지 않아도 Student의 메소드인 study()를 사용할 수 있음
  • p.study 치면 ((Student) p).study() 자동완성됨

java.lang.Object 클래스

  1. 모든 클래스의 최상위 슈퍼 클래스
  2. 별도의 슈퍼 클래스를 명시하지 않은 클래스들은 (extends가 없는 클래스) 모두 Object 클래스의 서브 클래스
  3. 모든 것을 저장할 수 있는 java의 만능 타입 (업캐스트)
  4. Object 타입으로 저장하면 Object 클래스의 메소드만 호출할 수 있음 (업캐스팅 단점이랑 똑같음)
  5. 이를 해결하기 위해서 반드시 (다운)캐스팅 (해결책이 오버라이딩, 다운캐스팅 두 가지지만 object 경우 오버라이딩은 object에 직접 코드 추가해야해서 못씀. 오브젝트는 다운캐스팅. 나머지는 주로 오버라이딩 사용)

0개의 댓글