상속
•
기존에 작성되었던 클래스를 재사용하기 위한 문법.
•
상위 클래스의 변수와 함수를 하위 클래스에서 재사용. 하위 클래스의 객체를 생성하면, 상위 클래스의 멤버까지 사용 가능.
•
상속을 사용하는 이유 : 코드의 중복 작성을 줄일 수 있음.
•
소프트웨어 설계 초기 단계부터 고려하는 습관을 들이자!
•
하위 클래스가 상위 클래스의 멤버를 사용하는 방법!
class B extends A {
public B() {
super(10, 20);
System.out.println(a); // 그냥 쓰기
System.out.println(super.a); // super. 사용! 제일 추천 방법
System.out.println(this.a); // this. 사용!
//상위 클래스의 private 멤버 사용법.
System.out.println(getAA());
System.out.println(super.getAA()); //제일 추천 방법
System.out.println(this.getAA());
}
}
Java
복사
상속과 생성자
•
상속 관계의 하위 클래스 생성자를 초기화할 시, 상위 클래스 생성자가 먼저 초기화 됨.
•
하위 클래스에는 상위 클래스에서 상속한 것(상위 클래스의 생성자)가 포함되어 있으므로, 하위 클래스 생성자를 초기화하면 자동으로 상위 클래스 생성자도 초기화 되는 것.
•
즉, 하위 클래스 생성자에는 자동으로 super(); 가 작성됨.
•
super?
◦
super : 상위 클래스의 멤버를 사용하고 싶은 때 “super.(멤버)”로 사용
◦
super() : 상위 클래스의 생성자를 호출함.
◦
상위 클래스 생성자에 매개변수가 작성 된 경우(default 생성자가 아닌 경우)
▪
하위 클래스 생성자의 super() 에도 같은 매개변수를 사용하기.
▪
상위 클래스에 default 생성자를 직접 작성하기(습관화 하면 좋음)
class TV{
private int size;
public TV(int size) {this.size = size;} // 매개변수를 작성한 상위 클래스 생성자
protected int getSize() {return size;}
}
class ColorTV extends TV {
private int color;
public ColorTV(int size, int color) {
super(size); // 하위 클래스 생성자의 super()에 같은 매개변수 사용.
this.color = color;
}
}
Java
복사
메소드 오버라이딩
•
하위 클래스가 상위 클래스의 메소드를 자신의 필요에 맞추어 재정의 하는 것.
•
상속 관계에서, 동일한 메소드 이름에, 메소드의 내용이 다름.
class Shape {
public void draw() {
System.out.println("도형을 그립니다.");
}
}
class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("사각형을 그립니다."); // 상위 클래스의 메소드와 동일한 이름, 다른 내용
}
Java
복사
메소드 오버라이딩 vs 메소드 오버로딩
•
메소드 오버로딩 : 상속과는 관계없이, 매개변수의 데이터 타입과 개수에 따라 동일한 메소드 이름을 가진 메소드가 여러개 생성되는 것.
•
가장 대표적인 메소드 오버로딩의 예 = System.out.println();
다형성
•
상속 관계의 두 클래스에서, 하위 클래스가 상위 클래스로 타입 변환 되는 것
•
즉, (일방향적인) 객체간의 casting.
// 상위 클래스
class Shape {
public void draw() {
System.out.println("도형을 그립니다.");
}
}
// 하위 클래스 1
class Circle extends Shape{
@Override
public void draw() {
System.out.println("원을 그립니다.");
}
}
// 하위 클래스 2
class Triangle extends Shape{
@Override
public void draw() {
System.out.println("삼각형을 그립니다.");
}
}
// 실행
public class Main {
public static void main (String[] args) {
// 다형성 : 상위 클래스 타입에 하위 클래스 타입 객체 생성 가능.(자동 타입 변환)
Shape[] shape = {new Circle(), new Triangle()};
for (Shape s : shape) {
s.draw();
// 원을 그립니다.
// 삼각형을 그립니다. 출력.
}
}
}
Java
복사
•
다형성에서 꼭 기억해야할 3가지
1.
부모는 자식이다
2.
무조건 오버라이딩 된 메소드 부터 사용된다.
3.
“자식 타입 = (자식) 부모” 는 일반적으로 불가능
(부모가 자식의 모든 멤버를 가지고 있을 때만 가능)