Jam's story
17일차 본문
상속이란
기존 클래스를 사용하여 새로운 클래스를 작성(선언)하는것
장점
- 재사용성
- 중복제거
- 유지보수 크게 기여
class 자손클래스 extends 부모클래스 { }
부모클래스= 기초클래스 =super 클래스 = 상위클래스
자식클래스 = 파생클래스 = sub클래스 = 하위클래스
생성자와 초기화블럭은 상속되지 않는다.
is-a 상속관계 , has- a 포함관계
예)
1) Circle is a shape 원은 모형이다 O
2) Circle has a shape 원은 모양을 가지고 있다. X
1) Circle is a Point 원은 점이다. X
2) Circle has a Point 원은 점을 가지고 있다. O
is- a 상속관계는 extends 부모클래스로 나타낸다.
has- a 포함관계는 클래스 안에 인스턴스를 만들어주면서 사용한다 .(포함시킨다. )
package days17;
/**
* @author 지민
* @date 2022. 3. 15. - 오전 6:17:34
* @subject
* @content
*
*/
class DrawShape {
public static void main(String[] args) {
Point[] p= {
new Point(150,150),
new Point(140,10),
new Point(200,100)
};
Triangle t=new Triangle(p);
Circle c=new Circle(new Point(100,100),10);
t.draw();
c.draw();
}
}
class Shape{
String color="black";
void draw() {
System.out.printf("[Color: %s]",color);
}
}
class Point{
int x, y;
Point(int x, int y){
this.x=x;
this.y=y;
}
Point(){
this(0,0);
}
String getXY(){
return String.format("x:%s, y:%s",x,y);
}
}
class Circle extends Shape{
Point center; // 포함관계이니까 안에 포함시켜준다.
int r ;
Circle(){
this(new Point(150,150), 3);
}
Circle(Point center, int r) {
this.center=center;
this.r=r;
}
void draw() {
System.out.printf("center: (%d, %d) , r: %d", center.x, center.y, r);
}
}
class Triangle extends Shape{
Point[] p=new Point[3];// 삼각형은 3개의 점을 가지고 있다. -포함관계
Triangle(Point[] p) {
this.p=p;
}
void draw() {
System.out.printf("p[0]=%s , p[1]=%s, p[2]=%s", p[0].getXY(), p[1].getXY(), p[2].getXY());
}
}
DeckTest.java
package days17;
/**
* @author 지민
* @date 2022. 3. 15. - 오전 6:39:07
* @subject
* @content
*
*/
public class DeckTest {
public static void main(String[] args) {
Deck d=new Deck();
Card c=d.pick();
System.out.println(c);
d.shuffle();
c=d.pick();
System.out.println(c);
}
}
class Deck{
final int CARD_NUM=52;
Card cardArr[]=new Card[CARD_NUM];
Deck() {
int i=0;
for(int k=Card.KIND_MAX; k>0; k--)
for(int n=0; n<Card.CARD_NUM; n++)
cardArr[i++]=new Card(k,n+1);
}
Card pick(int index) {
return cardArr[index];
}
Card pick() {
int index=(int)(Math.random()*CARD_NUM);
return pick(index);
}
void shuffle() {
for(int i=0; i<cardArr.length; i++) {
int r=(int)(Math.random()*CARD_NUM);
Card temp=cardArr[i];
cardArr[i]=cardArr[r];
cardArr[r]=temp;
}
}
}
class Card{
static final int KIND_MAX=4; //카드 종류
static final int CARD_NUM=13;
static final int SPADE=4;
static final int DIAMOND=3;
static final int HEART=2;
static final int CLOVER=1;
int kind, number;
Card(){}
Card(int kind, int number){
this.kind=kind;
this.number=number;
}
public String toString() {
String[] kinds= {"", "CLOVER","HERAT","DIAMOND","SPADE"};
String numbers="0123456789XJQK";
return "kind:"+kinds[this.kind]+"numbers"+numbers.charAt(this.number);
}
}
toString()
public String toString() {
String[] kinds= {"", "CLOVER","HERAT","DIAMOND","SPADE"};
String numbers="0123456789XJQK";
return "kind:"+kinds[this.kind]+"numbers"+numbers.charAt(this.number);
}
toString()은
참조변수의 출력으로 toString()이 자동호출된다.
Card c=d.pick();
System.out.println(c);
윈도우 창 만들기
package days17;
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
* @author 지민
* @date 2022. 3. 14. - 오전 11:29:40
* @subject
* @content
*
*/
// top-window (윈도우 ,창)
public class MyApplication extends Frame{
//필드x
//메소드x
//디폴트 생성자
public MyApplication() {
System.out.println("MyApplication 디폴트생성자호출됨 ");
this.setTitle("새 윈도우창()");
this.setSize(400,400);
this.addWindowListener(new MyAppWindowListener());
this.setVisible(true);
}
}
//리스너(청취자)선언 =윈도우 관련 이벤트를 처리하는 리스너 선언
class MyAppWindowListener implements WindowListener {
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("프로그램종료");
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
}
package days17;
/**
* @author 지민
* @date 2022. 3. 14. - 오전 11:28:42
* @subject
* @content
*
*/
public class Ex04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//MyApplicationi.java클래스
new MyApplication();
System.out.println("end");
}
}
이벤트핸들러
이벤트가 발생하면 호출되는 메소드
windowClosing-프로그램일 닫힐때
windowClosed -프로그램이 닫히고 나서
this의 용도
자바는 다중상속이 되지 않는다 .
모든 클래스는 java.lang.Object 클래스를 상속받는다.
컴파일할때 자동 extends java.lang..Object로 처리
모든 클래스의 최상의 부모(super클래스)는 Object클래스이다 .
->모든 객체. 9개의 메소드는 반드시 포함하고 있다.
물려받은 필드 , 생성자를 통해 초기화 하기 조상클래스의 생성자 -super()
private로 지정되어있기 때문에 직접 접근할 수 없다 .
해결책 1->.getter,setter로 접근
해결책 2-> super()
생성자가 호출되는 순서 이해
부모생성자 호출-> 자식생성자 호출
문제점 : 부모한테 없는 필드는 메소드에 출력이 안된다.
1.부모에게 물려받은 메소드를 수정한다. - 오버라이딩 =메소드 재정의
2.메소드를 똑같은 이름으로 중복선언하는 방법 - 오버로딩
오버로딩- 매개변수타입이나 갯수가 달라야한다
final
- 상수화 - 한번 값을 붙이고 다른 값으로 바꾸지 않겠다.
- 명시적초기화 ,기본값초기화
public final double PI=3.141592;
public final static double PI=3.141592; -> 프로그램시작하면 ,객체생성안하고도 사용할 수 있다.
다른값으로 바꿀 수 없다.
final 클래스는 자식클래스를 만들 수 없다. 마지막클래스
final 메소드
업캐스팅
부모에 선언된 필드와 메소드만 사용가능
class Chlid extends Parent{}
Parent parent=new Child();
Child child=new Child();
Parent parent=child;
다운캐스팅
다시 자식꺼 사용가능
Child child=(Child) parent;
Comments