- 해당 내용은 백기선 님의 자바 온라인 스터디 공부 및 제출 목적
-> https://github.com/whiteship/live-study/issues/6
목표
- 자바의 상속에 대해 학습하세요.
학습할 것 (필수)
- 자바 상속의 특징
- super 키워드
- 메소드 오버라이딩
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 추상 클래스
- final 키워드
- Object 클래스
1. 자바 상속의 특징
1.1 상속이란?
- 부모클래스의 변수와 메소드를 물려받는 것.
- 상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성.
- 새로운 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 'extends'와 함께 작성하여 사용된다.
- 상속 받는 클래스 = 하위클래스 = 자식클래스 = 서브클래스
- 상속 해주는 클래스 = 상위클래스 = 부모클래스 = 슈퍼클래스
// 부모클래스(Fruit) 자식클래스(Banana)
class Banana extends Fruit{
...
}
1.2 자바 상속의 특징
- 다단계 상속이 가능하지만, 다중 상속을 지원하지 않는다.
- 모든 클래스는 Object 클래스의 자식 클래스이다.
- 상속을 통해서 클래스를 작성하면 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
- 코드를 공통적으로 관리하기 코드의 추가 및 변경이 매우 용이하다.
2. super 키워드
- 자식 클래스에서 부모 클래스의 가리키는 키워드.
- 자식 클래스에서 부모 클래스의 생성자나 메소드를 호출.
- 만약, 자식 클캐스의 생성자에서 super()를 명시적으로 사용하지 않으면, 컴파일러가 자동으로 삽입.
- 부모 클래스로부터 상속받은 멤버도 자식 클래스에서도 멤버이므로 this 사용이 가능.
- 부모 클래스와 자식 클래스를 구별하는데 사용되는 점을 제외하고 super 와 this는 근본적으로 같음.
3. 메소드 오버라이딩
3.1 오버라이딩(Overriding)이란?
- 부모클래스로부터 상속받은 메소드의 내용을 변경하여 재사용하는 것.
- 상속받은 메소드를 그대로 사용도 가능하지만, 자식클래스에서 원하는 대로 변경하여 사용하는 경우가 많다.
3.2 오버라이딩 조건
- 자식 클래스에서 오버라이딩하는 메소드는 부모클래스의 메소드와 이름, 매개변수, 반환타입이 같아야 한다.
class Fruit {
public void sale(){
System.out.println("과일을 판다");
}
}
// 과일(부모클래스)를 상속
class Banana extends Fruit{
@Override
public void sale(){
System.out.println("과일인 바나나를 판다.");
}
}
// 과일(부모클래스)를 상속
class Apple extends Fruit{
@Override
public void sale(int i){
System.out.println("과일인 사과를 " + i + "개 판다."); // 에러(부모클래스에 정의되지 않음)
}
}
4. 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 메소드 디스패치(Method Dispatch)는 어떤 메소드를 호출할 지 결정하여 실행시키는 과정.
- static(정적) 과 dynamic(동적)이 존재.
- Static Dispatch
- 컴파일 시점에서, 컴파일러가 특정 메소드를 호출하도록 명확하게 지정된 경우.
public class A{
public void print(){
System.out.println("A");
}
}
public class B extends A {
public void print(){
System.out.println("B");
}
}
public class StaticDispatch{
public static void main(String[] args){
B b = new B();
b.print(); //B를 출력
}
}
- Dynmaic Dispatch
- 컴파일러가 어떤 메소드를 호출할지 모르는 경우.
- 런타임 시점에 결정.
public class A{
public void print(){
System.out.println("A");
}
}
public class B extends A {
public void print(){
System.out.println("B");
}
}
public class C extends A {
public void print(){
System.out.println("C");
}
}
public class StaticDispatch{
public static void main(String[] args){
A b = new B();
A c = new C();
b.print(); //B를 출력
c.print(); //C를 출력
}
}
5. 추상 클래스
- 클래스를 만들기 위한 일종의 미완성 설계도로 인스턴스를 생성할 수 없는 클래스.
- 추상클래스를 사용하기 위해서는 상속을 통해서 자식클래스에 구현하여 완성된다.
- 추상클래스는 'abstract' 키워드를 클래스 선언부에 작성하여 사용.
abstract class Fruit{
...
}
- 추상클래스는 반드시 하나 이상의 추상메소드를 포함하며, 생성자와 멤버변수, 일반메소드를 가질 수 있다.
6. final 키워드
- final 키워드는 '변경될 수 없다'의 의미를 가지며, 거의 모든 대상에 사용 가능.
제어자 | 대 상 | 의 미 |
final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 따라서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. |
메서드 | 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다. | |
멤버변수 | 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다. | |
지역변수 |
final class keywordFinal { // 부모가 될 수 없는 클래스
final String JAVS_ONLINE_STUDY = "상속";
// 값을 변경할 수 없는 멤버변수(상수)
final void method() { // 오버라이딩할 수 없는 메소드(변경불가)
final String finalString = JAVS_ONLINE_STUDY;
// 값을 변경할 수 없는 지역변수(상수)
return finalString;
}
}
7. Object 키워드
- Java에서 모든 클래스들의 부모 클래스.
- 개발자가 만드는 클래스도 Object 클래스를 무조건 상속 받는다.
- toString(), eqauls() 등 여러 메소드를 따로 정의하지 않아도 사용이 가능했던 것은 해당 메소드들이 Object 클래스에 정의되고 이를 상속받았기 때문이다.
Object클래스의 메서드 | 설 명 |
protected Object clone( ) | 객체 자신의 복사본을 반환한다. |
public boolean equals(Object obj) | 객체 자신과 객체 obj가 같은 객체인지 알려준다.(같으면 true) |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다.(거의 사용되지 않음) |
public Class getClass() | 객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다. |
public int hashCode() | 객체 자신의 해시코드를 반환한다. |
public String toString() | 객체 자신의 정보를 문자열로 반환한다. |
public void notify() | 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다. |
public void notifyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다. |
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos) |
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게 한다. (timeout은 천 분의 1초, nanos는 109분의 1초) |
참고
- https://hoooooooooooooop.tistory.com/entry/javahalle6
- https://blog.naver.com/swoh1227/222181505425
- https://yadon079.github.io/2020/java%20study%20halle/week-06
'Study > Java(Online-Study)' 카테고리의 다른 글
8주차 과제: 인터페이스 (0) | 2021.07.19 |
---|---|
7주차 과제 : 패키지 (0) | 2021.07.19 |
5주차 과제: 클래스 - 이론(1) (0) | 2021.06.27 |
4주차 과제: 제어문 - 이론(1) (0) | 2021.06.20 |
3주차 과제 : 연산자 (0) | 2021.06.19 |