///////
Search

11_상속_장서현

상속에 대한 이해

상속이란?

상위 클래스를 다른 말로 수퍼 클래스(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 키워드
부모 클래스를 상속 받은 자식 클래스가 다른 패키지에 있더라도 접근할 수 있도록 선언하는 키워드