1. 상속(Inheritance) 이란?
- 새로 설계(생성)하고자 하는 클래스가 이미 설계되어 있는 다른 클래스의 기능과 중복되는 경우 이미 설계된 클래스의 일부분이나 전체 구조를 공유할 수 있도록 하는 기능.
- 즉, 상속은 객체를 좀 더 쉽게 만들 수 있는 고수준의 재사용성(reusablility)을 확보하고 객체간의 관계를 구성함으로써 객체 지향의 또 다른 특징인 다향성의 문법적 토대가 됨
- 상속은 기존 프로그램의 클래스 내용을 공유함으로써 중복된 코드들을 재작성할 필요 없이 반복적이고 세부적인 작업을 처리하지 않기 때문에 프로그램을 작성하는 시간을 절약할 수 있고 유지보수를 편리하게 할 수 있으며, 프로그램의 길이도 짧아짐
- 이미 작성된 프로그램들은 앞서 테스트되었기 때문에 오류를 줄일 수 있어 현재 작성 중인 프로그램에만 전념가능
- 자바는 다중상속(자식 입장에서 부모 여러명)을 지원하지 않기 때문에 두 개 이상의 클래스로부터 상속불가능. 즉, 자바는 단일상속만 지원함
- 형식 :
class 자식클래스 extends 부모클래스{ }
부모 클래스 == 상위 클래스 == 슈퍼(super) 클래스 == 상속하는 클래스
자식 클래스 == 하위 클래스 == 서브(sub) 클래스 == 상속받는 클래스
· 예시 : 이름이 같은 변수를 상속받는 경우
class SuperTest114
{
protected int a = 10;
}
class SubTest114 extends SuperTest114
{
protected int a = 100;
}
// main() 메소드를 포함하는 외부의 다른 클래스
public class Test114
{
public static void main(String[] args)
{
// 하위 클래스(SubTest114) 인스턴스 생성
Test114 ob = new Test114();
System.out.println(ob.b);
//--==>> 100
System.out.println(((SuperTest114)ob).b); //-- 자식 객체의 부모를 부름
//--==>> 10
// ※ 슈퍼부름~!!!
}
}
→ 주의사항 : 상위 객체를 생성한 후 상위 객체가 하위 객체의 멤버에 접근하는 것은 불가능함 (상위 객체 입장에서는 어떤 하위 객체가 존재하는지도 알 수 없음)
2. 상속과 생성자
- 자식 클래스 생성자 안에는 부모 클래스 생성자 호출 구문이 자동 삽입됨
- 자식 클래스의 인스턴스 생성시 가장 먼저 부모클래스의 생성자가 실행됨. 이는 초기화되지 않은 멤버 변수가 상속되는 것을 막기 위함임
- private 멤버, 부모클래스의 생성자 등은 상속되지 않음
super는 static 으로 선언되지 않은 메소드에서 사용되며, 현재 클래스가 상속받은 상위 클래스의 객체를 가리킴. 상위 클래스의 생성자를 호출하거나 상위 클래스의 멤버변수 또는 메소드를 호출할 때 사용가능
class SuperTest111
{
// 생성자
SuperTest111()
{
System.out.println("Super Class...");
}
}
public class Test111 extends SuperTest111
{
// 생성자
Test111()
{
//super(); //-- 자동 삽입
System.out.println("Sub Class...");
}
public static void main(String[] args)
{
// Test111 (자식) 클래스 기반 인스턴스 생성
Test111 ob = new Test111();
//--==>> Super Class...
// Sub Class...
}
}
3. 메소드 오버라이딩 (메소드 재정의)
- 상위 클래스를 상속받은 하위 클래스에서 상위 클래스에 정의된 메소드를 다시 정의하는 것(재정의)이며, 객체 지향 프로그래밍의 특징인 다형성을 나타냄
- 오버라이딩하면 다시 전으로 되돌리는 것은 불가능
- 재정의(Overriding)는 반드시 상속관계에 있어야 하며 메소드 이름, 리턴 타입, 매개변수의 갯수나 타입이 모두 완전히 일치해야 함
- 재정의된 하위 클래스의 메소드 접근제어지시자는 상위 클래스의 메소드 접근제어지시자보다 범위가 크거나 같아야 함. 예를 들어, 상위 클래스 메소드의 접근제어지시자가
protected인 경우에, 하위 클래스가 이 메소드를 오버라이딩 하는 경우 접근제어지시자는public또는protected이어야 함 static(먼저 메모리에 퍼올려짐),final(값을 고정하는 변수의 상수화),private(접근과 상속이 불가)은 오버라이딩 할 수 없음- 상위 메소드가 가지고 있는 기존의 예외 사항에 새로운 Exception을 추가하는 것은 불가능
@Override //-- 어노테이션
public void write()
{
System.out.println("메소드 오버라이딩");
}
→ 어노테이션(annotation) : metadata의 일종이며, JDK 1.5부터 사용가능. 데이터를 수식하는 데이터이며, 자바에게 전달되는 주석임
4. 객체의 타입 변환
4-1. 묵시적 타입 변환 (업 캐스팅)
- 자식 객체를 부모 타입의 참조 변수에 할당하는 것
// 방법① : 하위 클래스 기반 인스턴스 생성 → 업 캐스팅
SubTest116 ob1 = new SubTest116();
SuperTest116 ob2 = ob1;
//SuperTest116 ob2 = (SuperTest116)ob1;
// 방법② : 하위 클래스 기반 인스턴스 생성 후 업 캐스팅
SuperTest116 ob2 = new SubTest116();
4-2. 명시적 타입 변환 (다운 캐스팅)
- 묵시적 타입 변환된 객체를 다시 원래의 타입으로 변환하는 것
// 업 캐스팅된 객체를 다시 원래 타입으로 변환(다운캐스팅)
SubTest116 ob3 = (SubTest116)ob2
4-3. 타입 변환이 불가능한 경우
// 상위 클래스 기반 인스턴스 생성
SuperTest116 ob3 = new SuperTest116();
SubTest116 ob4;
//ob4 = ob3;
//--==>> 에러 발생(컴파일 에러)
//-- 상위 객체는 하위 객체에 담을 수(참조할 수) 없음
//ob4 = (SubTest116)ob3;
//--==>> 에러 발생(런타임 에러)
//-- 작성된 구문의 문법적인 구조만 봤을 때 이 구문은 다운 캐스팅이 이루어지는 상황
// 하지만, 정상적인 캐스팅이 이루어지지 않음
// 현재 SubTest116 객체에 대한 메모리 할당은 이루어지지 않은 상태이기 때문
// => 부모클래스 인스턴스 생성으로 메모리에 퍼올려질 때 자식은 절대 함께 메모리에 함께 퍼올려질 일이 없음'Java' 카테고리의 다른 글
| [JAVA] Chapter 9. JDBC 개념 (0) | 2023.12.05 |
|---|---|
| [JAVA] Chapter 7. 추상클래스와 인터페이스 (0) | 2023.11.07 |
| [JAVA] Chapter 5. 객체와 클래스 (0) | 2023.11.07 |
| [JAVA] Chapter 4. 배열 (0) | 2023.11.07 |
| [JAVA] Chapter 3-3. 이동 제어문 (0) | 2023.11.07 |