[JAVA] 상속

2024. 11. 25. 00:17·Programming Language/자바(JAVA)

상속이란

부모 클래스의 필드, 메소드를 자식 클래스에게 물려주는 것

  • 클래스 이름 뒤에 extends 부모클래스로 상속 받을 부모 클래스를 설정
  • 상속은 한 부모 클래스로부터만 받을 수 있음
public class 자식클래스 extends 부모클래스 {}

부모 생성자 호출

자식 클래스의 객체를 생성하면 부모 객체가 먼저 생성된 다음 자식 객체가 생성된다.

  • super() 메소드로 부모 클래스의 생성자를 실행하여 부모 객체 생성
public 자식클래스(...) {
    super(); // 부모 객체 생성(생략 가능)
    ...
}
  • 부모 클래스에 기본 생성자가 없는 경우
    • super() 메소드에 인자를 넣음
public 자식클래스(...) {
    super(매개값, ...);
    ...
}

매소드 오버라이딩

부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용하는 것

  • 부모 메소드 선언부와 동일해야 함(리턴 타입, 메소드 이름, 매개변수)
  • 접근 제한 더 강하게 불가능(public -> private 불가능)
  • 새로운 예외를 throws 할 수 없음
  • 메소드 오버라이딩이 됐다면 자식 메소드를 우선적으로 사용
  • 메소드 오버라이딩을 하려면 부모 메소드 내용을 자식 메소드에 전부 작성해야 함
    • 부모 메소드 내용은 super()로 대신하고 나머지 내용만 추가
    • @Override: 컴파일 단계에서 정확히 오버라이딩 되었는지 체크하고, 문제 시 컴파일 에러 출력

final 클래스와 final 메소드

final을 붙이면 초기값 설정 후 변경할 수 없음
final을 클래스와 메소드에 붙인다면?

final 클래스

상속할 수 없는 클래스 -> 자식 클래스 만들 수 없음

final 메소드

오버라이딩 할 수 없는 메소드 -> 자식 클래스에서 메소드 재정의(오버라이딩)할 수 없음

protected 접근 제한자

같은 패키지 내에서는 모두 접근 가능(default) But 다른 패키지 내에서는 자식 클래스에서만 접근 가능

  • 필드, 생성자, 메소드 선언에 사용 가능(클래스 사용X)
  • ex. 다른 패키지이지만 package1의 클래스를 상속 받았기 때문에 protected 필드, 생성자, 메소드에 접근 가능
// package1
public class A {
    protected String field;        // 필드 선언
    protected A() {}            // 생성자 선언
    protected void method() {}    // 메소드 선언
}

// package2
import ch07.sec06.package1.A;

public class D extends A {
    public D() {
        super();    // A() 생성자 호출
    }

    public void method1() {
        // A 필드값 변경 및 메소드 호출 가능(상속)
        this.field = "value";
        this.method();
    }

    public void method2() {
    // 아래처럼 직접 객체 생성해서 사용하는 것은 불가
        // A a = new A();
        // a.field = "value";
        // a.method;
    }
}

`

타입 변환

자동 타입 변환

부모타입 변수 = 자식타입 객체;: 자식타입 객체가 부모타입 변수로 자동 타입 변환

 

class Animal {...}
class Cat extends Animal {...}

// Cat 객체를 Animal 타입으로 자동 타입 변환
// Cat 클래스의 고유한 필드와 메서드에 접근 불가능. 부모 클래스의 필드, 메서드만 접근 가능
Cat cat = new Cat();
Animal animal = cat;
// Animal animal = new Cat(); // 이것도 가능

cat == animal    // true

 

강제 타입 변환

자식타입 변수 = (자식타입) 부모타입객체;: 부모타입 객체를 자식타입 변수로 강제 타입 변환

  • 자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환 사용
Parent parent = new Child();    // 자동 타입 변환
Child child = (Child) parent;    // 강제 타입 변환

객체 타입 확인 - instanceof

instanceof 연산자를 통해 객체의 타입 확인

  • 객체 instanceof 타입;: 객체가 타입이면 true, 아니면 false
Parent parent1 = new Child(); // Child 객체 생성
Parent parent2 = new Parent(); // Parent 객체 생성

method(parent1); // true
method(parent2); // false

public void method(Parent parent) {
    // parent 매개변수가 참조하는 객체가 Child인지 조사
    // Child 타입이 아니라면 강제 타입 변환을 할 수 없기 때문
    if(parent instanceof Child) {
        Child child = (Child) parent;
        // child 변수 사용
    }
}

// Java 12부터는 instanceof 연산의 결과가 true일 경우 우측 타입 변수를 사용할 수 있기 때문에 강제 타입 변환 불필요
if(parent instanceof Child child) {
    // child 변수 사용
}

추상 클래스 - abstract

실체 클래스들의 공통 필드, 메소드 추출해서 만든 클래스

  • public abstract class 클래스명 {...}
  • 추상 클래스 상속받아 필드, 메소드 물려받는 용도
  • 추상 클래스 객체 생성 불가능(상속 용도로만 사용 - extends 뒤에만 옴)
public abstract class Phone {
    // 필드 선언
    String owner;

    // 생성자 선언
    Phone(String owner) {
        this.owner = owner;
    }

    // 메소드 선언
    void turnOn() {
        System.out.println("폰 전원을 켭니다.");
    }
    void turnOff() {
        System.out.println("폰 전원을 끕니다.");
    }
}

public class SmartPhone extends Phone {
    SmartPhone(String owner) {
        // Phone 생성자 호출
        super(owner);
    }

    void internetSearch() {
        System.out.println("인터넷 검색을 합니다.");
    }
}

public class PhoneExample {
    public static void main(String[] args) {
        // Phone phone = new Phone();    -> 불가
        SmartPhone smartPhone = new SmartPhone("홍길동");

        smartPhone.turnOn();            // 폰 전원을 켭니다.
        smartPhone.internetSearch();    // 인터넷 검색을 합니다.
        smartPhone.turnOff();            // 폰 전원을 끕니다.
    }
}

추상 메소드

메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우 사용

  • abstract 리턴타입 메소드명(매개변수, ...);
public abstract class Animal {
    public void breathe() {
        System.out.println("숨을 쉽니다");
       }
    public abstract void sound();
}

public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

봉인된 클래스

  • final 클래스를 제외한 모든 클래스는 부모 클래스가 될 수 있지만, Java 15부터는 무분별한 자식 클래스 생성 방지를 위해 봉인된(sealed) 클래스가 도입되었다.
// permits 키워드 뒤에 상속 가능한 자식 클래스 지정
public sealed class Person permits Employee, Manager {...}

봉인된 Person 클래스를 상속하는 Employee와 Manager는 final 또는 non-sealed 키워드로 선언하거나, sealed 키워드를 사용해서 또 다른 봉인 클래스로 선언
public final class Employee extends Person {...}
public non-sealed class Manager extends Person {...}

'Programming Language > 자바(JAVA)' 카테고리의 다른 글

[JAVA] 중첩 클래스, 중첩 인터페이스, 익명 객체  (0) 2024.11.25
[JAVA] 인터페이스  (0) 2024.11.25
[JAVA] 클래스 - 접근 제어자, final, static  (0) 2024.11.24
[JAVA] 참조 타입 - 문자열, 배열  (3) 2024.11.21
[JAVA] ArrayList, LinkedList 자료구조  (1) 2024.06.21
'Programming Language/자바(JAVA)' 카테고리의 다른 글
  • [JAVA] 중첩 클래스, 중첩 인터페이스, 익명 객체
  • [JAVA] 인터페이스
  • [JAVA] 클래스 - 접근 제어자, final, static
  • [JAVA] 참조 타입 - 문자열, 배열
토자맨
토자맨
  • 토자맨
    개발하는 토자맨
    토자맨
  • 전체
    오늘
    어제
    • 개발 공부
      • 코딩 테스트
        • 코드업 기초 100제
        • 백준
        • 99클럽
        • 자료구조
        • 알고리즘
      • Programming Language
        • 자바(JAVA)
      • Back-end
        • Spring
      • Front-end
        • html
        • css
      • DevOps
        • AWS
        • CI CD
        • Docker
        • 홈서버
        • Git
      • Computer Science
        • 자료구조
        • 알고리즘
        • 운영체제
        • OS,Network,DB,DesignPattern
      • 프로젝트
        • 웨이트 쇼핑몰
      • 공부 로드맵
        • 2학년 겨울방학
        • 3학년 2학기
        • 3학년 겨울방학
      • 일상
        • 기타 정보
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    피보나치 수 #백준 #dp
    이진탐색 #이분탐색 #알고리즘
    백준 #아기상어2 #bfs
    nvidia-docker #docker cuda #docker gpu #엔비디아 도커
    싱글톤 패턴 #싱글톤 컨테이너 #싱글톤 레지스트리 #싱글톤 객체 상태 #무상태 #stateless #유지상태 #staleful
    99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #til
    이진탐색 #이분탐색 #백준
    ec2 멈춤 #ec2 터짐 #ec2 ssh 연결 끊김 #ec2 끊김
    백준 #bfs
    백준 #dfs #알고리즘
    백준 #dfs #11725번
    오블완
    백준 #이진탐색 #이분탐색
    스프링핵심원리 #김영한 #의존관계자동주입 #의존관계 자동 주입
    nvidia container toolkit #
    스프링 #spring #스프링 컨테이너 #스프링 컨텍스트
    bfs #백준
    프로그래머스 #dfs
    bfs #프로그래머스
    solid #객체지향설계원칙
    백준 #dfs
    dp #백준 #동적계획법
    git filter-branch #commit 수정 #commit
    git filter-repo
    프로그래머스 #dp
    dfs #백준
    bfs #최단거리탐색 #프로그래머스
    티스토리챌린지
    dfs #알고리즘
    백준 #dp #동적계획법
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
토자맨
[JAVA] 상속
상단으로

티스토리툴바