1일 1공 - Java 상속

BANG·2021년 4월 16일
0

1일 1공

목록 보기
3/5

Java 상속

상속이란?

  • 상위(부모) 클래스의 멤버를 하위(자식, 파생) 클래스에게 물려줌
  • 이미 잘 개발된 클래스를 재사용해서 새 클래스를 만들어 코드 중복 줄여줌
  • 접근 제한자가 private면 상속받기 불가능
  • 다른 패키지의 클래스를 상속받으려면 접근 제한자가 default면 상속받기 불가
  • 다중 상속 불가

클래스 상속

  • 하위 클래스를 선언할 때, 어떤 상위 클래스를 상속받을지 결정
class 하위클래스 extends 상위클래스 {}
  • 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가짐
  • 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가짐

부모 생성자 호출 super()

  • 모든 객체는 클래스의 생성자를 호출해야만 생성됨
  • 하위 객체를 생성하면 상위 객체가 먼저 생성

메서드 재정의(오버라이딩)

  • 상속된 일부 메서드를 하위 클래스에서 수정해서 사용

메서드 재정의

  • 하위 클래스에서 동일한 메서드를 재정의하는 것
  • 상위 클래스의 메서드와 동일한 리턴 타입, 메서드명, 매개 변수를 가져야 함
  • 접근 제한을 더 강하게 할 수 없음
    - 상위 클래스의 메서드가 public이면 하위 클래스의 메서드도 public
  • 새로운 예외를 throws 할 수 없음

부모 메서드 호출

  • 오버라이딩되면 상위 클래스의 메서드는 숨겨짐
  • 하위 클래스 내부에서 오버라이딩된 상위 클래스의 메서드를 호출해야 되면 super 키워드 사용

final클래스와 final메서드

  • final 키워드는 클래스, 필드, 메서드 선언에 사용 가능
  • 결코 수정할 수 없음

final 클래스

  • 최종적인 클래스로 상속할 수 없음
  • final 클래스는 상위 클래스가 될 수 없음

final 메서드

  • 최종적인 메서드
  • 오버라이딩 할 수 없는 메서드

타입 변환과 다형성

다형성

  • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
  • 상위 클래스로 타입변환을 허용
  • 상위 타입에 모든 하위 객체가 대입될 수 있음

타입 변환

  • 데이터 타입을 다른 데이터 타입으로 변환
  • 클래스의 타입 변환은 상속관계에 있는 클래스 사이에서 발생
  • 하위 타입은 상위 타입으로 자동 타입 변환이 가능

자동 타입 변환

  • 프로그램 실행 중에 자동적으로 타입 변환이 일어남
  • 하위 -> 상위
  • 상위 타입으로 자동 타입 변환이 되면 상위 클래스에 선언된 필드와 메서드만 접근 가능
  • 하위 클래스에서 오버라이딩되었다면 하위 클래스의 메서드가 호출됨

배열로 객체 관리

  • 동일한 타입의 값들은 배열로 관리하는 것이 유리

매개변수의 다형성

  • 메서드를 호출할 때, 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석
  • 매개값을 다양화하기 위해 매개 변수에 자식 타입 객체를 지정할 수도 있음
  • 매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 하위 객체까지도 매개값으로 사용 가능(자동 타입 변환)
  • 하위 객체가 메서드를 오버라이딩(재정의) 했다면 실행 결과가 다양해짐

강제 타입 변환(Casting)

  • 상위 -> 하위
  • 하위 타입이 상위로 자동 변환한 후, 다시 하위로 변환할 때 사용 가능
  • 모든 상위 타입을 하위로 변환되지는 않음

    하위클래스 변수명 = (하위클래스)상위클래스타입;

객체 타입 확인(instanceof)

  • 강제 타입 변환은 하위 -> 상위 -> 하위의 형태만 가능
  • 어떤 객체가 어떤 클래스의 인스턴스(객체)인지 확인하려면 instanceof연산자를 사용

    boolean result = 변수명 instanceof 타입

추상 클래스

  • 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 함
  • 클래스들의 공통적인 특성을 추출해 선언한 클래스를 추상 클래스라고 함
  • 추상 클래스가 상위이고 실체 클래스가 하위의 관계(상속의 관계)
  • 추상 클래스는 객체를 직접 생성할 수 없음
  • 추상 클래스는 new 연산자를 사용해 인스턴스를 생성할 수 없음
  • 실체 클래스를 만들기 위한 상위 클래스로만 사용됨
  • extends 뒤에만 올 수 있는 클래스

추상 클래스의 용도

  • 실체 클래스들의 공통된 필드와 메서드의 이름 통일
  • 실체 클래스를 작성할 시간 절약

추상 클래스의 선언

  • 클래스 선언에 abstract 키워드를 사용
  • abstract 키워드를 사용하면 객체를 만들지 못하고 상속으로 하위 클래스만 만듬
  • 필드, 생성자, 메서드를 선언 가능
  • 하위 객체가 super()를 통해 추상 클래스 객체를 생성하므로 생성자가 반드시 필요

추상 메서드와 오버라이딩

  • 메서드의 선언만 통일하고 실행 내용은 실체 클래스마다 달라야 할 경우
  • 추상 클래스에선 추상 메서드를 선언 가능
  • 메서드의 선언부만 있고 실행 내용이 없는 메서드
  • 메서드 선언에 abstract 키워드를 사용하고 중괄호가 없음
profile
Record Everything!!

0개의 댓글