티스토리 뷰

개발

[Java] 상속

호호홍얍얍 2022. 5. 17. 21:29

상속

  • 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
  • 코드의 재사용성을 높이고, 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

class Parent{int age;}
class Child extends Parent{ }
  • Parent가 부모클래스, Child가 자식클래스이다.
  • 자식클래스는 부모클래스의 멤버변수인 age를 사용할 수 있다. = 자식 클래스는 조상 클래스의 모든 멤버를 상속받는다.
  • 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
  • 상속에는 형제 관계 같은 건 없다.
  • 자식의 자식은 조상 클래스의 모든 멤버를 물려받는다.
  • 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다. = 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.

포함관계

  • 상속 외에도 클래스를 재사용하는 방법이 바로 포함관계이다.
  • 아래의 코드를 보면 Point 클래스의 인스턴스를 멤버변수로 선언하여 포함시켜 코드를 재사용한다.
    Class Circle{
      Point c = new Point();
      int r;
    }
    • 포함관계와 상속관계의 구분은, '은 ~이다'가 성립되면 상속관계를, '은 ~을 가지고 있다.'가 성립되면 포함관계를 맺어주면 된다.

참조변수에 문자열을 가리키는 주소가 저장되어 있다면?

  • System.out.println(참조변수) 출력 시, System.out.println(참조변수.toString()) 과 같은 효과를 가진다.

단일상속

  • 자바에서는 오직 단일 상속만을 허용한다.

Object 클래스

  • 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 컴파일러에 의해 자동적으로 Object 클래스로부터 상속을 받게 된다.

오버라이딩

  • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
  • 조건:
    • 이름이 같을 것
    • 매겨변수가 같을 것
    • 반환타입이 같을 것(반환타입을 자손 클래스의 타입으로 변경하는 것은 가능하다)
  • 접근제어자의 조건:
    • 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다
    • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다
      • Exception은 모든 예외의 최고 조상이므로 가장 많은 수의 예외라고 할 수 있다! 즉, 조상 클래스에서 Exception을 선언하지 않았다면 자식 클래스에서도 할 수 없다.

조상의 static 메서드 vs 자신의 static 메서드

  • static 메서드는 클래스 영역에 선언된 것이기 때문에 서로 아무런 관련이 없다. 호출 시 '클래스이름.메서드이름()'으로 호출하는 것이 바람직하다.

super

  • 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는데, 중복 정의되어 조상과 자손을 구분해야 할 때만 쓰는 것이 좋다.
  • 중복 정의가 되지 않았다면 조상 클래스에 정의된 변수 x는 super.x나 this.x는 같은 변수이다. 상속받은 멤버도 자신의 멤버이므로, 자손 클래스 자신의 멤버를 가리키게 된다.
  • 단, static 메서드는 인스턴스와 관련이 없다. 그래서 this와 마찬가지로 super 역시 static 메서드에서는 사용할 수 없고, 인스턴스 메서드에서만 사용할 수 있다.
    • 복습) staitc메서드=클래스 메서드. 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능하다.

super()

  • 조상 클래스의 생성자
  • 조상 클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 생성자의 첫 줄에서 조상클래스의 생성자가 호출되어야 한다. (아니면 컴파일러가 자동으로 추가함)
    • 만약 조상 클래스에 기본 생성자를 만들지 않고 매개변수가 있는 다른 생성자를 만들었을 때, 자식 클래스에서 super()를 호출하는 경우 컴파일 에러가 발생한다. 자식 클래스에서는 super()를 호출하는데, 생성자가 정의되어 있는 클래스에는 컴파일러가 기본 생성자를 자동적으로 추가하지 않기 때문이다.

'개발' 카테고리의 다른 글

[Java] 제어자  (0) 2022.05.18
[Java] 패키지와 임포트  (0) 2022.05.17
[Java] 변수와 메서드  (0) 2022.05.15
[Java] 객체지향  (0) 2022.05.15
[Java] 다차원 배열  (0) 2022.05.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함