자바의 핵심 - 상속(2) super 와 final 예약어, 묵시적 명시적 타입변환

Yeppi's 개발 일기·2022년 5월 20일
0

JAVA

목록 보기
17/27

1. 생성자와 예약어

1) 생성자 연속 호출

자식 클래스의 객체 생성 시, 부모 클래스의 생성자가 먼저 실행되는 것

  • 부모의 멤버변수는 자식 클래스가 호출하기 전에, 꼭 초기화되어 있어야 함
public class 부모클래스 {
	부모클래스() {
    	System.out.println("부모 클래스 호출");
    }
}

public class 자식클래스 extends 부모클래스 {
	자식클래스() {
    	System.out.println("자식 클래스 호출");
    }
}
public static void main(String[] args) {
	new 자식클래스();
}

출력결과

부모클래스 호출
자식클래스 호출


2) super() 생성자

부모 생성자 호출

🍑 this. VS super() 🍑

  • this() ⇒ 같은 클래스 내 또 다른 생성자 호출
  • super() ⇒ 상속 받는 부모의 생성자를 호출

super() 사용하기

  • 원래, 기본적으로 부모의 기본 생성자가 자동 호출
  • 부모 클래스에 기본 생성자가 없다면?
    super() 로 특정 생성자를 명시적으로 호출


3) super 예약어

  • 부모 클래스의 멤버변수나 메서드를 참조할 때 사용
  • 오버라이딩되어 상속되지 않은 경우
    → 부모 클래스에 접근할 때 super. 사용


4) final 예약어

final 멤버변수 ⇒ 상수

final String name = "yeppi";
  • 값 한번 세팅하면 다른 값 할당 불가⇒ 최초의 값 딱 한번만 할당 가능
  • 멤버 변수 앞에 사용 → 멤버변수는 상수

final 메소드 ⇒ 오버라이딩 불가

final String printInfo() { . . . }
  • 해당 메소드는 자식 메소드가 오버라이딩 불가
  • 무조건 상속해서 쓰라는 뜻
  • 메서드 앞에 사용 → 메서드 오버라이딩

final 클래스 ⇒ 확장 불가

public final class Student { . . . }
  • 클래스는 더이상 확장 불가
  • 상속이 불가능한 클래스가 됨
  • 클래스 앞에 사용 → 상속(extends) 금지

📌 여러 자바 파일에서 사용하는 상수 값 정의 📌

  • 필요한 상수값이나 string들을 한곳에 모아두면, 나중에 new하지 않고 바로 클래스명.값 으로 사용 가능
public class Define {
	public static final int MIN = 1;
	public static final double PI = 3.14;
	public static final String GREETING = "Good Morning!";

}
public class UsingDefine {

	public static void main(String[] args) {

		System.out.println(Define.GREETING);
		System.out.println(Define.MIN);
		System.out.println("원주률은" + Define.PI + "입니다.");
	}

}
  • 위 방법 외, 이뉴머레이션(Enumeration, 상수들의 집합) 이라는 방법으로도 사용 가능


2. 객체 타입 변환

1) 묵시적 타입 변환

자식 객체를 부모 타입의 참조변수에 할당하는 것

  • 반대로, 부모 객체를 자식 타입의 참조변수에 할당하는 것은 불가능
  • 부모 타입 > 자식 타입
    원래 객체의 크기보다 훨씬 적은 공간에 할당하려고 하면
    '데이터가 잘리기 때문'

📌 예시 📌

  • 종속 관계에 따른 타입 변환
    • 형제 레벨에서 형 변환 불가
형 a = new 동생(); // 형제 레벨에서는 불가능
아버지 b = new 아들(); // 부모에 자식을 할당 가능
아들 c = new 할아버지(); // 자식에 부모는 할당 불가능

  • 객체를 배열같은 컬렉션에 저장
    • 종류가 다른 객체를 하나의 배열에 집어 넣어서 사용
      👉 묵시적 형변화 사용 이유
// a 타입의 객체 3개를 저장할 수 있는 배열 생성
a[] aList = new 사람[3];

// 배열 초기화
a[0] = new 사람();
a[1] = new 아버지();
a[2] = new 아들();
// Human 타입의 객체 4개를 저장할 수 있는 배열 생성 및 초기화
a[] aList = {new 사람(), new 아버지(), new 아들()};


2) 명시적 타입 변환

묵시적 타입 변환이 된 객체를 원래의 타입으로 다시 변환하는 것

📌 예시 📌

  • 부모(person)을 자식 타입(아들)로 강제 형변환
아버지 a = new 아들();
아들 yeppi = (아들) person; 
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글