class 자식클래스이름 extend 부모클래스이름 { ... }
1) 상속의 개념
상속(inheritance)이란?
상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미
상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나
상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있음
기존에 정의되어 있던 클래스를 부모 클래스(parent class) ,상위 클래스(super class), 기초 클래스(base class)라고 함
상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class), 하위 클래스(sub class), 파생 클래스(derived class)라고 함
상속의 장점
1. 기존에 작성된 클래스를 재활용할 수 있음
2. 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않 아도 됨
3. 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련
자식 클래스(child class)
자식 클래스(child class)란 부모 클래스의 모든 특성을 물려받아 새롭게 작성된 클래스를 의미
class 자식클래스이름 extend 부모클래스이름 { ... }
자식 클래스에는 부모 클래스의 필드와 메소드만이 상속되며, 생성자와 초기화 블록은 상속되지 않음
부모 클래스의 접근 제어가 private이나 default로 설정된 멤버는 자식 클래스에서 상속받지만 접근할 수는 없음
class Parent {
private int a = 10; // private 필드
public int b = 20; // public 필드
}
class Child extends Parent {
public int c = 30; // public 필드
void display() {
① // System.out.println(a); // 상속받은 private 필드 참조
② System.out.println(b); // 상속받은 public 필드 참조
③ System.out.println(c); // 자식 클래스에서 선언한 public 필드 참조
}
}
public class Inheritance01 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
Object 클래스
자바에서 Object 클래스는 모든 클래스의 부모 클래스가 되는 클래스
자바의 모든 클래스는 자동으로 Object 클래스의 모든 필드와 메소드를 상속받음
자바의 모든 클래스는 별도로 extends 키워드를 사용하여 Object 클래스의 상속을 명시하지 않아도 Object 클래스의 모든 멤버를 자유롭게 사용할 수 있음
2) super와 super()
super 키워드
super 키워드는 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수
부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있음
this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없음
class Parent { int a = 10; }
class Child extends Parent {
void display() {
System.out.println(a);
System.out.println(this.a);
System.out.println(super.a);
}
}
public class Inheritance02 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
class Parent {
int a = 10;
}
class Child extends Parent {
int a = 20;
void display() {
System.out.println(a);
System.out.println(this.a);
System.out.println(super.a);
}
}
public class Inheritance03 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
super() 메소드
this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면, super() 메소드는 부모 클래스의 생성자를 호출할 때 사용
자식 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 자식 클래스의 고유 멤버뿐만 아니라 부모 클래스의 모든 멤버까지도 포함되어 있음
따라서 부모 클래스의 멤버를 초기화하기 위해서는 자식 클래스의 생성자에서 부모 클래스의 생성자까지 호출해야만 함
class Parent {
int a;
Parent(int n) { a = n; }
}
class Parent {
int a;
Parent(int n) { a = n; }
}
class Child extends Parent {
int b;
Child() {
super();
b = 20;
}
class Parent {
int a;
Parent() { a = 10; }
Parent(int n) { a = n; }
}
class Child extends Parent {
int b;
Child() {
super();
b = 20;
}
class Parent {
int a;
Parent() { a = 10; }
Parent(int n) { a = n; }
}
class Child extends Parent {
int b;
Child() {
① //super(40);
b = 20;
}
void display() {
System.out.println(a);
System.out.println(b);
}
}
public class Inheritance04 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
3) 메소드 오버라이딩
메소드 오버라이딩(method overriding)
오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것
메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미
오버라이딩의 조건
1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 함
하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경 가능
2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없음
3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없음
메소드 오버라이딩
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
}
public class Inheritance05 {
public static void main(String[] args) {
Parent pa = new Parent();
pa.display();
Child ch = new Child();
ch.display();
Parent pc = new Child();
pc.display(); // Child cp = new Parent();
}
}
오버로딩과 오버라이딩
오버로딩(overloading)은 새로운 메소드를 정의하는 것
오버라이딩(overriding)은 상속받은 기존의 메소드를 재정의하는 것
// 부모 클래스인 Parent 클래스의 display() 메소드를
// 자식 클래스인 Child 클래스에서 오버라이딩과 오버로딩을 둘 다 수행하는 예제
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
// 오버라이딩된 display() 메소드
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
void display(String str) { System.out.println(str); } // 오버로딩된 display() 메소드
}
public class Inheritance06 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
ch.display("오버로딩된 display() 메소드입니다.");
}
}
출처 : http://www.tcpschool.com/
댓글