Java - OOP - 상속, 포함

갓김치·2020년 8월 26일
0

자바 객체지향

목록 보기
8/13

상속 (~은 ~이다.): 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); //10
        
        c.channel = 15;
        c.channelUp(); //Parent의 c가 0에서 1로 증가
        System.out.println(c.channel); //15
    }
}

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();
        //ds.paing(g) //Frame이 paint(g)를 자동호출하기때문에 주석처리
    }
    
    DrawShape(){
        super("정신차려!"); //super(): 부모의 기본생성자 호출
        setSize(500,500);
        setBackground(color.ORANGE); //Color클래스의 클래스변수 ORANGE의 값은 16진수
        setVisible(true);
        setResizable(false);
    }
    
    @Override
    public void paint(Graphics g){ //Graphics g의 주소값을 받기위해 위에서 객체 생성
        //1. 매개변수가 두개인 생성자를 이용하여 Circle 객체를 만들어주세요
        int r = 250;
        Point p = new Point(30,40);
        Circle c = new Circle(r, p); //변수에 담아 객체 생성해줄 것
        
        //2. g.drawOval() 원을 그려주세요
        //   drawOval(int x, int y, int width, int height)
        g.drawOval(c.center.x, c.center.y, c.r*2, c.r*2);
        
        //3-1. 매개변수가 하나인 생성자를 이용하여 Triangle객체를 만들어주세요
        //	 100,100  200,200  200,100
        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);
        
        //4. g.drawLine() 3개를 이용하여 삼각형을 그려주세요
        //   drawLine(int x1, int y1, int x1, int y1)
        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; //점의 x좌표
    int y; //점의 y좌표
    
    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
}

class Circle{
    //1. 반지름(정수)을 저장할 수 있는 변수 r을 선언해 주세요
    int r;

    //2. 점 하나를 저장할 수 있는 변수 center를 선언해주세요 
    Point center;

    //3. 매개변수가 두개인 생성자를 이용하여 r과 center를 초기화해주세요.
    Circle(int r, Point center){
        this.r = r;
        this.center = center;
    }

    //4. 기본생성자를 만들어주세요.
    //   단, 매개변수가 두개인 생성자를 호출하여 좌표는 100,100 반지름 50으로 초기화해주세요.
    Circle(){
        this(50,new Point(100,100)); //this()는 맨 위에
    }

}

class Triangle{
    //1. 점3개를 저장할 수 있는 변수 p를 선언해주세요
    Point[] p;
    
    //2. 매개변수가 하나인 생성자를 만들어주세요
    Triangle(Point[] p){ //매개변수가 하나인 이유: 생성자=인스턴스 '초기화'메서드
        this.p = p;                    //Triangle의 인스턴스= Point[] p 하나
    }
    
    //3. 매개변수가 3개인 생성자를 만들어주세요
    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){
        //9. 카드 한 벌의 객체를 생성
        Deck d = new Deck();
        
        //10. 0번 index의 카드 한 장을 뽑기 -
        Card result1 = d.pick(0);
        
        //11. 임의의 index번째 카드 한 장을 뽑기
        Card result2 = d.pick();
        
        //12. 카드를 자동 섞기
        d.shuffle();
        
        //13. 0번 index의 카드를 한 장을 뽑기
        Card result2 = d.pick(0);
        
        //14. 카드 1000번 섞기
        d.shuffle(1000);
        
        //15. 0번 index의 카드를 한 장을 뽑기
        Card result3 = d.pick(0);
    }
}

class Deck{ //카드 한 벌(52장) = Deck
    //2. 카드의 수량을 저장할 수 있는 변수 CARD_NUM을 선언하고 Card클래스의 상수를 사용하여 초기화하여라.
    static final int CARD_NUM = Card.KIND_MAX * Card.NUM_MAX;
    
    //3. 카드 52장을 저장할 수 있는 변수 c를 선언 및 생성하여라.
    Card[] c = new Card[CARD_NUM];
    
    //4. 기본생성자를 작성하여라.
    //	 c의 방들의 값을 1,1 ~ 4,13까지의 카드로 초기화하여라
    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);
            }
        }
    }
    
    //5. c에서 임의의 index번째 카드 한 장을 반환하는 메서드(pick)를 작성하여라.
    Card pick(){
        int random = (int)(Math.random()*CARD_NUM);
        Card result = c[random];
        return result;
    }
    
    
    //6. 사용자로부터 입력받은 index번째 카드 한 장을 반환하는 메서드(pick)를 작성하여라
    //	  단, 입력받은 값이 0~51사이의 정수라면 입력받은 index번째 카드 한 장을 반환하고
    //   그렇지 않은 경우에는 "랜덤번호"를 출력하고 임의의 한 장을 반환하도록 하여라.
    Card pick(int input){ //매개변수가 있어야 오버로딩 가능
        Card result;
        if(0<=input && input<=51){
            result = c[input]; 
        }else{
            result = pick();
            System.out.println("랜덤번호");
        }
        return result;
    }
    
    //7. c의 카드를 섞는 메서드(shuffle)을 작성하여라. - 자동 섞기
    //   단, 카드 섞는 법  : 연습문제 5-6의 방법을 활용
    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;
        }
    }
    
    
    //8. 사용자로부터 입력받은 횟수만큼 c의 카드를 섞는 메서드(shuffle)을 작성하여라.
    //   단, 임의의 방 두개를 뽑아 두개의 index번째 요소의 위치를 바꾼다.
    //   이를 사용자로부터 입력받은 횟수만큼 반복한다.
    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 //Object 클래스(조상 클래스)의 메소드를 재정의하여 사용. 
    public String toString(){ 
        String kind = "";	//SPADE...
        String number = ""; //AJQK는 숫자가 아님
        //공백으로 초기화 한 이유
        //선언만 하면 해당문장을 안지나가면 초기화가안됨
        //default 없으면 null값되서 null point exception??
        
        //종류에 따라
        switch (this.kind) {
        case 1:
            kind = "SPADE";
            break;
            
        case 2:
            kind = "DIAMOND";
            break;
        
        case 3:
            kind = "HEART";
            break;
            
        default:
           kind = "CLOVER";
           break;
        }
        
        //1. 인스턴스변수 number의 값이 11이면 지역변수 number의 값을 "J"로, 12이면 "Q"로, 13이면 "K"로, 1이면 "A"로
        //   그 외의 경우는 번호 그대로를 저장하여라
        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;
    }
}
profile
갈 길이 멀다

0개의 댓글