상속 (~은 ~이다.): is a
- 인간은 포유류이다.
- 기존의 클래스를 재사용하여 새로운 클래스를 만든다.
- 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
- 새로 작성하고자 하는 클래스의 뒤에 상속 받고자 하는 클래스를 키워드 'extends'와 함께 써주기만 하면 된다.
class Child extends Parent{
}
- 상속을 해주는 클래스를 '조상클래스', 상속을 받는 클래스를 '자손클래스'
- 조상클래스 - 상위클래스, 부모클래스, 기반클래스
- 자손클래스 - 하위클래스, 자식클래스, 파생된클래스
- 상속을 받을때는 멤버만 상속받는다.
- 항상 자손클래스가 부모클래스보다 같거나 크다.
상속 예시
public class ChildTest {
public static void main(String[] args) {
Child c = new Child();
c.volume = 10;
c.volumeUp();
System.out.println(c.volume);
c.channel = 15;
c.channelUp();
System.out.println(c.channel);
}
}
class Parent {
int channel;
void channelUp();{
channel++;
}
}
class Child extends Parent {
int volume;
int channel;
void volumeUp(){
volume++;
}
}
포함 (~은 ~을 포함하고 있다.) : has
- 원은 점을 포함한다
- 상속 이외에 클래스를 재사용하는 방법
- 클래스의 멤버변수로 다른 클래스를 선언하는 방법
- 우리가 쓰는 게 대부분 '포함'
포함 예시 - DrawShape.java
import java.awt.Color;
public class DrawShape extends Frame {
public static void main(String[] args) {
DrawShape ds = new DrawShape();
}
DrawShape(){
super("정신차려!");
setSize(500,500);
setBackground(color.ORANGE);
setVisible(true);
setResizable(false);
}
@Override
public void paint(Graphics g){
int r = 250;
Point p = new Point(30,40);
Circle c = new Circle(r, p);
g.drawOval(c.center.x, c.center.y, c.r*2, c.r*2);
Point[] ppp = new Point[3];
ppp[0] = new Point(100,100);
ppp[1] = new Point(200,200);
ppp[2] = new Point(200,100);
Triangle t = new Triangle(ppp);
g.drawLine(t.p[0].x, t.p[0].y, t.p[1].x, t.p[1].y);
g.drawLine(t.p[1].x, t.p[1].y, t.p[2].x, t.p[2].y);
g.drawLine(t.p[2].x, t.p[2].y, t.p[0].x, t.p[0].y);
}
}
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
class Circle{
int r;
Point center;
Circle(int r, Point center){
this.r = r;
this.center = center;
}
Circle(){
this(50,new Point(100,100));
}
}
class Triangle{
Point[] p;
Triangle(Point[] p){
this.p = p;
}
Triangle(Point p1, Point p2, Point p3){
p = new Point[3];
p[0] = p1;
p[1] = p2;
p[2] = p3;
}
}
포함 예시2 - DeckTest.java
import java.util.Arrays;
public class DeckTest {
public static void main(String[] args){
Deck d = new Deck();
Card result1 = d.pick(0);
Card result2 = d.pick();
d.shuffle();
Card result2 = d.pick(0);
d.shuffle(1000);
Card result3 = d.pick(0);
}
}
class Deck{
static final int CARD_NUM = Card.KIND_MAX * Card.NUM_MAX;
Card[] c = new Card[CARD_NUM];
Deck(){
int index = 0;
for(int kind = 1;kind < KIND_MAX;kind++){
for(int number = 1;number < NUM_MAX;number++){
c[index++] = new Card(kind,number);
}
}
}
Card pick(){
int random = (int)(Math.random()*CARD_NUM);
Card result = c[random];
return result;
}
Card pick(int input){
Card result;
if(0<=input && input<=51){
result = c[input];
}else{
result = pick();
System.out.println("랜덤번호");
}
return result;
}
void shuffle(){
for(int index = 0 ; index < CARD_NUM ; index++){
int random = (int)(Math.random()*CARD_NUM);
Card temp = c[index];
c[index] = c[random];
c[random] = temp;
}
}
void shuffle(int input){
for(int mix = 0 ; mix < input ; mix++){
int random1 = (int)(Math.random()*CARD_NUM);
int random2 = (int)(Math.random()*CARD_NUM);
Card temp = c[random1];
c[random1] = c[random2];
c[random2] = temp;
}
}
}
class Card{
static final int KIND_MAX = 4;
static final int NUM_MAX = 13;
static final int SPADE = 1;
static final int DIAMOND = 2;
static final int HEART = 3;
static final int CLOVER = 4;
static int width = 100;
static int height = 250;
int kind;
int number;
Card(int kind, int number){
this.kind = kind;
this.number = number;
}
Card(){
this(SPADE,1);
}
@Override
public String toString(){
String kind = "";
String number = "";
switch (this.kind) {
case 1:
kind = "SPADE";
break;
case 2:
kind = "DIAMOND";
break;
case 3:
kind = "HEART";
break;
default:
kind = "CLOVER";
break;
}
switch (this.number) {
case 1:
number = "A";
break;
case 11:
number = "J";
break;
case 12:
number = "Q";
break;
case 13:
number = "K";
break;
default:
number += this.number;
break;
}
return kind+"|"+number;
}
}