25.02.25 (화) 12일차 Java

허배령·2025년 2월 25일

괴발개발 TIL

목록 보기
12/54

상속 (Inheritance)

  • 부모로부터 자식이 물려받음
  • 자바에서는 부모객체, 자식객체로 생각하기
  • 자바에서의 상속 : 부모객체가 가지고 있는 속성과 기능을 자식객체한테 물려주는 것
  • 자식객체 : 자신만의 속성, 기능 + 부모의 속성, 기능 둘 다 사용 가능
  • 다른 클래스가 가지고 있는 멤버(필드, 메소드)(=> 부모)들을 새로 작성할 클래스(=> 자식)에서
    직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능

상속의 장점

  • 보다 적은 양의 코드로 새로운 클래스 작성 가능
  • 코드의 추가 및 변경 용이
  • 중복을 제거하여 프로그램의 생산성과 유지보수에 기여

방법

  • 클래스 간의 상속 시에는 extends 키워드 사용

표현식

[접근제한자] class 클래스명 extends 클래스명 {}

public class Academy extends Company {}
			    ㄴ 자식         ㄴ 부모
      // Academy 클래스에 Company 클래스 내용을 확장/연장한다
      // == Academy 클래스에 Company 클래스의 필드, 메서드를 추가하여 확정한다

단일상속

  • 클래스간의 관계가 다중상속보다 명확하고 신뢰성 있는 코드 작성
  • 자식클래스는 하나의 부모클래스만 가짐
  • 자바에서는 다중상속 미지원 -> 단일상속만 지원

다중상속

  • C++에서 가능한 기능
  • 복합적인 기능을 가진 클래스를 쉽게 작성 가능
  • 서로 다른 클래스로부터 상속 받은 멤버 간의 이름이 같은 경우 문제 발생

상속의 특징

1. 모든 클래스는 Object 클래스의 후손

  • 모든 클래스의 최상위 부모
  • class 선언부에 상속 구문이 하나도 작성되어있지 않다면,
    컴파일러가 extends Object 구문을 자동으로 추가해 준다
  • Object 클래스가 제공하는 메서드를 오버라이딩하여 메서드 재구현 가능
    ex) java.lang.String 클래스의 equals()와 toString()

2. 부모클래스의 생성자, 초기화 블록은 상속 안 됨

  • 자식클래스 생성 시, 부모클래스 생성자가 먼저 실행
  • 자식클래스 생성자 안에서 부모클래스 생성자 호출을 명시하고 싶으면 super()활용
  • 부모생성자 호출 -> 부모객체 먼저 생성
    자식생성자 호출 -> 자식객체 생성 -> 이때 자식객체 안쪽에 부모객체 포함

3. 부모의 private멤버는 상속은 되지만 직접접근 불가

  • 자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가
  • super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나
    setter, getter 메소드를 이용하여 접근

상속이 되면

// 상속 방법 : 자식  extends  부모
public class Student extends Person {
	// Student 클래스에 Person 클래스 내용을 확장/연장 한다
	// == Student 클래스에 Person 클래스의 필드, 메서드를 추가하여 확정한다
	
	
	
	
	
	// 속성(필드)
	// Person 클래스와 겹치는 부분은 필요없어 지게 됨
/*	private String name;			// 이름
	private int age;				// 나이
	private String nationality;		// 국적
*/	private int grade;				// 학년
	private int classRoom;		// 반
	
	public Student() {}
	
	
	
	public Student(String name, int age, String nationality, int grade, int classRoom) {
		
		//this.name = name;
		//this.age = age;
		//this.nationality = nationality;
		// 왜 안될까?
		// -> this 참조변수는 본인 자신만을 의미함 (Student만)
		// -> 상속을 받았어도 name, age, nationality는
		// 부모의 고유 필드이기 때문에
		// 자식인 Student에서 this 참조변수를 이용해 직접접근 불가
		
/*		setName(name);
		setAge(age);
		setNationality(nationality);
*/		// 부모의 setter를 이용을 할 수는 있지만 비효율적
		
		// super(); : 부모의 기본생성자
		// super(매개변수...); : 부모의 매개변수생성자
		super(name, age, nationality); // Person의 매개변수생성자 의미
		this.grade = grade;
		this.classRoom = classRoom;
		
		// 부모의 고유필드는 super로, 자식의 고유필드는 this로
	}

super()와 super.

super() (super 생성자)

  • 부모객체의 생성자를 호출하는 메서드
  • 후손클래스 생성자 안에는 부모생성자를 호출하는 super()가 첫 줄에 존재
  • 매개변수 있는 부모생성사 호출은 super(매개변수, 매개변수)를 넣으면 됨
  • super(); : 부모의 기본생성자
  • super(매개변수...); : 부모의 매개변수생성자

super. (참조변수)

  • 자식클래스 정의 시 해당 자식 클래스의 부모객체를 가리키는 참조변수
  • 자식 클래스 내에서 부모 클래스 객체에 접근하여 필드나 메소드 호출 시 사용

오버라이딩 (Overriding)

  • 자식클래스가 상속 받은 부모메서드를 재작성 하는 것
  • 부모가 제공하는 기능을 후손이 일부 교쳐 사용하겠다는 의미로
    자식객체를 통한 실행 시 후손 것이 우선권을 가짐

오버라이딩 특징

  • 메소드 헤드라인 위에 반드시 Annotation, @Override 표시
  • 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 가능 ex) default -> public
  • 부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정 가능

@Override , Annotation

해당 메서드가 오버라이딩 되었음을 컴파일러에게 알려주는 역할

  • 컴파일러에게 문법체크를 하도록 알린다
  • 부모에게 해당 메서드가 있는지 체크
  • 이름, 매개변수 타입과 개수, 순서가 일치하는 여부 검사

오버라이딩 성립 조건

부모 클래스의 메소드와 자식 클래스의 메소드 비교

  • 메소드 이름 동일
  • 매개변수의 개수, 타입, 순서 동일
  • 리턴 타입 동일 ex) String, int 등
  • private 메소드 오버라이딩 불가

오버라이딩과 오버로딩

final 예약어

final 클래스

상속불가 (누군가의 부모가 될 수 없다)
제공되는 클래스 그대로 사용해야 하는 경우 ex) String 클래스

상속이 불가능한 클래스
public final class finalClass {}
public final class Employee extends Person {}

final 메소드

오버라이딩 불가 - 메서드의 기능이 변하면 안되는 경우

상속 시 오버라이딩이 불가능한 메소드
public final void onlyEmployee() {}

final 메서드 오버라이딩 불가 확인
@Override
	public void onlyEmployee() {
		// Cannot override the final method from Employee
profile
인생은 변수

0개의 댓글