국비학원 교육 일지

[18일차] 국비 교육

snooop 2022. 8. 11. 17:46

<오늘 예상진도>

1.게임만들기 쓰레드이용 

2.시험예상

3.예외처리

 

<게임만들기 쓰레드 이용>

package 쓰레드게임만들기;

import java.util.Scanner;

public class GameMain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("강력한 체력과 물리공격력의 전사 이름을 정하세요 : ");
        String warriorName = sc.next();
        System.out.print("궁극의 마법 능력을 지닌 마법사 이름을 정하세요 : ");
        String wizardName = sc.next();
        Character warrior = new Character(warriorName, 8,2, 0.8,0.5, 40, 500);
        Character wizard = new Character(wizardName, 2, 28, 0.5, 0.9, 100, 250);
        GameThA gameThA = new GameThA(warrior, wizard);
        GameThB gameThB = new GameThB(warrior, wizard);
        gameThA.start();
        gameThB.start();
    }
}

 

package 쓰레드게임만들기;
// 실제 게임 캐릭터로 만들어 질 클래스
public class Character extends Unit implements GameAct {
    // 생성자를 만듦
    // name : 캐릭터 이름
    // pP : 물리 힘
    // mP : 마법 힘
    // pH : 물리 적중률
    // mH : 마법 적중률
    // ultra : 특수 기술에 대한 공격력
    // hp : 체력
    // 캐릭터가 가지는 기본적인 능력치를 생성자를 통해서 결정 함 (캐릭터간의 밸런스를 맞춤)
    public Character(String name, int pP, int mP, double pH,double mH, int ultra, int hp) {
        this.name = name; // this는 자신의 객체를 참조하는 참조 변수임.
        this.pPower = pP;
        this.mPower = mP;
        this.pHit = pH;
        this.mHit = mH;
        this.ultraPower = ultra;
        this.hp = hp;
    }

    @Override
    // 물리 공격력 : 물리적인 힘 * 원래는 확률로 계산하는게 원칙이지만 코드를 간단하기 위해서
    public double pAttack() {
        return pPower *pHit;
    }

    @Override
    // 마법 공격력
    public double mAttack() {
        return mPower * mHit;
    }

    @Override
    // 궁극기 : 특수 능력
    public int ultimate() {
        return ultraPower;
    }

    @Override
    // 해당 캐릭터가 공격을 받아서 받는 피해량을 반영함
    public boolean setDamage(double damage) {
        if(hp > damage) {
            hp -= damage;
            System.out.println("남아 있는 " + name + "의 체력은 " + hp + "입니다.");
            return false; // false는 캐릭터가 살아 있음을 의미 함.
        }else{
            System.out.println(name + "이 죽었습니다. 게임을 종료 합니다.");
            return true;
        }
    }
}

 

package 쓰레드게임만들기;
// Thread로 상속 받아 쓰레드 구현
// GameThA : 전사 캐릭터로 간주

public class GameThA extends Thread{
    private Character warrior; // 외부에서 접근 허용을 막기 위해 private을 설정
    private Character wizard; // Character 클래스로 참조 변수를 생성

    // 생성자 호출 시 매개변수로 생성된 캐릭터의 객체를 넘겨 받음
    public GameThA(Character warrior, Character wizard) {
        this.warrior = warrior; // 매개 변수로 넘겨 받은 객체를 인스턴스 필드 변수에 넘겨 줌
        this.wizard = wizard;
    }

    @Override // 생략해도 됨, 어노테이션을 넣어주는 이유는 컴파일 시 체크를 위함
    public void run(){
        int normal; // 일반 공격에 대한 확률 구하기
        int special; // 특수 공격에 대한 확률 구하기
        boolean endGame = false; // 게임의 진행 여부 판단하는 플래그
        while(true){ // 해당 쓰레드를 무한 반복하도록 만듦
            try {
                sleep(3000); // 게임의 진행 속도를 맞추기 위함.(3초 대기)
                normal = (int)(Math.random() * 2); // random : static 변수(객체 생성X), 50% 확률을 구한다. (0과 1만 출력 됨)
                special = (int)(Math.random() * 20); // 5% 확률을 구함.
                if(normal == 1){ // normal은 0과 1만 있음
                    System.out.println("물리 공격  : " + wizard.name + "에게"
                    + warrior.pAttack() + "데미지를 입혔습니다.");
                    endGame = wizard.setDamage(warrior.pAttack());
                }else{
                    System.out.println("마법 공격  : " + wizard.name + "에게"
                            + warrior.mAttack() + "데미지를 입혔습니다.");
                    endGame = wizard.setDamage(warrior.mAttack());
                }
                if(special == 10){ // 10이라는 값이 나올 확률은 1/20 이다
                    System.out.println(warrior.name + " 궁극기 발동 !!!,"
                           + wizard.name + "에게" + warrior.ultimate()+
                            "데미지를 입혔습니다.");
                    endGame = wizard.setDamage(warrior.ultimate());
                }
                if(endGame) System.exit(0);// 강제 종료
            }catch (InterruptedException e){
                // sleep일때 interrupt를 걸수 있기 때문에 예외처리를 해야함

            }


        }

    }
}

 

package 쓰레드게임만들기;
// 마법사 쓰레드 만들기
public class GameThB extends Thread {
    private Character warrior; // 외부에서 접근 허용을 막기 위해 private을 설정
    private Character wizard; // Character 클래스로 참조 변수를 생성

    // 생성자 호출 시 매개변수로 생성된 캐릭터의 객체를 넘겨 받음
    public GameThB(Character warrior, Character wizard) {
        this.warrior = warrior; // 매개 변수로 넘겨 받은 객체를 인스턴스 필드 변수에 넘겨 줌
        this.wizard = wizard;
    }
    public void run(){
        int normal; // 일반 공격에 대한 확률 구하기
        int special; // 특수 공격에 대한 확률 구하기
        boolean endGame = false; // 게임의 진행 여부 판단하는 플래그
        while(true) { // 해당 쓰레드를 무한 반복하도록 만듦
            try {
                sleep(3300);
                normal = (int)(Math.random() * 2);
                special = (int)(Math.random() * 18);
                if(normal == 1){
                    System.out.println("마법 공격 : "+ warrior.name+" 에게"+
                             wizard.mAttack() + "데미지를 입혔습니다.");
                    endGame = warrior.setDamage(wizard.mAttack());
                }else {
                    System.out.println("물리 공격 : "+ warrior.name+" 에게"+
                            wizard.mAttack() + "데미지를 입혔습니다.");
                    endGame = warrior.setDamage(wizard.pAttack());
                }
                if(special == 10){ // 1/18 확률로 발동
                    System.out.println(wizard.name + "궁극기 발동 !!!, "+
                            warrior.name + "에게" + wizard.ultimate()+
                            "데미지를 입혔습니다.");
                    endGame = warrior.setDamage(wizard.ultimate());
                }
                if(endGame) System.exit(0);
            } catch (InterruptedException e) {
            }
        }
    }
}

 

package 쓰레드게임만들기;
// 게임 캐릭터를 만들기 위해 기본 클래스 정의
// 게임캐릭터가 가져야 할 필수 요소 포함
// 상속을 주기 위해서 접근제한자는 protected(상속관계, 같은 패키지 접근 가능)

abstract public class Unit {
    protected String name; // 캐릭터 이름 설정
    protected int pPower; // Physical Power (물리적인 힘)
    protected int mPower; // 매지컬 Power (마법의 힘)
    protected double pHit; // 물리적중률 (지팡이로 때리거나..)
    protected double mHit; // 마법 적중률
    protected int ultraPower; // 궁극기 (해당 캐릭터가 가진 특수 능력)
    protected int hp;  // 체력
}
// 실제 기능 구현 없고 상속 받은 클래스가 반드시 해당 메소드를 완성 해줘야 함
// 자바는 다중 상속이 불가능 하지만 인터페이스를 이용하여 다중 상속처럼 사용 가능 하도록 해줌
interface GameAct {
    double pAttack(); // 구현부가 없고 선언만 있음, 상속 받은 클래스가 구현 해줘야 함
    double mAttack(); // 마법 공격력
    int ultimate(); // 궁극의 기술로 입히는 공격량(?)
    // 반환 타입이 boolean인 이유는 캐릭터가 아직 살아 있는지 판별하기 위해서
    // 남아 있는 hp보다 damage가 크면 true를 반환(즉 죽었다는 의미)
    boolean setDamage(double damage); // 피해를 받는 양
}

 

출력

강력한 체력과 물리공격력의 전사 이름을 정하세요 : 바바리안
궁극의 마법 능력을 지닌 마법사 이름을 정하세요 : 제이나
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 249입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 499입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 242입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 473입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 241입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 472입니다.
제이나궁극기 발동 !!!, 바바리안에게100데미지를 입혔습니다.
남아 있는 바바리안의 체력은 372입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 234입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 371입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 233입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 370입니다.
제이나궁극기 발동 !!!, 바바리안에게100데미지를 입혔습니다.
남아 있는 바바리안의 체력은 270입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 226입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 244입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 225입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 218입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 224입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 192입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 223입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 166입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 216입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 140입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 209입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 202입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 114입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 201입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 88입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 200입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 87입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 193입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 86입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 186입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 85입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 179입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 84입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 178입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 58입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 177입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 57입니다.
마법 공격  : 제이나에게1.0데미지를 입혔습니다.
남아 있는 제이나의 체력은 176입니다.
바바리안 궁극기 발동 !!!,제이나에게40데미지를 입혔습니다.
남아 있는 제이나의 체력은 136입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 31입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 129입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 5입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 122입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 115입니다.
물리 공격 : 바바리안 에게25.2데미지를 입혔습니다.
남아 있는 바바리안의 체력은 4입니다.
물리 공격  : 제이나에게6.4데미지를 입혔습니다.
남아 있는 제이나의 체력은 108입니다.
마법 공격 : 바바리안 에게25.2데미지를 입혔습니다.
바바리안이 죽었습니다. 게임을 종료 합니다.

 

<시험예상>

 

package 평가2차대비;
// 1. 메소드오버로딩을 묻는 문제 
// 메소드 오버로딩이란 : 동일한 메소드 이름을 가지고, 
// 매개변수의 개수와 타입으로 다양한 메소드를 호출하는 다형성에 대한 객체 지향 문법을 의미 
// 반환값은 의미 없음 
public class testOverloading {
    public void sumTest(){}
    public void sumTest(String str){} // 매개변수 유/무에 따라 오버로딩 성림
    public void sumTest(int i){} // 매개변수의 타입이 다르므로 성립
    //public void sumTest(String s){} // 오버로딩 성립 안함,2번째와 타입과 개수가 같음(오류)
    public void sumTest(int i, String s){}// 매개변수의 개수가 다르므로 성립
    //public void sumTest(int num){} // 오버로딩 성립 안함, 3번째와 타입과 개수가 같음(오류)
    //private void sumTest(int i ){} // 접근제한자는 의미 없음,3번째와 타입과 개수가 같음, 성립 안함(오류)
    //public int sumTest() {return 0;} //반환형이 다른건 의미 없음, 1번째와 매개변수가 없는 메소드 이미 존재(오류)
    //총 4쌍 존재
    
}
package 평가2차대비;
// [프로그래밍 응용]
// 2. 사용자가 입력한 값의 합을 구하는 문제 , 0보다 큰 숫자 입력
// 0이하의 숫자가 오면 1이상의 숫자를 입력하라고 해야함

import java.util.Scanner;

public class TestPassMain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("1이상의 숫자를 입력하세요. ");
        int num = sc.nextInt(); // 정수를 입력 받음
        int sum = 0; // 합을 구하기 위해서는 값을 누적해야 하므로 반드시 초기화 필요
        if(num > 0){ // **조건 체크 확인 (문제^^)
            int i = 1;
            while(i <= num){ // 반복문의 문제는 i값을 변경해주는 코드가 없음
                sum += i;
                i++; // **i의 값을 변경해주는 코드가 필요 함(문제^^)
            }
            System.out.println("1부터 "+ num +"까지의 합은 "+ sum + "입니다.");
        }else{
            System.out.println("숫자가 1이상 이어야 합니다.");
        }
    }
}

출력

1이상의 숫자를 입력하세요. 10
1부터 10까지의 합은 55입니다.

 

package 평가2차대비3번;
// money 라는 인스턴스 필드는 접근제한자(private)구현 되어야 함
// 생성자의 매개변수 유/무를 확인
// + UNIT : String = "원" ==> public static final String UNIT = "원:;
// - money : int ==> private int money
// + Money(money:int) ==> public Money(int money) 메인에서 호출할 때 확인 필요
public class Money {
    public static final String UNIT = "원";
    private int money; // 요게 문제임(^^)
    public Money(int money){
        this.money = money;
    }
    public int getMoney(){
        return money;
    }
    public void setMoney(int money){
        this.money = money;
    }
    // 클래스 메소드 or static 메소드
    public static String getUnit(){
        return UNIT;
    }
    public void print(){
        System.out.println(money + UNIT + "이 있습니다.");
    }

}

 

package 평가2차대비3번;
// 클래스 관련 문제 (클래스 다이어그램)
// + : public
// - : private
// 생성자의 매개변수 유/무를 확인
// + UNIT : String = "원" ==> public static final String UNIT = "원:;
// - money : int ==> private int money
// + Money(money:int) ==> public Money(int money) 메인에서 호출할 때 확인 필요
public class TestPassClassEX {
    public static void main(String[] args) {
        Money money = new Money(10000); // 생성자(^^)
        money.print();
    }
}

출력

10000원이 있습니다.

<서술형>

package 평가대비2차_서술형;
import java.util.Scanner;
// 1. 반복문
// - for() : 반복횟수가 정해져 있을 때 주로 사용
// - while() : 반복횟수가 정해져 있지 않을 때 주로 사용
// - do ~ while() : 무조건 한번 수행되는 반복문(조건식이 마지막에 있음)
//                  반복 여부를 결정하는 조건식이 맨 아래에 존재
public class TestPassMainEx3 {
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int age = sc.nextInt();
        for(int i = 1; i<= age; i++){
            System.out.println("입력 받은 나이에 대한 범위 : "+ i);
        }

    }
}

 

package 평가대비2차_서술형;
import java.util.Scanner;
// 1. 반복문
// - for() : 반복횟수가 정해져 있을 때 주로 사용
// - while() : 반복횟수가 정해져 있지 않을 때 주로 사용
// - do ~ while() : 무조건 한번 수행되는 반복문(조건식이 마지막에 있음)
//                  반복 여부를 결정하는 조건식이 맨 아래에 존재
public class TestPassMainEx3 {
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int age = sc.nextInt();
        int i = 0;
        while(true){
            i++;
            System.out.println("입력 받은 나이의 범위: "+i);
            if(i == age) break;
        }
    }
}

 

package 평가대비2차_서술형;
import java.util.Scanner;
// 1. 반복문
// - for() : 반복횟수가 정해져 있을 때 주로 사용
// - while() : 반복횟수가 정해져 있지 않을 때 주로 사용
// - do ~ while() : 무조건 한번 수행되는 반복문(조건식이 마지막에 있음)
//                  반복 여부를 결정하는 조건식이 맨 아래에 존재
public class TestPassMainEx3 {
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int age = sc.nextInt();
        int i = 0;
        do{
            i++;
            System.out.println("입력 받은 나이의 범위 : " +  i);
        }while (i < age);
    }
}

출력은 다 같음!!!

10
입력 받은 나이에 대한 범위 : 1
입력 받은 나이에 대한 범위 : 2
입력 받은 나이에 대한 범위 : 3
입력 받은 나이에 대한 범위 : 4
입력 받은 나이에 대한 범위 : 5
입력 받은 나이에 대한 범위 : 6
입력 받은 나이에 대한 범위 : 7
입력 받은 나이에 대한 범위 : 8
입력 받은 나이에 대한 범위 : 9
입력 받은 나이에 대한 범위 : 10

 

// 2. 무한 반복문 while에서 1부터 10까지만 출력할 수 있는 방법을 제시하시오.
// - 단, while문에서 while(true) 유지하면 만점 
public class TestPassMainEx3 {
    public static void main(String[] args) {
        int i = 0;
        while(true){
            i++;
            System.out.print(i+ " ");
            if(i >= 10) break;
        }
    }
}

출력

1 2 3 4 5 6 7 8 9 10

 

// 3. 문자열 배열을 만들어서 "사과", "딸기", "오렌지"로 초기화
public class TestPassMainEx3 {
    public static void main(String[] args) {
      // 첫번째 방법 : 선언과 동시에 문자열 대입
      String[] fruit = {"사과", "딸기", "오렌지" };
      // 두번째 방법 : 선언이후 값을 대입
      String[] fruit2 = new String[3];
      fruit2[0] = "사과";
      fruit2[1] = "딸기";
      fruit2[2] = "오렌지";
    }
}

 

// 4. 구구단 출력 문제 : 2단만 출력 (싱글 for문 사용)
public class TestPassMainEx3 {
    public static void main(String[] args) {
     for(int i =1; i <10; i++){
         System.out.println( 2 +"*" + i + "=" + (2*i) );
     }
    }
}

출력

2*1=2
2*2=4
2*3=6
2*4=8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18

 

// 6. 문자열 출력 하기

public class TestPassMainEx3 {
    public static void main(String[] args) {
     String[] fruit = {"수박", "포도", "딸기"};
     for(int i = 0; i < fruit.length; i++) System.out.print(fruit[i] + " ");
     for(String e : fruit) System.out.print(e + " ");
    }
}

출력

수박 포도 딸기 수박 포도 딸기
// 7. 배열의 얕은 복사, 깊은 복사를 설명하시오.
// - 얕은 복사란? 참조 변수 사용 시 변수에 값이 복사가 되지 않고 주소가 복사되는 것을 의미
                //==> 주소가 복사 됨
// - 깊은 복사란? 값이 복사 
// 8. 배열의 깊은 복사를 할 수 있는 방법 세가지
// - for, arraycopy, copyOf
package 배열의복사2;
// 배열을 깊은 복사를 하는 방법 (for. 
// arraycopy() : 배열을 복사 할 때 사용하는데, 주로 배열의 공간이 부족한 경우
// 더 큰 공간을 할당 하고자 할 때 사용
// arraycopy (src, src pos, dest, dest pos, length)
public class ArrayCopyMain {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1,2,3,4,5};
        int[] arr2 = new int[10];
        System.arraycopy(arr1,0, arr2, 0, arr1.length);
        for(int e : arr2) System.out. print(e + " ");
    }
}

<for문으로 깊은 복사>

public class ArrayCopyMain {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1,2,3,4,5};
        int[] arr2 = new int[10];
        for(int i = 0; i< arr1.length; i++){
            arr2[i] = arr1[i];
        }
        for(int e : arr2) System.out.print(e+ " ");
    }
}
package 배열의복사2;

import java.util.Arrays;

// 배열을 깊은 복사를 하는 방법 (for, arraycopy, copyOf())
// arraycopy() : 배열을 복사 할 때 사용하는데, 주로 배열의 공간이 부족한 경우
// 더 큰 공간을 할당 하고자 할 때 사용
// arraycopy (src, src pos, dest, dest pos, length)
// copyOf() :  배열을 원하는 길이 만큼 새로운 배열로 복사
public class ArrayCopyMain {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1, 2, 3, 4, 5};
        int[] arr2 = Arrays.copyOf(arr1, 10);
        for(int e : arr2)System.out.print(e + " ");
    }
}

출력

1 2 3 4 5 0 0 0 0 0

 

// 9. 배열의 특징 2가지 (같은 데이터 타입, 크기 변경 불가능, 여러개의 값을 연속으로 저장 할 수 있다.)
// - 같은 타입으로 연속으로 존재하는 유한의 데이터를 공간 
// 10. int 자료형을 10개 담을 수 있는 공간 iArr을 생성하시오 
public class TestPassMainEx3 {
    public static void main(String[] args) {
     int[] iArr = new int[10];
    }
}
// 11. double 자료형을 5개 담을 수 있는 dArr을 생성
public class TestPassMainEx3 {
    public static void main(String[] args) {
     double[] dArr = new double[5];
    }
}

 

// 12. 어떤 값이 출력되는지 묻는 문제 : int 배열의 경우 - 주소값이 출력 된다. 0
public class TestPassMainEx3 {
    public static void main(String[] args) {
        int[] iArr = new int[10];
        System.out.println(iArr); // 참조 변수는 값이 없고 주소 값을 출력된다.
        System.out.println(iArr[5]); // 0이 출력 된다.

    }
}
// 12. 13. 어떤 값이 출력되는지 묻는 문제 : int 배열의 경우 - 주소값이 출력 된다. 0
// - String 참조변수에 아무것도 대입되지 않으면 null (참조형에서 주소가 할당되어 있지 않을 때)
// - 객체를 만들고 아무것도 대입하지 않으면 이것도 null
// - null을 참조하는 객체를 호출하면 NullPointerException 에러 발생
public class TestPassMainEx3 {
    public static void main(String[] args) {
        String [] sArr = new String[3];
        System.out.println(sArr); // 주소값이 출력된다.
        System.out.println(sArr[0]); // null

    }
}
// 14. 배열을 for문으로 출력하는 문제
public class TestPassMainEx3 {
    public static void main(String[] args) {
       int[] iArr = {1,2,3,4,5};
       for(int i = 0; i< iArr.length; i++){
           System.out.println(iArr[i]);
       }

    }
}

출력

1
2
3
4
5

 

// 15. 클래스 변수와 인스턴스 변수의 초기화 순서
// - 클래스 변수 : JVM이 정한 기본값 -> 명시적 초기화 -> 초기화 블록
// - 인스턴스 변수 : JVAM이 정한 기본값 -> 명시적 초기화 -> 초기화 블록  -> 매개변수 생성자
// 밑에 답으로 써도 답 처리 됨
// - 클래스 변수 : 클래스 생성 시 초기화
// - 인스턴스 변수는 : 객체 생성시 생성자를 통해 초기화
// 16. memberId getter/setter 작성 문제
public class TestPassMainEx3 {
    public static void main(String[] args) {
        MemberInfo memberInfo = new MemberInfo();
        memberInfo.setMemberId("1004");
        System.out.println(memberInfo.getMemberId());

    }
}
class MemberInfo{
    private String memberId; // 인스턴스 필드를 생성하고 접근제한 함.
    // 게터는 접근제한자가 public 이고
    // 일반적으로 인스턴스 필드의 값을 반환함
    public String getMemberId(){
        return memberId;// 해당 인스턴스 필드 값을 반환
    }
    // 세터는 일반적으로 반환 값이 없고, (값을 세팅하는 것임) 매개변수로 값을 전달 받음
    public void setMemberId(String memberId){
        this.memberId = memberId;
    }

}
// 17. 접근제한자의 접근 가능 범위에 대해 기술 하시오.
// - private : 클래스 내에서만 접근 가능 (클래스 내부의 메소드를 통해 필드를 접근)
// - default : (키워드는 없음) 동일 패키지 내에서 접근 가능
// - protected : 동일 패키지 내에서 접근 가능,
//             만약 다른 패키지에 있더라도 상속 관계이면 접근 가능
// - public : 모든 패키지에서 접근 가능 
public class TestPassMainEx3 {
    public static void main(String[] args) {
       
    }
}
class MemberInfo{ 
    private String test1; // private 같은 클래스 내에서만 접근 가능
    String test2; // default

}

 

// 18. 필드에 들어 갈 수 있는 접근 제한자를 기술 하시오.
// (private, default, protected, public)
// - 필드란?  클래스 내부에서 사용되는 변수를 의미 함.
public class TestPassMainEx3 {
    public static void main(String[] args) {

    }
}
class MemberInfo{
    private String test1; // private 같은 클래스 내에서만 접근 가능
    String test2; // default

}
// 19. 메소드에 들어 갈 수 있는 접근 제한자 기술
// (private, default, protected, public)
// - 메소드란? 클래스 내부에서 사용되는 하나의 동작 기능 구현한 것
// - 메소드란 필드에 대해 값을 쓰거나 읽는 동작을 위해 사용 되기도 함. (게터/세터)
// 20. 객체지향 프로그램의 3대 특징에 대해 쓰시오.
// - 상속, 다형성(오버로딩, 오버라이딩), 캡슐화(데이터 은닉), 추상화 (상속시 인터페이스, extends)
// 21. 자바에서 클래스 변수, 인스턴스 변수, 지역 변수의 특징에 대해서 기술
// - 클래스 변수 : static 선언된 필드(멤버) 변수, 클래스에 소속, *객체로 만들어지지 않는다.
// - 프로그램 실행시 정적메모리영역에 할당 되고 프로그램 종료 시 소멸 된다.
// - 인스턴스 변수 : new에 의해서 *객체로 생성되는 변수(heap에 할당), this 참조 변수로 접근 가능 
// - 지역 변수 : 메소드 또는 제어문 내에서 선언된 변수를 의미하고 stack영역에 생성됨.
// - 해당 메소드나 제어문을 벗어나면 자동 소멸된다.

public class TestPassMainEx3 {
    public static void main(String[] args) {
       MemberInfo memberInfo = new MemberInfo("GV80");
       System.out.println(MemberInfo.company);
    }
}
class MemberInfo{
   static String company  = "현대 자동차";
   String modelName; // 인스턴스 변수 또는 인스턴스 필드라고 부름

    public MemberInfo(String modelName) {
        this.modelName = modelName;
    }
}
// 22. 메소드 오버로딩에 대해서 설명 하시오.
// - 동일한 메소드 이름을 사용하고, 매개변수의 타입이나 개수로 메소드를 자동으로 호출 함.
// - 키워드 (동일한 메소드 이름, 매개변수, 반환 타입으로 결정되지 않는다.)
// 23. public class 클래스명{}, class 클래스명{} 차이가 무엇인지 설명?
// - 클래스 명 앞에는 접근제한자 public 이거나 없거나(default) 둘 중 하나만 존재함
// - public이 붙어 있으면 해당 파일의 주인이 된다. 다른 패키지에서 import 해서 사용 가능 
// - public이 없으면 해당 패키지 안에 있는 클래스 끼리만 사용 가능 
//  (왜냐하면 import 할 수 없기 때문에)
// 24. 클래스에 들어 갈 수 있는 접근제한자 기술(public, default)

 

// 1. 반복문
// - for() : 반복횟수가 정해져 있을 때 주로 사용
// - while() : 반복횟수가 정해져 있지 않을 때 주로 사용
// - do ~ while() : 무조건 한번 수행되는 반복문(조건식이 마지막에 있음)
//                  반복 여부를 결정하는 조건식이 맨 아래에 존재
// 2. 무한 반복문 while에서 1부터 10까지만 출력할 수 있는 방법을 제시하시오.
// - 단, while문에서 while(true) 유지하면 만점
// 3. 문자열 배열을 만들어서 "사과", "딸기", "오렌지"로 초기화
// 4. 구구단 출력 문제 : 2단만 출력 (싱글 for문 사용)
// 5. 4번과 같은 문제라 패스
// 6. 문자열 출력 하기
// 7. 배열의 얕은 복사, 깊은 복사를 설명하시오.
// - 얕은 복사란? 참조 변수 사용 시 변수에 값이 복사가 되지 않고 주소가 복사되는 것을 의미
                //==> 주소가 복사 됨
// - 깊은 복사란? 값이 복사
// 8. 배열의 깊은 복사를 할 수 있는 방법 세가지
// - for, arraycopy, copyOf
// 9. 배열의 특징 2가지 (같은 데이터 타입, 크기 변경 불가능, 여러개의 값을 연속으로 저장 할 수 있다.)
// - 같은 타입으로 연속으로 존재하는 유한의 데이터를 공간
// 10. int 자료형을 10개 담을 수 있는 공간 iArr을 생성하시오.
// 11. double 자료형을 5개 담을 수 있는 dArr을 생성
// 12. 13. 어떤 값이 출력되는지 묻는 문제 : int 배열의 경우 - 주소값이 출력 된다. 0
// - String 참조변수에 아무것도 대입되지 않으면 null (참조형에서 주소가 할당되어 있지 않을 때)
// - 객체를 만들고 아무것도 대입하지 않으면 이것도 null
// - null을 참조하는 객체를 호출하면 NullPointerException 에러 발생
// 14. 배열을 for문으로 출력하는 문제
// 15. 클래스 변수와 인스턴스 변수의 초기화 순서
// - 클래스 변수 : JVM이 정한 기본값 -> 명시적 초기화 -> 초기화 블록
// - 인스턴스 변수 : JVAM이 정한 기본값 -> 명시적 초기화 -> 초기화 블록  -> 매개변수 생성자
// - 클래스 변수 : 클래스 생성 시 초기화
// - 인스턴스 변수는 : 객체 생성시 생성자를 통해 초기화
// 16. memberId getter/setter 작성 문제
// 17. 접근제한자의 접근 가능 범위에 대해 기술 하시오.
// - private : 클래스 내에서만 접근 가능 (클래스 내부의 메소드를 통해 필드를 접근)
// - default : (키워드는 없음) 동일 패키지 내에서 접근 가능
// - protected : 동일 패키지 내에서 접근 가능, 만약 다른 패키지에 있더라도 상속 관걔이면 접근 가능
// - public : 모든 패키지에서 접근 가능
// 18. 필드에 들어 갈 수 있는 접근 제한자를 기술 하시오.
// (private, default, protected, public)
// - 필드란?  클래스 내부에서 사용되는 변수를 의미 함.
// 19. 메소드에 들어 갈 수 있는 접근 제한자 기술
// (private, default, protected, public)
// - 메소드란? 클래스 내부에서 사용되는 하나의 동작 기능 구현한 것
// - 메소드란 필드에 대해 값을 쓰거나 읽는 동작을 위해 사용 되기도 함. (게터/세터)
// 20. 객체지향 프로그램의 3대 특징에 대해 쓰시오.
// - 상속, 다형성(오버로딩, 오버라이딩), 캡슐화(데이터 은닉), 추상화 (상속시 인터페이스, extends)
// 21. 자바에서 클래스 변수, 인스턴스 변수, 지역 변수의 특징에 대해서 기술
// - 클래스 변수 : static 선언된 필드(멤버) 변수, 클래스에 소속, *객체로 만들어지지 않는다.
// - 프로그램 실행시 정적메모리영역에 할당 되고 프로그램 종료 시 소멸 된다.
// - 인스턴스 변수 : new에 의해서 *객체로 생성되는 변수(heap에 할당), this 참조 변수로 접근 가능
// - 지역 변수 : 메소드 또는 제어문 내에서 선언된 변수를 의미하고 stack영역에 생성됨.
// - 해당 메소드나 제어문을 벗어나면 자동 소멸된다.
// 22. 메소드 오버로딩에 대해서 설명 하시오.
// - 동일한 메소드 이름을 사용하고, 매개변수의 타입이나 개수로 메소드를 자동으로 호출 함.
// - 키워드 (동일한 메소드 이름, 매개변수, 반환 타입으로 결정되지 않는다.)
// 23. public class 클래스명{}, class 클래스명{} 차이가 무엇인지 설명?
// - 클래스 명 앞에는 접근제한자 public 이거나 없거나(default) 둘 중 하나만 존재함
// - public이 붙어 있으면 해당 파일의 주인이 된다. 다른 패키지에서 import 해서 사용 가능
// - public이 없으면 해당 패키지 안에 있는 클래스 끼리만 사용 가능
//  (왜냐하면 import 할 수 없기 때문에)
// 24. 클래스에 들어 갈 수 있는 접근제한자 기술(public, default)

 

<예외처리>

 

  • try{ // 예외 발생 가능성이 있거나, 예외를 반드시 처리해야 하는 코드 작성부 }
  • catch (처리할 예외클래스명 객체 1) { // 예외 상황 1에 대한 처리 코드 }
  • catch (처리할 예외클래스명 객체 2) { // 예외 상황 2에 대한 처리 코드 }
  • finally { // 예외 발생으로 try{} 안의 코드가 중단되더라도 반드시 실행해야 하는 코드 }

 

package 예외처리;


import java.util.Scanner;

// 예외처리란? 프로그램에서 예외 상황이 발생 했을 경우 프로그램의 갑작스러운 종료를 막고,
// 정상적인 동작을 유지 하도록 만들어 줌
public class ExceptionMain {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.print("정수를 입력 하세요 : ");
        int num = sc.nextInt();
        try{
            System.out.println(4/num);
            System.out.println("여기는 안 올 것 같음...");
        }catch (ArithmeticException e){
            System.out.println("나눗셈 에러 : " + e);
        }
         System.out.println("에러가 발생 했지만 계속 진행 함...");
    }
}

출력

정수를 입력 하세요 : 0
나눗셈 에러 : java.lang.ArithmeticException: / by zero
에러가 발생 했지만 계속 진행 함...

 

package 예외처리;


import java.util.Scanner;

// 예외처리란? 프로그램에서 예외 상황이 발생 했을 경우 프로그램의 갑작스러운 종료를 막고,
// 정상적인 동작을 유지 하도록 만들어 줌
public class ExceptionMain {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.print("정수를 입력 하세요 : ");
        int num = sc.nextInt();
        int[] arr = {1,2,3,4,5};
        try{
            System.out.println(arr[num]);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("배열 에러 : " + e); // e : 자바에서 제공하는 에러 문구
        }

    }
}

출력

정수를 입력 하세요 : 5
배열 에러 : java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5

<참고>

 

package 예외처리;


import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

// 예외처리란? 프로그램에서 예외 상황이 발생 했을 경우 프로그램의 갑작스러운 종료를 막고,
// 정상적인 동작을 유지 하도록 만들어 줌
// 파일 입출력에 대한 예외 처리
public class ExceptionMain {
    public static void main(String[] args){
        FileWriter f = null; // 참조 변수에 초기값 대입
        try {
            f = new FileWriter("test.txt");
            f.write("Hello Java");
        }catch (IOException e){
            e.printStackTrace(); // 디버깅용으로 사용하며 에러에 대한 Call Stack 저장
        // 어떤 예외가 발생하더라도 반드시 실행되어야 할 구문이 있으면 finally에 적어 줌
        }finally {
            if(f != null) {
                try {
                    f.close(); // 쓰기 위한 파일을 열고 난 다음 다 사용한 후 자원 반납하고 close진행
                } catch (IOException e) {

                }
            }
        }
        }
}

 

= IOException 에러

런타임 예외는 언제 에러가 발생하는지 알 수 없기 때문에 처리를 하지 않아도 되지만,

IOException은 예외가 발생할 시점과 종류를 알 수 있기 때문에 반드시 처리를 해주어야 하는 강제성을 띄게 된다.

Ioexception -> 입출력 에러

 

**예외 던지기, 만들기 보다 nullpointException체크를 해야함

 

package 예외처리던지기;

public class ThrowEx {
    String str = null; // str이라는 참조 변수가 아무것도 가리키고 있지 않다는 의미 (주소X)
    //String str = "" ; // 실제 문자열이 존재하지만 빈 문자열이라는 의미 (주소 O)
    public void printStr(int cnt){
        if(str == null){
            System.out.println("str이 null이다.");
            throw new NullPointerException(); // 디버깅을 위해서 일부러 nullpointException을 발생 시킴
        }
        for(int i = 0; i < cnt; i++){
            System.out.println("출력 : "+str);
        }
    }

}

출력

str이 null이다.
Exception in thread "main" java.lang.NullPointerException
	at 예외처리던지기.ThrowEx.printStr(ThrowEx.java:9)
	at 예외처리던지기.ExceptionThrowEx.main(ExceptionThrowEx.java:6)

 

package 사용자정의예외;
// 사용자 정의 예외 클래스 만들기
public class CustomExMain {
    public static void main(String[] args) {
        CheckEven ce = new CheckEven();
        int num1 = 100;
        int num2 = 99;
        try{
            System.out.println(ce.printEven(num1));
            System.out.println(ce.printEven(num2));
        } catch (EventsException e) {
            e.printStackTrace();
        }


    }
}
package 사용자정의예외;

public class CheckEven {
    private int num;
    public void setNum(int num) {
        this.num = num;
    }
    public int printEven(int number) throws EventsException{
        this.num = number;
        if(num % 2 != 0){
            throw new EventsException(num);
        }else{
            return  num;
        }
    }
}
package 사용자정의예외;
// Exception : 모든 예외 클래스의 조상 클래스

public class EventsException extends Exception{
    private Integer number = null; // 정수형에 대한 참조 타입
    public EventsException(int number){
        this.number = number; // Auto Boxing : 자동으로 형변환이 일어남
    }
    @Override
    public String getMessage() {
        if(number == null) {
            return "숫자가 아닙니다.";
        }else {
            return Integer.toString(number) +"는 짝수가 아닙니다.";
        }
    }
}

출력

100
사용자정의예외.EventsException: 99는 짝수가 아닙니다.
	at 사용자정의예외.CheckEven.printEven(CheckEven.java:11)
	at 사용자정의예외.CustomExMain.main(CustomExMain.java:10)