Java_상속 / 오버라이딩(overriding)

song·2023년 10월 16일

Java

목록 보기
19/36

상속 (is-a 관계)

  • 부모님꺼 내꺼. 내꺼도 내꺼
  • 새로운 클래스를 정의할때 이미 구현된 클래스를 상속(inheritance) 받아서, 그 클래스의 속성과 기능을 받아서 확장하여 클래스를 구현한다(부모의 생성자, 초기화블록은 제외)
  • 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현할때 상속을 함.
  • 단일상속만 가능(여러 부모 가질수 없음)
    extends 키워드 뒤에는 딱 하나의 클래스만 올 수 있음 (자바는 단일상속만 지원)
  • 조상부터 자손까지 계속 이어져서 상속 가능
    부모가 상속받고 있으면 자식은 부모의부모(조상)꺼까지 다 상속 가능
  • 자식이 변경되면 부모는 영향을 안받음. 부모가 바뀌면 자식은 영향 다 받음
  • 상속 하는 클래스: 상위 크래스, parent class, base class, super class 라고 부름
  • 상속 받는 클래스: 하위 클래스, child class, derived class, sub class 라고 부름
  • 상속의 문법
    class Parent {}
    class Child extends Parent {}
  • super()를 쓰면 부모의 생성자를 호출 할 수 있다.
    메서드를 호출할 수는 없다.
    ex) 부모 변수가 private이면 자식도 사용할 수 없으니 부모의 생성자를 호출해서 인스턴스화 시키기
  • 상속할 때 자식이 부모에 있던 변수 다시 재정의했을 때 부모에서 해당 변수쓰고 있는 메서드는 사용할 수 없다.
    부모꺼 가져올 때는 참조의 형태를 띄고 있으므로 자식에서 변수를 바꾸면 부모에선 해당 변수를 그 메서드에서 사용할 수 없기 때문이다.

오버라이딩

  • 상속받은 메서드의 내용을 변경하는것(선언부는 그대로 따라해야함)

오버라이딩 조건

  1. 선언부는 반환타입, 메서드 이름, 매개변수 모두 조상과 동일해야함
    (구현부만 내 맘대로)
  2. 접근제어제는 조상의 범위보다 같거나 크게 해야함( public > protected > [default] > private )
  3. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
    • ex) 조상: public void gait() throws IOException, SQLException {}
      자식: public void gait() throws IOException {}

예외처리

  • 오버라이딩을 한 경우 해당 클래스에서 메서드에 예외에 관련된걸 했을때 main 함수에서 메서드를 그냥 사용하면 에러남
  • 해결방법
    1. main 메서드에 throws 로 걸었던 예외처리 문들을 걸어주면 됨
      어떤 예외처리 문을 걸어야 할 지 모르면 Exception만 걸어주면 됨. (Exception이 최 상위 예외처리 문)
    2. try catch 문을 이용하면 됨

Object

  • Object 라는 모든 클래스의 조상인 클래스가 있다.
  • 우리가 별도로 extends 를 이용해서 상속을 받지 않으면 컴파일러가 알아서 뒤에 'extends Object' 라는 문구를 붙인다.
  • Object 클래스에는 toString(), equals(), hashCode() 같은 기본으로 필요한 11개 메서드들이 정의되어 있다.
  • 그래서 우리가 toString() 을 별도로 만들지 않아도 사용 가능한거임

포함관계 (has-a 관계)

  • 상속 이외에도 클래스를 재사용하는 방법이 있다. '포함' 이라는건데 사실 이건 많이 해봤다.
  • 한 클래스에서 다른 클래스를 인스턴스로 생성해서 사용하는 것이다.
    class Child22 {
      Parent22 p22 = new Parent22(); /* 포함관계 */
    }
  • 공통되는 속성이나 기능들이 많지 않다면 상속보다는 포함관계를 추천한다.
    이유: 상속은 하나밖에 못하기 때문. 상속하면 클래스 작성이 더 어려워짐.
  • 포함관계인 경우 인스턴스를 타고 또 타서 실제 사용하려는 메서드나 변수까지 찾아 가야한다
    ex) c22 안에 p22 안에 있는 eyes 변수를 사용 => c22.p22.eyes 라고 말해줘야함
    class Parent22 {
        int eyes = 2;
        public void gait() throws IOException, SQLException {
            System.out.println("팔자걸음");
        }
    }
    class Child22 {
        Parent22 p22 = new Parent22(); /* 포함관계 */
    }
    public class Ex22_3_포함관계 {
        public static void main(String[] args) {
            Child22 c22 = new Child22();
            System.out.println(c22.p22.eyes); <- 타고 타서 찾아가기
        }
    }
profile
계속 나아가기

0개의 댓글