U E D R , A S I H C RSS

Java Study2004/�래스��

수업 내용

��

��� �체 지향 프로그램�서 가장 중요한 개� 중� 하나�다. �것� �바�래스를 �접 디��하는 문제� �향� 미친다.��� 다른 �래스� 정보를 ��으로 액세스하�� 해주기 위해서 그 �래스와 다른 �래스와� 차�를 명시해주면 �다.
� �래스는 �위�래스(superclass)를가지며 하나 ��� 하위�래스(subclass)를 가진다.�래스들� 계층� 따� 내려가는 것� ���다고 한다.
하위�래스는 �위�래스로부터 모든 메소드와 변수들� ��받는다.�위�래스가 필요한 행위를 정�했으면 재정�하거나 다른 �래스로부터 복사할 필요� 없다. ��받� �래스는 ���으로 �위�래스� 행위를 ���으로 가지게 �다.�바 �래스 계층� 제� 위�는 Object�는 �래스가 있다. 모든 �래스는 � �래스로부터 ��� 받는다. � �래스들� 특별한 목�� 맞추어 특정 정보를 추가�으로 가지게 �는 것�다.
�바 �래스를 새로 작성할 때 대부분 다른 �래스가 가지는 정보와 몇 가지� 추가�� 정보를 가지게 할 것�다. 예를 들어 새로운 Button� 만들려고 한다면 �래스� Button으로부터 ��받� 수 있�� 정�하기만 하면 �다. 따�서 Button과 다른 특징� 대해서만 신경 쓰면 �다.
�러한 메커니즘� subclassing��고부른다.

�래스 계층 만들기

많� �래스를 만들기 위해서는 기존� �래스 계층� �용할 수� 있고, �신만� �래스 계층� 만들 필요� 있다. �러한 계층� 만들기 위해서는 몇 가지 ��할 �� 있다.
  • 다른 í�´ëž˜ìФì—� 공통ì �ì�¸ 정보를 ì¶”ìœí•´ì„œ ìƒ�위í�´ëž˜ìФì—� 넣고 하위í�´ëž˜ìФì—�서 다시 사용하ë�„ë¡� 한다.
  • 한 í�´ëž˜ìФì�˜ 행위를 바꾸면 ìž�ë�™ì �으로 하위í�´ëž˜ìФì�˜ 행위를 바꾸게 한다. ë”°ë�¼ì„œ 재컴파ì�¼í•  필요가 없다.
예를 들어 Motorcycle�래스와 같� Car�는 �래스를 만드는 것� ��하�. Car와 Motorcycle�비슷한 특징들� 있다. � 둘� 엔진� �해 움��다. � 변�기와 전조등과 ��계를 가지고 있다. �반�으로 ��하면, Object�는�래스 아래� Vehicle��는 �래스를 만들고 엔진� 없는 것과 있는 방�으로 PersonPoweredVehicle과 EnginePoweredVehicle �래스를 만들 수 있다. � EnginePoweredVehicle �래스는 Motorcycle, Car, Truck등등� 여러 �래스를 가질 수 있다. 그렇다면 make와 color�는 �성� Vehicle �래스� 둘 수 있다.

��� �작

�스턴스 변수� 경우 �래스� 새로운 변수를 만들었다면, 현재 �래스� 변수와 �위�래스�서 정�� 모든 변수를 가질수 있다. 따�서 모든 �래스들� 조합으로 현재� �체를 위한 템플릿� 형성하게�고 필요한 정보를 채우는 것�다.
메소드ë�„ 비슷하게 ìž‘ë�™í•œë‹¤.새로운 ê°�체는 ìƒ�위í�´ëž˜ìФì�˜ 모든 메소드 ì�´ë¦„ì�„ 액세스한다. 그러나 메소드가 호ìœë�  때마다 ë�™ì �으로 메소드 ì •ì�˜ê°€ ì„ íƒ�ë�œë‹¤. 특정 ê°�ì²´ì—� 대한 메소드를 호ìœí•˜ë©´ ìž�바는 ì œì�¼ 먼저 ê·¸ê°�ì²´ í�´ëž˜ìФì�˜ 메소드 ì •ì�˜ë¥¼ 살펴본다. ê·¸ ê°�ì²´ í�´ëž˜ìФì—� ì •ì�˜ë�˜ì§€ 않았다면 ê·¸ 메소드 ì •ì�˜ë¥¼ 발견할 때까지 ìƒ�위í�´ëž˜ìŠ¤ë¥¼ 찾게ë�  것ì�´ë‹¤.
만� 하위�래스�서 �위�래스� 메소드� �름과 ��� 타입� 똑같� 가진 메소드를 정�한다고 하면 어떻게 �는가? �것� 계층�으로 아래� 있는 것� 먼저 실행�게 �어 있다. �러한 방�으로 임�로 ���래스� 메소드를 �추고 하위�래스� 필요한 메소드를 정�할 수 있다. 바로 중복(overriding)��고 부르는 것�다.

Point �래스

  • x,y ê°’ì�„ 바로 입력받는 ìƒ�성ìž�
  • x,y 좌표
  • xê°’ 얻는 메소드, 정하는 메소드
  • yê°’ 얻는 메소드, 정하는 메소드
  • í�´ëž˜ìФ ì�´ë¦„ 얻어오기
    ~cpp 
     
    import javax.swing.JOptionPane;
    
    public class Point {
    
    	private int x;
    
    	private int y;
    
    	public Point() {
    
    	}
    
    	public Point(int aX, int aY) { //�성� 입니다.
    		this.x = aX;
    		y = aY;		
    	}
    
    	public int getX() {
    		return x;
    	}
    
    	public int getY() {
    		return y;
    	}
    
    	public void setX(int Ax) {
    		x = Ax;
    	}
    
    	public void setY(int Ay) {
    		y = Ay;
    	}
    
    	public String getName() {
    		return "Point";
    	}
    
    	public void Say(String str) {
    		JOptionPane.showMessageDialog(null, str);
    	}
    
    	public void Say(int temp) {
    		String str = Integer.toString(temp);
    
    		JOptionPane.showMessageDialog(null, str);
    	}
    
    	public static void main(String[] args) {
    		Point P1 = new Point(20,20);
    		Point P2 = new Point(10,10);
    		//RECTANGLE
    		Rectangle p = new Rectangle(P1,P2);
    //		System.out.println(p.getArea());
    		//circle
    		Circle c = new Circle(P1,P2);
    		System.out.println(c.getArea());
    	}	
    }
     

Shape �래스

  • 왼쪽위 x,yì �, 오른쪽아래 x,yì �
  • ë„“ì�´ 구해오는 메소드
  • í�´ëž˜ìФ ì�´ë¦„ 얻어오기

~cpp 
public class Shape {
	protected Point left_top;
	protected Point right_bottom;
	public String name;
	
	public Shape()
	{
		
	}
	public  Shape ( Point p1 , Point p2)
	{
		left_top =	p1;
		right_bottom = p2;
		name = "Shape";
	}
	public Shape ( int x1, int y1, int x2, int y2)
	{
		this.left_top = new Point(x1,y1);
		this.right_bottom = new Point( x2,y2 );
		name = "Shape";
	}
	
	public double getArea()
	{
		return 0;
	}
	public String getName()
	{
		return name;
	}
}

Circle �래스

~cpp public class Circle extends Shape {

	private double radius;

	public Circle() {

	}

	public Circle(Point p1, Point p2) {
		super(p1, p2);
		name = "Circle";
	}

	public Circle(int x1, int y1, int x2, int y2) {
		super(x1, y1, x2, y2);
		name = "Circle";
	}

	public double getArea() {
		if(Math.abs(left_top.getX()-right_bottom.getX()) >= Math.abs(left_top.getY()-right_bottom.getY()))
			radius = Math.abs(left_top.getY()-right_bottom.getY());
		else
			radius = Math.abs(left_top.getX()-right_bottom.getX());
		return Math.PI * radius * radius;
	}

	public String getName() {
		return super.getName();
	}
}

Rectangle �래스

~cpp public class Rectangle extends Shape {
	//right_bottom
	//Point left_top
	
	public Rectangle() {

	}

	public Rectangle(Point P1, Point P2) {
		super(P1, P2);
		name = "Rectangle";
	}

	public Rectangle(int x1, int y1, int x2, int y2) {
		super(x1, y1, x2, y2);
		name = "Rectangle";
	}

	public double getArea() {
		return Math.abs(right_bottom.getX()-left_top.getX()) * Math.abs(left_top.getY()-right_bottom.getY());		
	}

}

과제

스펙

�래스
  • Unit í�´ëž˜ìФ
    • HP, 공격력, ìƒ�태(공격, 홀드, 무브, 스탑), 공중공격가능여부
    • 공격한다, 홀드한다, 무브한다, 스탑한다(ìƒ�태를 바꿔줌)
    • 공격받으면 HPê°€ 깎ì�¸ë‹¤(전달ì�¸ìž�로 ì �ì�˜ 공격력ì�„ ë°›ì�Œ) (ex public void underattack(int aAttackPoint) )

  • 질롯(Unit í�´ëž˜ìŠ¤ë¥¼ ìƒ�ì†�)
    • HP 100, 공격력10, 공중공격 불가능함
    • 실드 100
  • 드ë�¼êµ°(Unit í�´ëž˜ìŠ¤ë¥¼ ìƒ�ì†�)
    • HP 150, 공격력20, 공중공격 가능함
    • 실드 150
메�
  • 질롯한마리, 드ë�¼êµ°í•œë§ˆë¦¬ì”©ì�„ 만든다.
  • 질롯으로 드ë�¼êµ°ì�„ 공격시킨다.

질문하세요

  • javaì�˜ 함수ì—�서는 ë””í�´íЏ 전달ì�¸ìž�는 없나요?? ë””í�´íЏ 전달ì�¸ìž�ê°€ 있다면 함수ì�˜ 수를 ìƒ�당히 줄ì�¼ìˆ˜ 있ì�„것 ê°™ì�€ë�°. - ì�´ìŠ¹í•œ
    • ë””í�´íЏ 전달ì�¸ìž�ë�¼ëŠ” 것하고 질문ì�´ 무슨 뜻ì�¸ì§€ 잘 모르겠습니다 ; --iruril
      • ë””í�´íЏ 전달ì�¸ìž� : type functionName( type A1, type A2, A3 = 0 );와 ê°™ì�´ ê°’ì�´ 전달 ë�˜ì§€ 않ì�„경우 ìž�ë�™ì�„ 전달ë�˜ëŠ” ê°’ì�„ 가지는 함수ì�˜ 기능ì�„ ë§�합니다.
  • ë˜� super()ì—�ì�˜í•œ 부모 í�´ëž˜ìФì—� 대한 ê°’ 전달ì�€ ìƒ�성ìž�ì—�서만 ë�˜ëŠ” 건가요?? -- ì�´ìŠ¹í•œ
    • ìƒ�성ìž�나 메소드ì—� ìƒ�관없ì�´ 사용가능해요
      예를들면 위 circle �래스� getName 메소드�서 사용한 것처럼요 super.getName() �렇게 --iruril
      • 고맙습니다~^^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:32
Processing time 0.0083 sec