Week 06
2022. 7. 16. 22:00
728x90
목표
자바의 상속에 대해 학습하세요.
학습할 것
- 자바 상속의 특징
- super 키워드
- 메소드 오버라이딩
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 추상 클래스
- final 키워드
- Object 클래스
1.자바 상속의 특징
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
# 상속
class Child extends Parent {
//...
}
위의 코드에서 Parent는 조상 클래스이고, Child는 자손 클래스이다.
자바 상속의 특징
1. 생성자와 초기화 블럭은 상속되지 않고 멤버만 상속된다.
2. 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
3. 다중 상속이 안 된다.(여러 조상 클래스를 둘 순 없다. 다만 하나의 조상 클래스가 여러 자손 클래스를 둘 순 있다.)
2.super 키워드
this 키워드 처럼 참조할 때 쓰거나 메서드 호출할 때 쓰는 키워드이다.
# super
1. 해당 키워드도 this처럼 참조변수로 쓸 때와
생성자로 쓸 때를 구분해서 써야 한다.
1)참조변수: this와 같다. 조상의 멤버와 자신의 멤버를 구별할 때 사용함.
2)생성자: 자손 클래스의 인스턴스를 생성하면 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성되는데,
조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
3.메소드 오버라이딩
상속받은 메서드의 내용을 변경하는 것이다.
# method overriding
메소드 오버라이딩은 **상속**받은 메서드의 내용을 변경하는 것이다.
class Point {
int x;
int y;
String getLocation() {
retrun "x :" + x + "y :" + y;
}
class Point3D extends Point {
int z;
String getLocation() { //오버라이딩
return "x :" + x + ", y :"+ y + ", z :" + z;
}
}
4.다이나믹 메소드 디스패치
dynamic은 runtime의 동의어로 사용되며, dispatch는 어떤 메소드를 호출할지 결정하는 것이다.
# dispatch
1. Static Dispatch: 컴파일 시점에서, 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고있는 경우
**Ex)**
public class ATaxi {
public void print() {
System.out.println("A");
}
}
public class BTaxi extends ATaxi { //메소드 오버라이딩 - ATaxi상속 후 함수 재정의
public void print() {
System.out.println("BTaxi");
}
}
public static void main(String[] args) {
BTaxi btaxi = new BTaxi();
System.out.println(btaxi.print()); //BTaxi를 출력.
}
// 위 코드처럼 함수를 오버로딩하여 사용하는 경우 인자의 타입이나 리턴 타입 등에 따라 어떤 메서드를 호출할지 알 수 있는 경우에는 컴파일러가 미리 알 수 있다.
2. Dynamic Dispatch:정적 디스패치와 반대로 컴파일러가 어떤 메서드를 호출하는지 모르는 경우이다. 동적 디스패치는 호출할 메서드를 런타임 시점에서 결정함
**Ex)**
public interface Taxi {
void print();
}
public class ATaxi implements Taxi {
@Override
public void print() {
System.out.println("A");
}
}
public class BTaxi implements Taxi {
@Override
public void print() {
System.out.println("BTaxi");
}
}
public static void main(String[] args) {
// 다이나믹 메소드 디스패치
Taxi taxi = new ATaxi();
System.out.println(animal.print());
}
인터페이스나 추상 클래스에 정의된 추상 메소드를 호출하는 경우에 컴파일러는 ATaxi가 생성됨을 알 수 없다.
런타임 전에는 객체가 생성되지 않고 객체 정보만 보유하기 때문이다. 그래서 Taxi가 정의한 print() 메소드만 접근 가능하다
5.추상 클래스
클래스가 설계도라면 추상 클래스는 미완성 설계도와 같다.
# abstract
abstract class Player { //play되고 있는 위치를 저장하기 위한 변수
int currentPos;
Player() { //추상클래스도 생성자가 있어야 함.
currentPos = 0;
}
**abstract void play(int Pos);** //선언부만 있고 구현부는 없는 추상 메서드
**abstract void stop();** //선언부만 있고 구현부는 없는 추상 메서드
****
void play() {
**play(currentPos);** //추상메서드 사용 가능
}
...
}
1. 추상클래스
1) 일반메서드가 추상메서드를 호출할 수 있다.(호출할 때 필요한 건 선언부)
2) 완성된 설계도가 아니기 때문에 인스턴스를 생성할 수 없다.
3) 다른 클래스 작성을 돕기 위한 목적으로 작성된다.
2. 추상메서드
1) 선언부만 있고 구현부는 없는 메서드
2) 메서드가 꼭 필요하지만, 자손마다 다르게 구현될 것으로 예상되는 경우에 사용한다.
3) 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야 함
6.final 키워드
마지막의, 변경될 수 없는 의미의 제어자
# final
final이 사용될 수 있는 곳은 클래스, 메서드, 멤버변수, 지역변수이다.
1) 클래스: 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
2) 메서드: 변경될 수 없는 메서드, fianl로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
3) 멤버변수&지역변수: 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
7.Object 클래스
모든 클래스의 최고 조상인 클래스
# object
1. 조상이 없는 클래스는 자동으로 Object클래스를 상속받게 된다.
2. 상속계층도의 최상위에는 Object클래스가 위치한다.
3. 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.(ex. toString(),equals(Object obj), hashCode(),...)
'Java & Spring > WhiteShip Study' 카테고리의 다른 글
Week 08 (0) | 2022.07.30 |
---|---|
Week 07 (0) | 2022.07.23 |
Week 05 (0) | 2022.07.09 |
Week 04 (0) | 2022.07.02 |
Week 03 (0) | 2022.06.25 |