상속
우리가 생각하는 상속이라는 단어가 맞다. 현실 세계에서 부모님이 자식들에게 재산을 물려주는 것과 비슷하다. 차이라고 하면 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다. 이때 상속받는 클래스를 자식 클래스, 하위 클래스 또는 서브 클래스라고 부른다. 상속을 해주는 클래스를 부모 클래스, 상위 클래스 또는 슈퍼 클래스라고 한다.
상속 시 접근제어자가 private 일 경우
이 경우 상속된 클래스의 변수를 불러올 수 없기 때문에,
private이 아닌 protected를 쓴다.
@ 상속되지 않는 3가지 경우
- private은 상속되지 않는다(protected로 사용)
- 또한 상속 시에 슈퍼 클래스의 생성자는 상속되지 않는다.
- 다만 자식의 생성자가 불리면, 무조건 부모의 생성자를 부른다.
- static 변수의 경우 상속되지 않는다.
- 활용 예시
public class RedDuck extends Duck{
public RedDuck() {
super();
myShape = "RedDuck";
}
오버라이드(override)
- 부모 클래스의 메소드를 물려받음.
- @Override 라는 어노테이션으로 메타정보 전달
- 상위 받은 메소드는 그대로 유지해야하며, 밑에 몸통 부분은 변경이 가능함.
@Override
public void display() {
// TODO Auto-generated method stub
super.display();
System.out.println("빨간색");
}
}
오버로딩(overloading)
- 같은 함수명을 사용하나, 매개변수를 다르게함으로써 이용하는 함수
추상 클래스
메소드의 일부를 body 없이 사용해서, 상속을 위해 만든 클래스
이는 상속 클래스에서 반드시 비어있는 메소드를 구현해서 사용해야한다.
해당 클래스와, 메소드 앞에 반드시 abstract라고 명시해야한다.
추상 클래스 예시
public abstract class Duck {
protected int x;
protected int y;
protected String myShape = "Duck";
public Duck() {
Random rnd = new Random();
x = rnd.nextInt(800);
y = rnd.nextInt(600);
}
//Overloading
public Duck(int x, int y) {
this.x = x;
this.y = y;
}
// 추상메소드(abstract method)<-> 구체적(실체적 // 클래스도 abstract 붙여준다.
public abstract void display();
public void quack() {
System.out.println("꽥꽥");
}
}
- 상속 클래스 예시
package mycom.mytest;
public class MallardDuck extends Duck{
public MallardDuck() {
myShape = "MallardDuck";
}
public MallardDuck(int x, int y) {
super(x,y);
myShape = "MallardDuck";
}
@Override
public void display() {
System.out.println(x + "," + y + "=" + myShape + ": 파란색");
} // 추상 클래스의 상속 클래스는 반드시 비어있는 메소드를 구현해야합니다.
}
라이브러리를 상속하기
- 오버라이드
라이브러리 자체를 상속해서, 커스터마이징해서 사용하기
package mycom.mytest;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
public class MyFrame extends Frame{
public MyFrame() {
super(); //Frame f = new Frame();
this.setSize(800, 600); //f.setSize();
this.setVisible(true); // 독점권 요청(모니터) --> OS --> 독점권을 뺏고 다시 부여 --> paint(g)
}
@Override
public void paint(Graphics g) {
MallardDuck md1 = new MallardDuck();
MallardDuck md2 = new MallardDuck();
MallardDuck md3 = new MallardDuck();
MallardDuck md4 = new MallardDuck();
RedDuck rd1 = new RedDuck();
RedDuck rd2 = new RedDuck();
RedDuck rd3 = new RedDuck();
RedDuck rd4 = new RedDuck();
g.setColor(new Color(255,0,0));
g.fillOval(md1.x, md1.y, 50, 50);
g.fillOval(md2.x, md2.y, 50, 50);
g.fillOval(md3.x, md3.y, 50, 50);
g.fillOval(md4.x, md4.y, 50, 50);
g.setColor(new Color(0,0,255));
g.fillOval(rd1.x, rd1.y, 50, 50);
g.fillOval(rd2.x, rd2.y, 50, 50);
g.fillOval(rd3.x, rd3.y, 50, 50);
g.fillOval(rd4.x, rd4.y, 50, 50);
}
}
- 현재 구조
- Mallad Duck, Red Duck은 Duck 클래스를 상속
- MyFrame은 Frame 라이브러리를 상속
'웹 애플리케이션 > 자바' 카테고리의 다른 글
1_10 인터페이스, 디자인 패턴 (0) | 2023.03.20 |
---|---|
1_9 자바 객체지향(형변환) (0) | 2023.03.17 |
1_7 자바 GUI 프로그래밍 (2) | 2023.03.15 |
1_6 자바 UMLet 설치 및 활용 (0) | 2023.03.15 |
1_5 자바 객체지향 실습(회원관리 프로그램) (0) | 2023.03.15 |