상속에 대한 이해
상속이란?
상위 클래스를 다른 말로 수퍼 클래스(Super class), 하위 클래스를 서브 클래스(Sub class)라고도 한다.
상속 문법
1.
Car - SportsCar 예제
public class Car {
int speed; //속도
public void setSpeed(int speed) { //속도 변경 메서드
this.speed = speed;
}
}
Java
복사
public class SportsCar extends Car{
boolean turbo; //추가된 필드
public void setTurbo(boolean flag) { //터보 모드 설정 메서드 => 추가된 메서드
this.turbo = turbo;
}
}
Java
복사
public class SportsCarTest {
public static void main(String[] args) {
SportsCar sc = new SportsCar(); //자식 클래스 객체 생성
sc.speed = 10; //부모 클래스의 필드와
sc.setSpeed(60); //메서드 사용
sc.setTurbo(true); //자체 메서드 사용
}
}
Java
복사
2.
Car - ElectricCar 예제
public class Car {
int speed;
public void setSpeed(int speed) {
this.speed = speed;
}
}
Java
복사
public class ElectricCar extends Car {
int battery;
public void charge(int amount) { //충전 메서드
battery += amount;
}
}
Java
복사
public class ElectricCarTest {
public static void main(String[] args) {
ElectricCar ec = new ElectricCar();
ec.speed = 10; //부모 멤버 사용
ec.setSpeed(60); //부모 멤버 사용
ec.charge(10); //추가된 메서드 사용
}
}
Java
복사
상속을 하는 이유
•
아래의 이미지를 통해 상속이 왜 필요한지 알아보자.
1.
상속을 활용하지 않은 경우 ⇒ 코드에 중복이 발생한다.
2.
상속을 활용한 경우 ⇒ 코드 중복을 없앨 수 있다.
•
상속을 사용하면 중복되는 코드를 줄일 수 있다.
•
상속을 받음으로써 이미 존재하는 클래스의 필드와 메서드를 재사용할 수 있다.
상속과 생성자
•
예제
class A {
public A() {
System.out.println("A 생성자 호출");
}
}
class B extends A {
public B() {
System.out.println("B 생성자 호출");
}
}
class C extends B {
public C() {
System.out.println("C 생성자 호출");
}
}
public class ConstructorEx {
public static void main(String[] args) {
//A a = new A();
//B b = new B();
C c = new C();
}
}
Java
복사
◦
왜 자식 객체 생성시 부모 생성자까지 호출될까?
: 자식 클래스 객체 안에는 부모 클래스에서 상속된 부분이 들어 있다. 따라서 자식 클래스 안의 부모 클래스 부분을 초기화하기 위해 부모 클래스의 생성자도 호출되는 것이다.
생성자 호출 순서: (부모 클래스의 생성자) → (자식 클래스의 생성자) 순
생성자 호출: super()
•
명시적인 생성자 호출: super()를 호출하면 부모 클래스 생성자가 호출된다.
class A {
public A() {
System.out.println("A의 생성자");
}
}
class B extends A {
public B() {
super();
System.out.println("B의 생성자");
}
}
public class ConstructorEx {
public static void main(String[] args) {
B b = new B(); //super()를 호출함으로써 "A의 생성자"도 출력된다.
}
}
Java
복사
•
묵시적인 생성자 호출: 컴파일러가 부모 클래스의 기본 생성자를 자동으로 호출한다.
컴파일러가 자동으로 호출해주는 것:
class A {
//public A() { //class A의 기본 생성자
//}
}
class B extends A {
//public B() { //class B의 기본 생성자
//super(); //부모 생성자
//}
}
public class ConstructorEx {
public static void main(String[] args) {
B b = new B();
}
}
Java
복사
•
부모 클래스 생성자 선택
부모 클래스에 생성자가 여러개인 경우 ⇒ 인수 형태에 따라 적절한 생성자가 선택된다.
ex)
class A {
int x, y;
public A() {
System.out.println("A의 기본 생성자");
}
public A(int x, int y) {
this.x = x;
this.y = y;
System.out.println("A의 x, y를 매개변수로 받는 생성자");
}
}
class B extends A {
int z;
public B(int x, int y, int z) {
super(x, y); //"A의 x, y를 매개변수로 받는 생성자"가 선택된다.
this.z = z;
}
}
Java
복사
•
오류가 발생하는 경우
class A {
public A() { //So, 없으면 컴파일 오류 발생
System.out.println("A의 생성자");
}
public A(int a, int b) {
System.out.println(a + b);
}
}
class B extends A {
public B() {
super(); //매개변수가 없으므로 부모 클래스의 기본 생성자가 선택된다.
System.out.println("B의 생성자");
}
}
public class ConstructorEx {
public static void main(String[] args) {
B b = new B();
}
}
Java
복사
•
protected 키워드
부모 클래스를 상속 받은 자식 클래스가 다른 패키지에 있더라도 접근할 수 있도록 선언하는 키워드