[혼공자바] 4주차 공부기록(상속)

Say·2025년 7월 26일
0

상속

상속은 어떤 장점이 있는가?

  • 만들어진 클래스 재활용 → 중복 코드 줄여줌
  • 유지 보수 시간 최소화 가능

클래스 상속

class 자식클래스 extends 부모클래스 {
 // 필드
 // 생성자
 // 메소드
}

❗주의사항

  • 여러 개의 부모 클래스 상속 ❌
  • 부모 클래스 → private 접근 제한을 가지는 필드와 메소드는 상속 대상에서 제외!!

부모 생성자 호출

  • 내부적 → 부모 객체 먼저 생성 후 자식 객체 생성
  • 모든 객체 → 클래스의 생성자는 호출해야만 생성
    • 부모 객체를 생성 → 부모 생성자는 어디서 호출한 것일까?
      public 자식클래스() {
      	super();
      }
      super() → 부모의 기본 생성자 호출
      상황super 호출 여부
      부모 클래스에 기본 생성자만 있을 때자동 호출 → 생략 가능!
      부모 클래스에 명시적 생성자만 있을 때반드시 super() 명시해야 함

메서드 재정의

  • 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용해야함

✅ 메소드 재정의 방법

  • 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것을 뜻한다.
  • 규칙
    • 부모 메소드와 동일한 리턴 타입, 메소드 이름, 매개 변수 목록 가지기
    • 접근 제한 재정의 불가
    • 새로운 예외 throws 불가

✅ 부모 메서드 호출

  • super.부모메서드();

final 클래스와 final 메소드

  • ‘final’
    • 클래스, 필드, 메소드 선언 → 최종 상태. 수정 ❌
    • 클래스 선언 시 public final class.. 라고 선언 → 자식 클래스 생성 불가

타입 변환과 다형성

다형성?

  • 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질

자동 타입 변환

  • 타입 변환
    • 타입을 다른 타입으로 변환
    • 클래스 변환
      • 상속 관계에 있는 클래스 사이에서 발생
      • 자식 → 부모 타입으로 자동 타입 변환 가능

필드의 다형성

🤔 왜 자동 타입 변환이 필요할까?

필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기에!

매개 변수의 다형성

  • 매개 변수의 타입 → 클래스일 경우,
    • 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있음
    • 어떤 자식 객체를 사용하느냐에 따라 메소드의 실행 결과가 다양해짐!

강제 타입 변환

  • 부모 타입을 자식 타입으로 변환하는 것
  • 자식 타입이 부모 타입으로 자동 타입 변환 → 자식 타입으로 변환할 때 강제 타입 변환 사용 가능
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환

🚨 제약 사항

  • in 자동 타입 변환
    • 부모에 선언된 필드와 메서드만 사용 가능
    • 자식에 선언된 것을 사용하고 싶다면 → 강제 타입 변환 후 사용

추상 클래스

  • 클래스들의 공통적인 특성을 추출해서 선언한 클래스 → 추상 클래스
  • 객체를 직접 생성할 수 있는 클래스 → 실체 클래스

추상 클래스의 용도

🤔 공통적인 특성을 뽑아내서 추상 클래스로 만드는 이유는?

  • 공통된 필드와 메소드의 이름을 통일할 목적으로!
  • 공통적인 필드와 메소드는 추상 클래스에 선언해두고 다른 점만 실체 클래스에 선언하면 실체 클래스를 작성하는데 시간을 절약할 수 있다.

추상 클래스 선언

public abstract class 클래스 {
	// 필드
	// 생성자
	// 메소드

}

✅ 실체 클래스 생성

  • 추상 클래스 → 실체 클래스의 공통되는 필드와 메소드를 추출 ⇒ 객체 직접 생성 사용 ❌

    People say = new People(); // People이 추상 클래스라면 이렇게 사용할 수 없음.
    
    class Hong extends People { ... } // 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용된다. 

이를 활용한 추가 실습을 진행해보쟈.

추가 실습

public abstract class HttpServlet {
	public abstract void service();
}

HttpServlet 추상 클래스를 사용해서

public class HttpServletExample {
	public static void main(String[] args) {
		method(new LoginServlet());
		method(new FileDownloadServlet());
	}
	
	public static void method(HttpServlet servlet) {
		servlet.service();
	}
}


와 같은 이미지의 결과가 나오도록 LoginServlet와 FileDownloadServlet 클래스를 선언하자.

public class FileDownloadServlet extends HttpServlet {

    @Override
    public void service() {
        System.out.println("파일 다운로드합니다.");

    }
}
--------------------------------------------------------
public class LoginServlet extends HttpServlet {

    @Override
    public void service() {
        System.out.println("로그인 합니다.");
    }
}

HttpServlet를 상속한 후 추상 메소드인 service()를 재정의해서 원하는 로직을 작성하기만 하면 간단하게 구현할 수 있다-!

profile
Say Hi!

0개의 댓글