목표
자바의 상속에 대해 학습하세요.
목차
1. 자바 상속의 특징
2. super 키워드
3. 메소드 오버라이딩
4. 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
5. 추상 클래스
6. final 키워드
7. Object 클래스
1. 자바 상속의 특징
상속이란 부모 클래스의 멤버를 자식 클래스가 사용할 수 있는 것.
클래스의 간결화로 멤버의 중복 작성이 불필요하다.
클래스 관리가 용이하다.
클래스 재사용과 확장이 용이해 소프트웨어 생산성이 향상된다.
부모클래스=슈퍼클래스=상위클래스
자식클래스=서브클래스=하위클래스
(1) 상속 특징
- extends 예약어로 상속을 지정할 수 있다.
- 하나의 부모 클래스는 여러 개의 자식 클래스를 가질 수 있다.(여러개의 부모는 안 된다=> 다중상속×)
- 부모 클래스의 private 멤버는 자식이 물려받을 수 없다. (public, protected는 가능)
- 부모와 자식이 서로 다른 패키지에 있다면 부모의 default 멤버를 물려받을 수 없다.
- 부모가 상속받은 자원를 자식이 사용 가능하다.
- 자식은 또 다른 클래스의 부모가 될 수 있다.
- 부모에게 물려받은 자원을 오버라이딩할 수 있다.
// 부모 클래스
public class Parent{
}
// 자식 클래스. extends를 통해 부모클래스를 상속받고 있다
public class Child extends parent{
}
2. super 키워드
(1) super
자식 클래스가 부모 클래스에서 상속받은 멤버를 참조할 때 사용하는 참조변수
클래스에서 멤버변수와 지역변수 이름을 구분하기 위해 this를 사용한다.
부모 클래스와 자식 클래스의 멤버 이름이 같을 경우 super를 사용한다.
class JavaSuper {
public static void main(String[] args) {
Child child = new Child();
child.childMethod();
}
}
class Parent {
int x = 100;
}
class Child extends Parent {
int x = 200;
void childMethod() {
System.out.println("x=" + x); // x=200
System.out.println("this.x=" + this.x); // this.x=200
System.out.println("super.x=" + super.x); // super.x=100
}
}
(2) super()
부모 클래스의 생성자를 호출하는 메소드
상속에서 생성자는 상속되지 않으므로, 부모 클래스의 멤버를 초기화하기 위해서 부모 클래스의 생성자를 호출해야 한다.
→ 자식 클래스 생성자를 호출할 때 부모 클래스 생성자도 동시에 호출 (컴파일러가 자동으로 super() 메소드를 추가해준다.)
기본 생성자가 아닌 매개변수를 가지는 생성자를 만들 때 사용한다.
class Parent{
int a;
public Parent(){
a=100;
}
public Parent(int n){
a=n;
}
}
class Child extends Parent{
int num;
public Child(int x){
super(x); // 무조건 첫번째 줄
num=200;
}
public void print(){
System.out.println(a); // 300
System.out.println(num); // 200
}
}
public class JavaSuper{
public static void main(String[] args){
Child c = new Child(300);
c.print();
}
}
3. 메소드 오버라이딩
(1) 다형성(Polymorphism)
같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것
- 오버라이딩
- 오버로딩
오버로딩(Overloading) vs 오버라이딩(Overriding)
오버로딩: 같은 이름의 메소드가 여러개. 매개변수의 유형과 개수가 다름.
오버라이딩: 상위 클래스의 메소드를 하위 클래스에서 재정의
(2) 오버라이딩
부모 클래스에서 선언된 메소드와 이름, 리턴 타입, 매개변수가 같은 메소드를 자식 클래스에서 다시 작성하는 것
class Parent{
public void print(){
System.out.println("Hello Java");
}
}
class Child extends Parent {
public void print(){ // 오버라이딩. 부모클래스의 메소드와 이름, 리턴값, 매개변수가 동일.
System.out.println("Overriding");
}
}
public class JavaTest{
public static void main(String[] args){
Child c = new Child();
c.print(); // Overriding
}
}
4. 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
디스패치
어떤 메소드를 호출할 것인지 결정하는 과정
(1) 정적 디스패치(Static Dispatch)
컴파일 할 때 컴파일러가 어떤 메소드를 호출해야 하는 지 안다. 바이트코드로 남는다.
ex. 메소드 오버로딩, 오버라이딩
class Parent{
public void print(){
System.out.println("Hello Java");
}
}
class Child extends Parent {
public void print(){ // 오버라이딩. 부모클래스의 메소드와 이름, 리턴값, 매개변수가 동일.
System.out.println("Overriding");
}
}
public class JavaTest{
public static void main(String[] args){
Child c = new Child();
c.print(); // Overriding
}
}
오버라이딩 된 메서드 print()를 호출할 것임을 알고 있음
(2) 동적 디스패치(Dynamic Dispatch)
컴파일 할 때 어떤 메소드를 호출해야 하는 지 모르고, 런타임 시점에서 할당된 객체의 타입을 보고 메소드를 실행한다.
ex. 인터페이스나 추상 클래스에 정의된 추상 메소드 호출
public abstract class Car{ // 추상 클래스
public String kind;
public void move(){
System.out.println("움직인다");
}
public abstract void break(); // 추상 메소드. 구현부가 없음.
}
public class Kia extends Car{
public Kia(){
this.kind="승용차";
}
@Override
public void break{
System.out.println("멈춘다");
}
}
public class JavaTest{
public static void main(String[] args){
Car c = new Kia(); // 추상 클래스를 상속받음
c.break();
}
}
추상 클래스를 상속받은 경우 컴파일 시점에서 어디에 있는 메소드를 실행할지 알 수 없다.
(3) 더블 디스패치(Double Dispatch)
동적 디스패치를 두 번 한다.
5. 추상 클래스
여러 클래스가 있을 때 클래스들의 비슷한 멤버를 추출해 만들어진 클래스
추상 클래스는 추상적이라 객체를 생성할 수 없다.
추상 클래스를 상속 받은 실체 클래스를 통해 객체를 생성.
public abstract class Car{ // 추상 클래스
public String kind;
public void move(){
System.out.println("움직인다");
}
public abstract void break(); // 추상 메소드. 구현부가 없음.
}
public class Kia extends Car{
public Kia(){
this.kind="승용차";
}
@Override
public void break{
System.out.println("멈춘다");
}
}
6. final 키워드
이 필드의 값을 변경할 수 없다. (상수가 된다.)
종류 | 의미 |
final 변수 | 값 변경 불가 |
final 객체 | 객체 변경 불가(변수는 변경 가능) |
final 메소드 | 오버라이딩 불가 |
final 클래스 | 상속 불가 |
7. Object 클래스
java.lang.Object 클래스는 모든 클래스의 최상위 클래스이며 모든 클래스는 Object 클래스를 상속받는다.
Object 클래스는 java.lang 패키지에 들어 있어서 컴파일러가 자동으로 넣어준다.
'자바 스터디' 카테고리의 다른 글
8주자 과제: 인터페이스 (0) | 2022.06.04 |
---|---|
7주차 과제: 패키지 (0) | 2022.06.04 |
5주차 과제: 클래스 (0) | 2022.05.20 |
4주차 선택 과제 0. JUnit 5 학습 (0) | 2022.05.19 |
4주차 과제: 제어문 (0) | 2022.05.19 |