기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
✨ 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유사지보수에 크게 기여한다.
상속해주는 Parent 는 조상클래스라고 하고, 상속받는 Child 는 자손클래스라고 한다. 자손클래스는 조상클래스의 모듬 멤버를 상속받기 때문에 항상 조상 클래스보다 같거나 많은 멤버를 갖는다.
Class Parent { }
class Child extends Parent { ... }
자바는 C++ 와 달리, 단일 상속만을 허용한다. 그래서 둘 이상의 클래스로부터 상속을 받을 수 없다. 다중상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만, 클래스간의 관계가 매우 복잡해진다는 것이다.
✨ 자바에서는 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중 상속보다 유리하다.
super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구별할 수 있다.
Class Parent { int x = 10; }
class Child extends Parent {
int x = 20;
void method() {
System.out.println("x = " + x); // x = 20
System.out.println("x = " + this.x); x = 20
System.out.println("x = " + super.x); x = 10
}
}
모든 인스턴스 메서드에는 this와 super가 지역변수로 존재하는데, 이 들에는 자신이 속한 인스턴스의 주소가 자동으로 저장된다.
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우가 많다.
Class Parent {
int x;
int y;
void method() {
System.out.println("x + y = " + x + y);
}
}
class Child extends Parent {
int z;
void method() {
System.out.println("x + y + z = " + x + y + z);
}
}
@Override
: 만약 어노테이션을 작성해준다면, 컴파일러에게 상위클래스에서 오버라이딩을 했다는 것을 명시해준다. 만약 컴파일러가 상위 클래스에 존재하지 않는다는 메소드이면 에러를 발생시킨다.
오버로딩은 기존에 없는 새로운 메서드를 정의하는 것이다. 매개변수나 반환타입으로 구분할 수 있다.
추상 클래스는 abstract로 정의하며, 추상메소드 또는 메소드를 포함한다. 추상 클래스는 인스턴스화 할 수 없지만 상속은 가능하다. 추상 클래스를 상속받을 때, 자식 클래스는 부모 클래스의 추상메소드를 구현해야만 한다.
public abstract class GraphicObject {
abstract void drew();
}
final 은 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고, 클래스에 사용되면 자신을 확장하는 자손클래스를 정의 할 수 없다.
어떠한 메소드가 바뀌지 않아야 하며, 중요한 객체로 구성되어있을 때 사용한다.
Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 한다.
✨ 모든 상속계층도의 최상위에는 Object클래스가 위치한다. 그래서 자바의 모든 클래스들은 Object클래스에 정의된 멤버들을 사용할 수 있다.
컴파일 시점에서, 컴파일러가 특정 메서드를 호출할 것이라느 것을 명확하게 아는 경우이다. 런타임(실행 시점)이 되지 않아도 미리 결정하는 개념이다.
상위개념인 interface 혹은 abstract class 에서 정의된 추상메서드를 호출하는 경우에 해당한다. 동적 디스패치는 호출할 메서드를 런타임 시점에서 결정한다.
Class Disptch {
static abstract class Service {
abstract void run();
}
static abstract class Exam1 extends Servcie {
@Override
void run() {
System.out.print("Exam1")
}
}
static abstract class Exam2 extends Servcie {
@Override
void run() {
System.out.print("Exam2")
}
}
public static void main(String[] args){
Servcie service = new Servcie1();
service.run();
}
}
https://docs.oracle.com/javase/tutorial/java/TOC.html
https://yadon079.github.io/2020/java%20study%20halle/week-06