내일배움캠프 4일차 TIL - Java 상속

iy·2023년 12월 24일

TIL

목록 보기
3/37

상속(Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
class 자식클래스 extends 부모클래스{
    // ...
}
  • 생성자, 초기화블럭을 제외하고 자손은 조상의 모든 멤버를 상속받는다.(선택적인 것X 필수)
  • 자손의 멤버 개수는 조상보다 적을 수 없다. 항상 같거나 많다.
class Parent {
    int age;
}

class child extends Parent { } // 멤버 0개로 보이지만 상속받았으므로 한 개는 무조건 있는 것
  • 자손의 변경은 조상에 영향을 끼치지 않는다.
class Parent {
    int age;
}

class child extends Parent { 
    void play() {
        System.out.println("!!!!!"); // 새로운 멤버 추가시 자손 클래스는 상속받은 멤버, 추가된 자신의 멤버 총 두 개이고 부모는 여전히 한개의 멤버를 갖고 있다.
    }
}

포함 관계

포함(Composite)이란?

  • 클래스의 멤버로 참조변수를 선언하는 것
    • 클래스의 관계
      1. 상속
      2. 포함
  • 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
class Car {
    Engine e = new Engine(); //엔진
    Door[] d = new Door[4]; //문, 문의 개수를 넷으로 가정하고 배열로 처리했다.
}

// 엔진과 문의 클래스를 만들고 자동차 클래스에 포함시킨 것

클래스 간의 관계 결정

  • 상속 관계 '~은 ~이다.'
  • 포함 관계 '~은 ~을 가지고 있다.'

    상속과 포함 두 경우 모두 저장 공간 개수는 동일하고 구조만 다르다.

//1 포함
class Circle {
    Point c = new Point();
    int r;
}

//2 상속
class Circle extends Point {
    int r;
}
  1. 원은 점이다.
  2. 원은 점을 가지고 있다.

1번과 2번 중 자연스러운 것은 2번! -> 이 경우는 포함 관계이다.

단일 상속(Single Inheritance)

  • Java는 단일 상속만을 허용한다.
class TvDVD extends Tv, DVD { //에러 조상은 하나만 허용됨
    // ...
}
//여러개의 상속을 받을 시 충돌 위험이 있기 때문에 Java는 다중 상속을 허용하지 않는다.
  • 비중이 높은 클래스 하나만 상속관계로 나머지는 포함관계로 한다.

Object 클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.

오버라이딩(overriding)

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
class Point {
    int x;
    int y;
    
    String getLocation() {
        return "x : " + x + ", y : " + y;
    }
}

class Point3D extends Point {
    int z;

    String getLocation() { // Point의 메서드 getLocation()을 오버라이딩한 것 선언부는 변경이 불가하고 구현부만 변경 가능하다.
        return "x : " + x + ", y : " + y + ", z : " + z;
    }
}

오버라이딩의 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
class Parent { 
    void parentMethod() throws IOException, SQLException {
        ...
    }
}

class Child extends Parent {
    void parentMethod() throws IOException { // 예외를 지금처럼 더 적은 수로 선언하는 건 가능하지만 조상보다 많이 선언할 수는 없다
        ...
    }
}

오버로딩 vs. 오버라이딩

  • 오버로딩 : 기존에 없는 (이름이 같은) 새로운 메서드를 정의하는 것 (new)
  • 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것 (change,modify)
오버로딩과 오버라이딩은 이름만 비슷할 뿐.. 관련이 없다!!
class Parent {
    void parentMethod() {}
}

class Child extends Parent { 
    void parentMethod() {} // 오버라이딩(조상 클래스의 메서드를 상속)
    void parentMethod(int i){} // 오버로딩 (이름이 같게 기존에 없는 새로운 메서드 정의)

    void childMethod() {} // 메서드 정의
    void childMethod(int i) {} //오버로딩
    void childMethod() {} // 중복 정의(에러!!!)
}

0개의 댓글