자바의 정석 (2) 상속

Sungmin·2023년 5월 25일
0

자바 기본 개념

목록 보기
3/21

상속

기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
두 클래스를 부모와 자식으로 관계를 맺어주는 것

class 자식 클래스 extends 부모클래스 {
	//...
}
  • 조상의 변경은 자손에 영향을 끼친다
  • 자손의 변경은 조상에 영향을 끼치지 않는다.

포함

클래스의 멤버로 참조변수를 선언하는 것

상속관계: ~은 ~이다

포함관계: ~은 ~을 가지고 있다


단일 상속

java는 단일 상속만을 허용

class TvDVD extends Tv, DVD { 	//에러
	//...
}

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

부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
toString(), equals(Object obj), hashCode(), ....


오버라이딩

상속받은 조상의 메서드를 자신에 맞게 변경하는 것

오버라이딩의 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.

  2. 접근 제어자가를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

    오버로딩 vs 오버라이딩

    오버로딩 - 기존에 없는 새로운 메서드를 정의하는것(new)
    오버라이딩 - 상속받은 메서드의 내용을 변경하는것(change)


super

객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에서만 존재
조상의 멤버를 자신의 멤버와 구별할 때 사용

조상의 생성자를 호출

이렇게 바꿔줘야 함


자신의 멤버만 초기화 해야 함.
조상의 생성자는 호출.

결론 : 초기화는 본인의 클래스에서. 상속받을 경우 조상의 생성자는 호출만

super() - 조상의 생성자

  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.★★
    그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입

import

클래스를 사용할 때 패키지 이름을 생략할 수 있다.
컴파일러에게 클래스가 속한 패키지를 알려준다.

ex) import로 java.util을 생략할 수 있게 해 준다.

static import

static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해 준다.


제어자(modifier)

클래스와 클래스의 멤버에 부가적인 의미 부여

접근 제어자 public, protected, (default), private
그 외 static, final, abstract...

static - 클래스의, 공통적인

멤버변수에 사용

  • 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
  • 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능.

메서드에 사용

  • 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
  • static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.

final - 마지막의, 변경될 수 없는

클래스에 사용

  • 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
    즉 다른 클래스의 조상이 될 수 없다.

메서드에 사용

  • 변경될 수 없는 메서드, 오버라이딩을 통해 재정의 불가.

멤버변수, 지역변수에 사용

  • 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.

abstract - 추상의, 미완성의

추상클래스의 인스턴스 생성불가.

클래스에 사용

  • 클래스 내에 추상 메서드가 선언되어 있음을 의미

메서드에 사용

  • 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

접근 제어자

접근 제어자의 범위는 최대한 좁히는게 좋다

private 같은 클래스 내에서만 접근 가능
(default) 같은 패키지 내에서만 접근 가능
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
public 접근 제한이 전혀 없음


다형성

조상 타입 참조 변수로 자손 타입 객체를 다루는 것

기존(타입 일치)
Tv = t = new Tv();
SmartTv s = new SmartTv();

다형성(타입 불일치)
Tv t = new SmartTv();

Tv가 조상 SmartTv가 자손일 경우
1. Tv t = new SmartTv(); - 사용 가능
2. SmartTv s = new Tv(); - 사용 불가(없는것 호출할 수 있기 때문)

profile
Let's Coding

0개의 댓글