상속
- 두 개의 클래스가 있다. 한 클래스가 다른 클래스의 기능을 모두 포함하고 있다면 일일이 코드를 구현할 필요가 없다. 이럴 때 사용하는 기능이 상속이다.
class Cal {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
class Cal3 extends Cal{
}
- extends를 사용하여 Cal3 클래스는 Cal을 상속받았다.
- Cal3는 비어있지만, sum 메소드를 가지고 있다.
- 부모 클래스에게 없는 기능은 일반 메소드를 추가하듯이 자식 메소드에 그냥 추가하면 된다.
오버라이드(override)
- 부모 클래스로부터 받은 메소드는 새롭게 정의할 수 있다. 이를 오버라이드라고 한다.
class Cal3 extends Cal{
public int sum(int v1, int v2) {
System.out.println("Cal3!!!");
return v1 + v2;
}
public int minus(int v1, int v2) {
return v1 - v2;
}
}
이클립스로 오버라이드
- Source - Override/Implement Methods 기능을 이용하면 부모 클래스의 메소드들을 손쉽게 재정의 할 수 있다.
오버로딩(overloading)
- 특정 이름을 지닌 메소드가 있더라도, 같은 이름을 지닌 메소드를 또 만들 수 있다.
class Cal {
public int sum(int v1, int v2) {
return v1 + v2;
}
public int sum(int v1, int v2, int v3) {
return v1 + v2 + v3;
}
}
- 같은 이름의 메소드일지라도, 메소드를 호출할 때는 파라미터의 형식도 모두 고려하기 때문에 프로그램은 각각의 메소드가 애매하다고 판단하지 않다.
super
- this는 인스턴스 본인을 가리키는 키워드이다.
- 부모 클래스를 가리키고 싶다면 super을 사용하면 된다.
상속과 생성자
- 자식 클래스에서 생성자를 만들지 않았다면, 암묵적으로 부모 클래스의 기본 생성자(super())을 호출한다.
- 인자를 받는 생성자를 만들게 되면 기본 생성자는 암묵적으로 만들어지지 않는다. 직접 명시해주어야 사용 가능하다.
- 인자가 포함된 생성자를 사용하는 경우 주의해야 한다.
- 부모클래스에 기본 생성자가 아닌 인자를 주는 생성자만 명시한 경우, 자식 클래스에서 기본 생성자를 호출할 수 없다.
- 자식클래스에 기본생성자가 아닌 인자를 주는 생성자만 명시한 경우, 자식 클래스에서 기본 생성자가 자동 생성이 되지 않는다.
다형성
- 상속 관계에 있는 클래스간의 호환성을 높여주는 기능이다.
- 부모 클래스의 자료형을 가진 변수를 선언하여 자식 클래스의 인스턴스를 생성할 수 있다.
ParentClass obj = new ChildClass()
접근 제어자
- public : 모든 접근을 허용한다.
- private : 현재 객체 내에서만 허용한다.
- default : 같은 패키지 내의 클래스에서 접근할 수 있다.
- protected : 같은 패키지에 있는 객체와 상속관계의 객체들만 접근할 수 있다.
final
- 현재 클래스에서 자식 클래스를 생성하지 못하게 막을 수 있다.
- 메소드가 자식 클래스에서 오버라이드 하지 못하게 할 수 있다.
- 변수를 수정하지 못하게 할 수 있다.
abstract
- 해당 클래스나 메소드를 재정의하도록 강제한다.
- abstract 메소드는 선언만 되어 있는 상태이고, abstract 클래스는 인스턴스로 만들 수 없다.