상속
자바에서 상속이란 아래 클래스가 위 클래스를 상속받아 확장함(extend)을 뜻한다.
부모 클래스는 슈퍼 클래스(super class), 상속받는 자식 클래스를 서브 클래스(sub class)라 부른다.
상속을 선언할 때는 extends 키워드를 사용한다.
public class Person{
}
public class Student extends Person{
//Person을 상속받는 클래스 Student 선언
}
public class StudentWorker extends Student{
//Student를 상속받는 클래스 StudentWorker 선언
}
Student 클래스는 Person 클래스의 멤버를 물려받으므로, Person 클래스에 선언된 필드나 메소드를 다시 반복하여 작성할 필요가 없고, 필드나 메소드를 추가 작성하면 된다. StudentWorker가 Student를 상속받으면 Person 클래스의 멤버도 자동 상속받는다.
상속과 객체
상속에서 일차적으로 이해해야 하는 것은 바로 서브 클래스 객체의 모양이다.
class Point{
private int x, y;
public void set(int x, int y){
this.x = x; this.y = y;
}
public void showPoint(){
System.out.println("("+x+","+y+")");
}
}
class ColorPoint extends Point{
private String color;
public void setColor(String color){
this.color = color;
}
public void ShowColorPoint(){
System.out.println(color);
showPoint();
}
}
public class ColorPointEx{
public static void main(String []args){
Point p = new Point();
p.set(1,2);
p.showPoint();
ColorPoint cp = new ColorPoint();
cp.set(3,4);
cp.setColor("red");
cp.showColorPoint();
}
}
다음과 같은 코드를 통해 알아보자.
생성된 객체 p와 cp는 서로 별개의 객체이다. 객체 p는 Point 클래스의 멤버만 가지고, cp는 Point 클래스와 ColorPoint 클래스의 멤버 모두 가진다.
특히 주목할 부분은 cp 객체에 대한 접근이다. ColorPointEx 클래스의 main() 메소드에서는 cp 객체를 구성하는 ColorPoint 클래스의 public 멤버와 슈퍼 클래스인 Point 클래스의 public 멤버를 모두 접근할 수 있다. 그러나 x,y, color 필드는 private 속성이어서 접근할 수 없다.
즉, 서브 클래스는 슈퍼 클래스의 private 멤버를 제외하고 모든 멤버를 접근할 수 있다.
특징
1. 자바에서는 클래스의 다중 상속을 지원하지 않는다.
2. 자바에서는 상속의 횟수에 제한을 두지 않는다.
3. 자바에서 계층 구조의 최상위에 java.lang.Object 클래스가 있다.
생성자 호출 및 실행
- 서브 클래스의 생성자가 먼저 호출되지만, 결국 슈퍼 클래스의 생성자가 먼저 실행되고 서브 클래스의 생성자가 나중에 실행된다.
- 컴파일러는 서브 클래스의 생성자에 대해, 슈퍼 클래스의 생성자를 호출한 뒤 자신의 코드를 실행하도록 컴파일 한다.
서브 클래스에서 슈퍼 클래스 생성자 선택
- 서브 클래스에서 슈퍼 클래스의 생성자를 명시적으로 지정하지 않는 경우, 컴파일러는 자동으로 슈퍼 클래스의 기본 생성자를 호출하도록 컴파일 한다.
- 서브 클래스에서 슈퍼 클래스의 생성자를 선택하는 방법
- super() 이용
<슈퍼 클래스의 기본 생성자가 자동으로 선택되는 경우>
class A{
public A (int x){
System.out.println("생성자A");
}
}
class B extends A{
public B(){
System.out.println("생성자 B");
}
}
public class ExtendsEx{
public static void main(String[] args) {
B b;
b = new B();
}
}
위 코드처럼 슈퍼 클래스 A에 기본 생성자가 없는 경우 오류가 발생한다.
이 경우, 클래스 B의 생성자와 짝을 이룰 기본 생성자가 클래스 A에 없기 때문이다.
그렇다면 다음 경우는 어떨까.
class A{
public A (){
System.out.println("생성자A");
}
public A(int x){
System.out.println("매개변수 생성자 A");
}
}
class B extends A{
public B(){
System.out.println("생성자 B");
}
public B(int x){
System.out.println("매개변수 생성자 B");
}
}
public class ExtendsEx{
public static void main(String[] args) {
B b;
b = new B(5);
}
}
이 코드는 매개변수를 가진 생성자 B(int x)를 호출하며, 슈퍼 클래스 A에는 기본 생성자 A()가 호출된다.
즉!! 서브 클래스 B의 매개변수를 가진 생성자도 슈퍼 클래스 A의 기본 생성자와 짝을 이룬다.
<super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 선택>
class A{
public A (){
System.out.println("생성자A");
}
public A(int x){
System.out.println("매개변수 생성자 A" + x);
}
}
class B extends A{
public B(){
System.out.println("생성자 B");
}
public B(int x){
super(x);
System.out.println("매개변수 생성자 B" + x);
}
}
public class ExtendsEx{
public static void main(String[] args) {
B b;
b = new B(5);
}
}
서브 클래스의 생성자에 super()를 이용하면, 슈퍼 클래스 생성자를 명시적으로 선택할 수 있다.
super()는 슈퍼 클래스 생성자를 호출하는 코드이다.
중요한 점은 super()는 반드시 생성자의 첫 라인에 사용되어야 한다는 점이다.
'2-1 학기 > OOP' 카테고리의 다른 글
[JAVA] Wrapper 클래스 (0) | 2023.05.31 |
---|---|
[JAVA] Object 클래스 (0) | 2023.05.31 |
[JAVA] 메소드 오버라이딩(Method Overriding) (0) | 2023.05.30 |
[JAVA] 업캐스팅과 instanceof 연산자 (0) | 2023.05.23 |
[JAVA] 추상 클래스 vs. 인터페이스 (0) | 2023.05.23 |