수업 ë‚´ìš© ¶
ìƒ�ì†� ¶
ìƒ�ì†�ì�€ ê°�ì²´ 지향 프로그램ì—�서 가장 중요한 ê°œë…� 중ì�˜ 하나ì�´ë‹¤. ì�´ê²ƒì�€ ìž�ë°”í�´ëž˜ìŠ¤ë¥¼ ì§�ì ‘ ë””ìž�ì�¸í•˜ëŠ” ë¬¸ì œì—� ì˜�í–¥ì�„ 미친다.ìƒ�ì†�ì�€ 다른 í�´ëž˜ìФì�˜ ì •ë³´ë¥¼ ë�™ì �으로 액세스하ë�„ë¡� 해주기 위해서 ê·¸ í�´ëž˜ìŠ¤ì™€ 다른 í�´ëž˜ìŠ¤ì™€ì�˜ ì°¨ì�´ë¥¼ 명시해주면 ë�œë‹¤.
ê°� í�´ëž˜ìŠ¤ëŠ” ìƒ�위í�´ëž˜ìФ(superclass)를가지며 하나 ì�´ìƒ�ì�˜ 하위í�´ëž˜ìФ(subclass)를 가진다.í�´ëž˜ìŠ¤ë“¤ì�˜ 계층ì�„ ë”°ë�¼ ë‚´ë ¤ê°€ëŠ” 것ì�„ ìƒ�ì†�ë�œë‹¤ê³ 한다.
하위í�´ëž˜ìŠ¤ëŠ” ìƒ�위í�´ëž˜ìŠ¤ë¡œë¶€í„° ëª¨ë“ ë©”ì†Œë“œì™€ 변수들ì�„ ìƒ�ì†�받는다.ìƒ�위í�´ëž˜ìŠ¤ê°€ 필요한 행위를 ì •ì�˜í–ˆìœ¼ë©´ ìž¬ì •ì�˜í•˜ê±°ë‚˜ 다른 í�´ëž˜ìŠ¤ë¡œë¶€í„° ë³µì‚¬í• í•„ìš”ë�„ 없다. ìƒ�ì†�ë°›ì�€ í�´ëž˜ìŠ¤ëŠ” ìž�ë�™ì �으로 ìƒ�위í�´ëž˜ìФì�˜ 행위를 ìž�ë�™ì �으로 가지게 ë�œë‹¤.ìž�ë°” í�´ëž˜ìФ 계층ì�˜ ì œì�¼ 위ì—�는 Objectë�¼ëŠ” í�´ëž˜ìŠ¤ê°€ 있다. ëª¨ë“ í�´ëž˜ìŠ¤ëŠ” ì�´ í�´ëž˜ìŠ¤ë¡œë¶€í„° ìƒ�ì†�ì�„ 받는다. ê°� í�´ëž˜ìŠ¤ë“¤ì�€ 특별한 목ì �ì—� 맞추어 íŠ¹ì • ì •ë³´ë¥¼ 추가ì �으로 가지게 ë�˜ëŠ” 것ì�´ë‹¤.
ìž�ë°” í�´ëž˜ìŠ¤ë¥¼ 새로 ìž‘ì„±í• ë•Œ 대부분 다른 í�´ëž˜ìŠ¤ê°€ 가지는 ì •ë³´ì™€ 몇 가지ì�˜ 추가ì �ì�¸ ì •ë³´ë¥¼ 가지게 í• ê²ƒì�´ë‹¤. 예를 들어 새로운 Buttonì�„ ë§Œë“¤ë ¤ê³ í•œë‹¤ë©´ í�´ëž˜ìФì—� Button으로부터 ìƒ�ì†�ë°›ì�„ 수 있ë�„ë¡� ì •ì�˜í•˜ê¸°ë§Œ 하면 ë�œë‹¤. ë”°ë�¼ì„œ Buttonê³¼ 다른 특징ì—� 대해서만 ì‹ ê²½ ì“°ë©´ ë�œë‹¤.
ì�´ëŸ¬í•œ 메커니즘ì�„ subclassingì�´ë�¼ê³ 부른다.
ê°� í�´ëž˜ìŠ¤ëŠ” ìƒ�위í�´ëž˜ìФ(superclass)를가지며 하나 ì�´ìƒ�ì�˜ 하위í�´ëž˜ìФ(subclass)를 가진다.í�´ëž˜ìŠ¤ë“¤ì�˜ 계층ì�„ ë”°ë�¼ ë‚´ë ¤ê°€ëŠ” 것ì�„ ìƒ�ì†�ë�œë‹¤ê³ 한다.
하위í�´ëž˜ìŠ¤ëŠ” ìƒ�위í�´ëž˜ìŠ¤ë¡œë¶€í„° ëª¨ë“ ë©”ì†Œë“œì™€ 변수들ì�„ ìƒ�ì†�받는다.ìƒ�위í�´ëž˜ìŠ¤ê°€ 필요한 행위를 ì •ì�˜í–ˆìœ¼ë©´ ìž¬ì •ì�˜í•˜ê±°ë‚˜ 다른 í�´ëž˜ìŠ¤ë¡œë¶€í„° ë³µì‚¬í• í•„ìš”ë�„ 없다. ìƒ�ì†�ë°›ì�€ í�´ëž˜ìŠ¤ëŠ” ìž�ë�™ì �으로 ìƒ�위í�´ëž˜ìФì�˜ 행위를 ìž�ë�™ì �으로 가지게 ë�œë‹¤.ìž�ë°” í�´ëž˜ìФ 계층ì�˜ ì œì�¼ 위ì—�는 Objectë�¼ëŠ” í�´ëž˜ìŠ¤ê°€ 있다. ëª¨ë“ í�´ëž˜ìŠ¤ëŠ” ì�´ í�´ëž˜ìŠ¤ë¡œë¶€í„° ìƒ�ì†�ì�„ 받는다. ê°� í�´ëž˜ìŠ¤ë“¤ì�€ 특별한 목ì �ì—� 맞추어 íŠ¹ì • ì •ë³´ë¥¼ 추가ì �으로 가지게 ë�˜ëŠ” 것ì�´ë‹¤.
ìž�ë°” í�´ëž˜ìŠ¤ë¥¼ 새로 ìž‘ì„±í• ë•Œ 대부분 다른 í�´ëž˜ìŠ¤ê°€ 가지는 ì •ë³´ì™€ 몇 가지ì�˜ 추가ì �ì�¸ ì •ë³´ë¥¼ 가지게 í• ê²ƒì�´ë‹¤. 예를 들어 새로운 Buttonì�„ ë§Œë“¤ë ¤ê³ í•œë‹¤ë©´ í�´ëž˜ìФì—� Button으로부터 ìƒ�ì†�ë°›ì�„ 수 있ë�„ë¡� ì •ì�˜í•˜ê¸°ë§Œ 하면 ë�œë‹¤. ë”°ë�¼ì„œ Buttonê³¼ 다른 특징ì—� 대해서만 ì‹ ê²½ ì“°ë©´ ë�œë‹¤.
ì�´ëŸ¬í•œ 메커니즘ì�„ subclassingì�´ë�¼ê³ 부른다.
í�´ëž˜ìФ 계층 만들기 ¶
ë§Žì�€ í�´ëž˜ìŠ¤ë¥¼ 만들기 위해서는 기존ì�˜ í�´ëž˜ìФ 계층ì�„ ì�´ìš©í• 수ë�„ ìžˆê³ , ìž�ì‹ ë§Œì�˜ í�´ëž˜ìФ 계층ì�„ 만들 í•„ìš”ë�„ 있다. ì�´ëŸ¬í•œ 계층ì�„ 만들기 위해서는 몇 가지 ìƒ�ê°�í• ì �ì�´ 있다.
- 다른 í�´ëž˜ìФì—� 공통ì �ì�¸ ì •ë³´ë¥¼ 추출해서 ìƒ�위í�´ëž˜ìФì—� ë„£ê³ í•˜ìœ„í�´ëž˜ìФì—�서 다시 사용하ë�„ë¡� 한다.
- 한 í�´ëž˜ìФì�˜ 행위를 바꾸면 ìž�ë�™ì �으로 하위í�´ëž˜ìФì�˜ 행위를 바꾸게 한다. ë”°ë�¼ì„œ 재컴파ì�¼í• 필요가 없다.
ìƒ�ì†�ì�˜ ë�™ìž‘ ¶
ì�¸ìŠ¤í„´ìŠ¤ 변수ì�˜ 경우 í�´ëž˜ìФì—� 새로운 변수를 만들었다면, 현재 í�´ëž˜ìФì�˜ 변수와 ìƒ�위í�´ëž˜ìФì—�서 ì •ì�˜ë�œ ëª¨ë“ ë³€ìˆ˜ë¥¼ 가질수 있다. ë”°ë�¼ì„œ ëª¨ë“ í�´ëž˜ìŠ¤ë“¤ì�˜ 조합으로 현재ì�˜ ê°�체를 위한 템플릿ì�„ 형성하게ë�˜ê³ 필요한 ì •ë³´ë¥¼ 채우는 것ì�´ë‹¤.
메소드ë�„ 비슷하게 ìž‘ë�™í•œë‹¤.새로운 ê°�체는 ìƒ�위í�´ëž˜ìФì�˜ ëª¨ë“ ë©”ì†Œë“œ ì�´ë¦„ì�„ 액세스한다. 그러나 메소드가 호출ë� 때마다 ë�™ì �으로 메소드 ì •ì�˜ê°€ ì„ íƒ�ë�œë‹¤. íŠ¹ì • ê°�ì²´ì—� 대한 메소드를 호출하면 ìž�바는 ì œì�¼ ë¨¼ì € ê·¸ê°�ì²´ í�´ëž˜ìФì�˜ 메소드 ì •ì�˜ë¥¼ 살펴본다. ê·¸ ê°�ì²´ í�´ëž˜ìФì—� ì •ì�˜ë�˜ì§€ 않았다면 ê·¸ 메소드 ì •ì�˜ë¥¼ ë°œê²¬í• ë•Œê¹Œì§€ ìƒ�위í�´ëž˜ìŠ¤ë¥¼ 찾게ë� 것ì�´ë‹¤.
ë§Œì�¼ 하위í�´ëž˜ìФì—�서 ìƒ�위í�´ëž˜ìФì�˜ 메소드ì�˜ ì�´ë¦„ê³¼ ì�¸ìž�ì�˜ 타입ì�„ 똑같ì�´ 가진 메소드를 ì •ì�˜í•œë‹¤ê³ 하면 어떻게 ë�˜ëŠ”ê°€? ì�´ê²ƒì�€ 계층ì �으로 아래ì—� 있는 것ì�´ ë¨¼ì € 실행ë�˜ê²Œ ë�˜ì–´ 있다. ì�´ëŸ¬í•œ ë°©ì‹�으로 ìž„ì�˜ë¡œ ìƒ�ì�˜í�´ëž˜ìФì�˜ 메소드를 ê°�ì¶”ê³ í•˜ìœ„í�´ëž˜ìФì—� 필요한 메소드를 ì •ì�˜í• 수 있다. 바로 중복(overriding)ì�´ë�¼ê³ 부르는 것ì�´ë‹¤.
메소드ë�„ 비슷하게 ìž‘ë�™í•œë‹¤.새로운 ê°�체는 ìƒ�위í�´ëž˜ìФì�˜ ëª¨ë“ ë©”ì†Œë“œ ì�´ë¦„ì�„ 액세스한다. 그러나 메소드가 호출ë� 때마다 ë�™ì �으로 메소드 ì •ì�˜ê°€ ì„ íƒ�ë�œë‹¤. íŠ¹ì • ê°�ì²´ì—� 대한 메소드를 호출하면 ìž�바는 ì œì�¼ ë¨¼ì € ê·¸ê°�ì²´ í�´ëž˜ìФì�˜ 메소드 ì •ì�˜ë¥¼ 살펴본다. ê·¸ ê°�ì²´ í�´ëž˜ìФì—� ì •ì�˜ë�˜ì§€ 않았다면 ê·¸ 메소드 ì •ì�˜ë¥¼ ë°œê²¬í• ë•Œê¹Œì§€ ìƒ�위í�´ëž˜ìŠ¤ë¥¼ 찾게ë� 것ì�´ë‹¤.
ë§Œì�¼ 하위í�´ëž˜ìФì—�서 ìƒ�위í�´ëž˜ìФì�˜ 메소드ì�˜ ì�´ë¦„ê³¼ ì�¸ìž�ì�˜ 타입ì�„ 똑같ì�´ 가진 메소드를 ì •ì�˜í•œë‹¤ê³ 하면 어떻게 ë�˜ëŠ”ê°€? ì�´ê²ƒì�€ 계층ì �으로 아래ì—� 있는 것ì�´ ë¨¼ì € 실행ë�˜ê²Œ ë�˜ì–´ 있다. ì�´ëŸ¬í•œ ë°©ì‹�으로 ìž„ì�˜ë¡œ ìƒ�ì�˜í�´ëž˜ìФì�˜ 메소드를 ê°�ì¶”ê³ í•˜ìœ„í�´ëž˜ìФì—� 필요한 메소드를 ì •ì�˜í• 수 있다. 바로 중복(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) )
- HP, ê³µê²©ë ¥, ìƒ�태(공격, 홀드, 무브, 스탑), 공중공격가능여부
- 질롯(Unit �래스를 ��)
- HP 100, ê³µê²©ë ¥10, 공중공격 불가능함
- 실드 100
- HP 100, ê³µê²©ë ¥10, 공중공격 불가능함
- 드�군(Unit �래스를 ��)
- HP 150, ê³µê²©ë ¥20, 공중공격 가능함
- 실드 150
- HP 150, ê³µê²©ë ¥20, 공중공격 가능함
ë©”ì�¸ ¶
- 질롯한마리, 드ë�¼êµ°í•œë§ˆë¦¬ì”©ì�„ ë§Œë“ ë‹¤.
- 질롯으로 드�군� 공격시킨다.
질문하세요 ¶
- javaì�˜ 함수ì—�서는 ë””í�´íЏ ì „ë‹¬ì�¸ìž�는 없나요?? ë””í�´íЏ ì „ë‹¬ì�¸ìž�ê°€ 있다면 함수ì�˜ 수를 ìƒ�당히 줄ì�¼ìˆ˜ 있ì�„것 ê°™ì�€ë�°. - ì�´ìŠ¹í•œ
- ë””í�´íЏ ì „ë‹¬ì�¸ìž�ë�¼ëŠ” ê²ƒí•˜ê³ ì§ˆë¬¸ì�´ 무슨 뜻ì�¸ì§€ 잘 ëª¨ë¥´ê² ìŠµë‹ˆë‹¤ ; --iruril
- ë””í�´íЏ ì „ë‹¬ì�¸ìž� : type functionName( type A1, type A2, A3 = 0 );와 ê°™ì�´ ê°’ì�´ ì „ë‹¬ ë�˜ì§€ 않ì�„경우 ìž�ë�™ì�„ ì „ë‹¬ë�˜ëŠ” ê°’ì�„ 가지는 함수ì�˜ 기능ì�„ ë§�합니다.
- ë””í�´íЏ ì „ë‹¬ì�¸ìž� : type functionName( type A1, type A2, A3 = 0 );와 ê°™ì�´ ê°’ì�´ ì „ë‹¬ ë�˜ì§€ 않ì�„경우 ìž�ë�™ì�„ ì „ë‹¬ë�˜ëŠ” ê°’ì�„ 가지는 함수ì�˜ 기능ì�„ ë§�합니다.
- ë””í�´íЏ ì „ë‹¬ì�¸ìž�ë�¼ëŠ” ê²ƒí•˜ê³ ì§ˆë¬¸ì�´ 무슨 뜻ì�¸ì§€ 잘 ëª¨ë¥´ê² ìŠµë‹ˆë‹¤ ; --iruril
- ë˜� super()ì—�ì�˜í•œ 부모 í�´ëž˜ìФì—� 대한 ê°’ ì „ë‹¬ì�€ ìƒ�성ìž�ì—�서만 ë�˜ëŠ” 건가요?? -- ì�´ìŠ¹í•œ
- �성�나 메소드� �관없� 사용가능해요
예를들면 위 circle í�´ëž˜ìФì�˜ getName 메소드ì—�서 사용한 것처럼요 super.getName() ì�´ë ‡ê²Œ --iruril
- ê³ ë§™ìŠµë‹ˆë‹¤~^^
- ê³ ë§™ìŠµë‹ˆë‹¤~^^
- �성�나 메소드� �관없� 사용가능해요










