상속
기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
두 클래스를 부모와 자식으로 관계를 맺어주는 것
자손은 조상의 모든 멤버를 상속 받는다. (생성자, 초기화블럭 제외)
자손의 멤버 개수는 조상보다 적을 수가 없다. (같거나 많다.)
자손의 변경이 조상에 영향을 미치지 않는다. (조상의 변경은 자식에 영향을 미친다.)
class 자식클래스 extends 부모클래스 { }
단일 상속
java는 단일 상속만을 허용한다.
(다중상속 시, 조상에 이름이 같은 메소드가 있을 경우 충돌할 위험이 있기 때문이다. )
비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 하면 다중 상속의 효과를 볼 수 있다.
class TvDVD extends Tv {
DvD dvd = new DVD();
}
포함
클래스의 멤버로 참조변수를 선언하는 것
작은 단위의 클래스를 만들고, 이 둘을 조합해서 클래스를 만든다.
(복잡도를 줄이고 재사용성을 높일 수 있다. )
class Point {int x,y;}
class Circle {
Point c = new Point(); //Circle이 Point를 포함
int r;
} //원(Circle)은 점(Point)를 가지고 있다.
* 상속 관계 'A은 ~B이다'
* 포함 관계 'A는 ~B를 가지고 있다.'
Object클래스는 모든 클래스의 조상이다.
부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다. (toString(), equals()...)
class 클래스명 extends Object { }
참조변수 super
객체자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
조상의 멤버를 자신의 멤버와 구별할때 사용
생성자 super()
조상의 생성자를 호출할 때 사용
조상의 멤버는 조상의 생성자를 호출해서 초기화
class Point3D extends Point {
//생성자
Point3D(int x, int y, int z) {
super(x, y); //(조상)Point클래스의 생성자(int x, int y)를 호출해서 초기화
this.z = z; //(자손)자신의 생성자 멤버를 초기화
}
}
상속을 사용 했을 경우, 모든 생성자는 첫줄에 반드시 다른 생성자를 호출해야한다.
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();(조상의 기본생성자)를 삽입한다.
class Point extends Object {
int x, y;
//기본생성자
Point(){
this(0,0);
}
//매개변수가 있는 생성자
Point(int x, int y){
super(); //자식생성자는 첫줄에 부모 생성자를 호출해야한다.
this.x = x;
this.y = y;
}
}
접근제어자 : public, protected, default, provate
그 외 : stasic, final, abstract, native, transient, synchronized, volatile, strictfp
제어자는 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능
접근 제어자는 한 번에 네가지 중 하나만 선택해서 사용 가능
public class modifierTest {
public static final int WIDTH = 200;
public static void main(String[] args){
system.out.println("WIDTH = "+WIDTH);
}
}
// 접근 제어자를 제일 왼쪽에 써준다.
static - 클래스의, 공통적인
멤버변수(클래스변수), 클래스메서드, 초기화 블럭에 사용한다.
class staticTest {
static int width = 200; //cv
static int height = 120; //cv
static {
//class변수의 복잡한 초기화
}
static int max(int a, int b){
return a > b ? a : b;
} // class메서드(static 메서드)
}
// static 메서드는 인스턴스 멤버 사용 불가
// static 변수와 메서드는 인스턴스 생성하지 않고도 사용 가능
final - 마지막의, 변경될 수 없는
변수에 사용하면 상수가 된다.
메서드에 사용하면 오버라이딩 불가.
클래스에 사용하면 조상이 될 수 없다.
abstract - 추상의, 미완성의
메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용. 추상메서드를 가지고 있는 클래스는 추상 클래스가 된다.
미완성 설계도이기 때문에 인스턴스 생성이 불가능하다.
abstract class AbstractTest { //추상 클래스
abstract void move (); //추상 메서드 {} 구현부가 없다.
}
추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성이 가능하다.