Jam's story

17일차 본문

Java

17일차

애플쩀 2022. 3. 14. 17:42

상속이란 

기존 클래스를 사용하여 새로운 클래스를 작성(선언)하는것 

 

장점 

  • 재사용성
  • 중복제거 
  • 유지보수 크게 기여 
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;

 

'Java' 카테고리의 다른 글

19일차  (0) 2022.03.16
18일차  (0) 2022.03.15
16일차  (0) 2022.03.11
15일차  (0) 2022.03.10
14일차  (0) 2022.03.08
Comments