Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

정리정돈 개발블로그~

[8일차] 국비교육 본문

국비학원 교육 일지

[8일차] 국비교육

snooop 2022. 7. 28. 17:45

1. 상속 시 오버라이딩을 금지하는 방법

 

package 상속어드벤스;
//기본 클래스 : 상속을 주기위한 클래스
public class Car {
    int speed;
    String color;
    String name;
    final void accelerator(){ // 가속 기능, 
        // 부모 클래스에 final 을 붙이면 오버라이딩 금지 됨
         System.out.println("차의 속도를 증가 시킵니다.");
    }
    final void breakPanel(){
        System.out.println("차의 속도를 감소시킵니다.");
    }
}
//상속을 줄수 있지만 오버라이딩 안됨
class SportsCar extends Car {
    boolean isTurbo;
    SportsCar(String name) {
        isTurbo = false;//디폴트 값으로 false 지정, true 일때만 isTurbo만 실행
        speed = 280;
        color = "Red";
        this.name = name;
        this.color = color;
    }
    int getSpeed() { // getter 메소드 : 값을 읽기 위한 메소드
        if(isTurbo) return speed *= 1.2;
        return  speed;
    }
    boolean isTurbo(){
        return isTurbo;
    }
    void setTurbo(boolean turbo){
        isTurbo = turbo;
    }
    //final로 사용하니 에러뜸
    /*@Override
    void accelerator(){
        System.out.println("속도를 200% 증가합니다.");
    }
    @Override
    void breakPanel(){
        System.out.println("차의 정지 상태로 만듭니다.");
    }*/
    void infoCar(){
        System.out.println("이름 : " + name);
        System.out.println("속도 : " + getSpeed());
        //turbo 모드일때를 호출해야 하므로 클래스 내부의 메소드 호출
        System.out.println("색상 : " +  color);
        System.out.println("터보모드 : " + isTurbo);
    }
}
class ElectricCar extends Car {
    boolean isAutoDrv; // 자율주행 모드
    ElectricCar(String name){
        isAutoDrv = false;
        speed = 200;
        this.name = name;
        color = "White";
    }
    boolean isAutoDrv(){
        return isAutoDrv;
    }
    void setAutoDrv(boolean autoDrv){
        isAutoDrv = autoDrv;
    }
    void infoCar(){
        System.out.println("이름 : " + name);
        System.out.println("속도 : " + speed);
        //turbo 모드일때를 호출해야 하므로 클래스 내부의 메소드 호출
        System.out.println("색상 : " +  color);
        System.out.println("자율주행 모드 : " + isAutoDrv);
    }
}

 

 

package 상속어드벤스;
//상속을 할 수 없는 클래스를 만드는 방법
//String 상속을 할 수 없음
//오버라이딩 금지 방법
public class InheritanceEx2 {
    public static void main(String[] args){
         SportsCar sportsCar = new SportsCar("Ferrari");
         ElectricCar electricCar = new ElectricCar("아이오닉6");
         sportsCar.setTurbo(true);
         sportsCar.infoCar();
         electricCar.setAutoDrv(true);
         electricCar.infoCar();
         sportsCar.accelerator();
         sportsCar.breakPanel();
    }
}

 

출력

이름 : Ferrari
속도 : 336
색상 : Red
터보모드 : true
이름 : 아이오닉6
속도 : 200
색상 : White
터보모드 : true
차의 속도를 증가 시킵니다.
차의 속도를 감소시킵니다.

 

 <super>

 

package 상속어드벤스2;
// super : 자식클래스가 부모 클래스로 부터 상속 받은 멤버를 참조할 때 사용
// this : 인스턴스 필드와 매개변수를 구분하기 위해 사용하는 것과 유사
// super() : super 메소드, 부모 생성자를 호출, 부모 생성자가 디폴트이면 호출할 필요 없음
public class SuperMainEx {
    public static void main(String[] args){
         Child child = new Child(28);
         child.childMethod();
    }
}
class Parent {
    int x = 10;
    String name;
    Parent(){

    }

    Parent(int x){
        this.x = x;
    }
    Parent(String name){
      this.name = name;
    }
}
class Child extends  Parent {
    int x= 20;

    Child(int x) {
        super("우영우"); //매개변수가 있는 생성자의 경우 super 필요,(x)를 넣으면 매개변수가 있는것
        //()값이 없으면 없는 것을 호출
    }

    void childMethod() {
        System.out.println("x : " +x);
        System.out.println("this.x : " +this.x);// 자기자신을 참조
        System.out.println("super.x : " +super.x);
        // 자식클래스가 부모 클래스로 상속 받은 것을 표현
        System.out.println("이름 : " + name);
    }
}

출력

x : 20
this.x : 20
super.x : 10
이름 : 우영우

 

<종합예제>

package 상속종합TV;
// 양산 TV를 만들기 위해 선행 개발된 프로토타입
// 추상상속시 자식은 무조건 상속(양산화를 위함)
// --> 그러므로 추상 상속 하지 않음
public class PrototypeTV {
    boolean isPower; // 전원에 대한 설정값 저장
    int channel;     // 채널에 대한 설정값 저장
    int volume;      // 볼륨에 대한 설정값 저장
    public PrototypeTV() {} // 기본 생성자
    // 생성자 오버로딩
    public PrototypeTV(boolean isPower, int channel, int volume) { //생성자만듦
        this.isPower = isPower;
        this.channel = channel;
        this.volume = volume;
    }
    public void setChannel(int cnl){
        if(cnl > 0 && cnl < 500){
            channel = cnl;
        }else {
            System.out.println("채널 설정 범위를 벗어 났습니다.");
        }
    }
}

 

 

package 상속종합TV;
public class ProductTV extends PrototypeTV{
    String name;
    boolean isInternet; // 인터넷 모드 추가
    ProductTV(){ } //오버로딩
    ProductTV(String name){
        super(false, 3, 30);
        //부모 생성자부터 호출 해야함
        this.name = name;
    }
    void setPower (boolean power) {
        this.isPower = power;
    }
    void setVolume(int vol){
        if(vol >= 0 && vol <= 100){
            volume = vol;
        }else{
            System.out.println("볼륨 설정 범위를 벗어 났습니다.");
        }
    }
    @Override
    //오버라이딩: 부모와 이름이 같고 설정을 다른 경우
    public void setChannel(int cnl){
        if(cnl > 0 && cnl < 1000){
            channel = cnl;
            System.out.println("채녈을 " + channel + "로 변경 했습니다.");
        }else{
            System.out.println("채널 설정 범위가 아닙니다.");
        }
    }
    //메소드 오버로딩 : 동일한 이름의 메소드를 매개변수의 갯수나 타입으로 구분
    public void setChannel(int cnl, boolean internet){
        if(internet){
            System.out.println("인터넷모드 입니다.");
            isInternet = true;
        } else{
            isInternet = false;
            if(cnl > 0 && cnl < 1000){
                channel = cnl;
                System.out.println("채녈을 " + channel + "로 변경 했습니다.");
            }else{
                System.out.println("채널 설정 범위가 아닙니다.");
            }
        }

    }
    public void viewTV(){
        System.out.println("이름 : " +name);
        System.out.println("전원 : " +isPower);
        System.out.println("채널 : " +channel);
        System.out.println("볼륨 : " +volume);
        System.out.println("인터넷모드 : "+isInternet);

    }
}

 

package 상속종합TV;
// 상속 : Protype TV로부터 상속 받아서 Product TV를 만듦
// 오버라이딩 : 채널 설정을 499개에서 999개로 변경 함 (부모의 메소드 재정의) 
// 오버로딩 : 채널 설정을 오버로딩해서 인터넷 모드를 추가
// (동일한 메소드를 매개변수의 개수나 타입으로 자동 호출함) 
// Super() : Product TV생성자 호출 시 부모의 생성자를 호출함 
public class TvUpgradeMain {
    public static void main(String[] args){
         ProductTV lgTV = new ProductTV("우리집 TV");
         lgTV.setPower(true); // default 값 false로 뜸
         lgTV.setVolume(45);
         lgTV.setChannel(3, true);
         lgTV.viewTV();
    }
}

 

인터넷모드 입니다.
이름 : 우리집 TV
전원 : true
채널 : 3
볼륨 : 45
인터넷모드 : true

 

<알고리즘>

package 알고리즘_나머지;
// 10개의 수를 입력 받음
// 입력 받은 수를 42로 나눈 나머지 중 다른 것이 몇개인지 출력
// 42 % 42 = 0
// 44 % 42 = 2
// 84 % 42 = 0
// 1 % 42 = 1
// 5 % 42 = 5
// 86 % 42 = 4
// 88 % 42 = 10
// 11 % 42 = 11
// 13 % 42 = 13
// 9개로 출력

import java.util.Scanner;

public class ModMainEx {
    public static void main(String[] args){
        // 10개의 임의의 수를 입력받기 위한 스캐너 생성
        Scanner sc = new Scanner(System.in);

        // 42로 나눈 나머지는 0~4까지이기 때문에 42의 정수 배열 만들기
        int[] arr = new int[42];
        int cnt = 0;//중복된 개수를 누적하기 위한 변수
        int n; //임의의 정수값을 입력 받기 위한 변수
        // 임의의 10개의 정수 입력 받기 위해 반복문 만들기
        System.out.print("입력값 : ");
        for(int i = 0; i < 10; i++) {
            n = sc.nextInt();// 임의의 정수값을 입력 받음
            // 반복문을 돌면서 임의의 정수값을 입력 받고 42로 나눈 배열에 1을 넣음
            arr[n % 42] = 1; // 나눈 나머지를 배열의 인덱스 변환해서 1을 넣어줌
            // n%42를 나눈 값이 배열 번호와 일치 하므로 1을 넣어줌

        }
        for(int i = 0; i < arr.length; i++){
            cnt += arr[i]; // 1인 값이 다 더해짐
            //결과출력

        }

        System.out.println("결과 : "  + cnt);
    }
}

출력

입력값 : 1 2 3 4 4 5 5 6 6 7 
결과 : 7

 

package 요금제계산하기;

import java.util.Scanner;

// 영식(Y) 요금제 : 30초당 10원 (30초가 되면 2통이 됨)
// 민식(M) 요금제 : 60초당 15원 (60초가 되면 2통이 됨) 
// 입력 : 통화 횟수가 첫째줄에 입력되고 통화 횟수에 대한 시간이 각각 입력됨
// 만약 총 요금이 같은 경우 Y M 통화 요금
// 3(통화 횟수) : 총 통화 횟수는 20을 넘지 않는다.
// 65 45 23 (각각의 통화 시간)
// M 통화에 대한 총 금액
// 통화횟수 : 3
// 통화시간 : 40 40 40
// 요금제 및 요금 : M 45
public class PriceCalcEx {
    public static void main(String[] args) {
        // 통화 횟수에 대한 배열을 만듦 (20개)
        int[] call = new int[20];
        int yPare = 0, mPare = 0; // 영식과 민식 요금제를 구하기위한 변수
        // 스캐너를 만들어 통화횟수를 입력 받음
        Scanner sc = new Scanner(System.in);
        System.out.print("통화횟수 입력 : ");
        int cnt = sc.nextInt();
        // 반복문을 돌면서 통화횟수에 대한 통화 시간을 배열을 넣음
        for (int i = 0; i < cnt; i++) {
            call[i] = sc.nextInt();
        }
        // 통화횟수 만큼 반복문을 돌면서 요금을 계산해서 누적함 -> 총 요금을 구해야하므로
        for (int i = 0; i < cnt; i++) {
            yPare += (call[i] / 30) * 10 + 10;// 기본 1통화 + (30초당 1통)
            mPare += (call[i] / 60) * 15 + 15;//mPare = mPare + (call[i] / 60) * 15 +15
        }
        // 영식요금제와 민식 요금제를 비교해서 싼 요금제를 출력함
        // 같으면 Y M으로 출력
      if(yPare > mPare){
          System.out.println("M " + mPare);
      }else if(yPare < mPare){
          System.out.println("Y " + yPare);
      }else{
          System.out.println("Y M "+yPare);
      }
    }
}

출력

통화횟수 입력 : 3
40 48 50
M 45

 

 

package 에어컨만들기;

import java.util.Calendar;
import java.util.Scanner;

// 필드와 메소드
// 전원 : ON/OFF (boolean)
// 온도 설정 기능 : int
// 현재 온도 표시 기능 : int
// Cooler ON/OFF (boolean)
// Heater On/OFf (boolean)
// 바람세기 (1단/2단/3단)
// 타이머, 리모콘 기능 생략
// 현재 온도가 변경될 때 화면에 에어컨 정보를 표시하도록 함.

public class AirCon {
    private boolean isPower; // 전원 제어
    private int setTemp;     // 온도 설정
    private int currTemp;    // 현재 온도
    private boolean isCooler; // 에어컨 제어
    private boolean isHeater; // 히터 제어
    private int windStep;     // 바람세기 (1단/2단/3단)
    AirCon() { // 생성자는 에어컨이라는 객체가 만들어질 때 어떤 상태로 시작해야 될지를 결정
        //final 은 배열안에 있는 값 수정 불가능
        final int[] monthTemp = {-5, 3, 9, 15, 22, 26, 30, 31, 24, 26, 9, 3};
        Calendar now = Calendar.getInstance(); // 운영체제로부터 현재의 날짜 정보를 가져옴.
        int month = now.get(Calendar.MONTH); // 배열의 인덱스로 넘어 옴, 0번째에 1월이 들어옴.
        currTemp = monthTemp[month];// 현재의 달 온도를 배열로부터 가져옴.
        isPower = false; // 에어컨 초기 상태는 꺼져있음
        setTemp = 18;    // 에어컨의 초기 설정 온도 지정
        isCooler = false;
        isHeater = false;
        windStep = 1;
    }
    void airConInfo(){
        String onOffStr = (isPower) ?  "ON" :"OFF";
        String heaterStr = (isHeater) ?  "ON" :"OFF";
        String coolerStr = (isCooler) ?  "ON" :"OFF";
        final String[] windStr = {"", "1단계", "2단계", "3단계"};
        //값을 바꾸는 것이 아니라 화면에 출력을 하기 위함이므로 final
        System.out.println("=========에어컨 정보==========");
        System.out.println("전원 : " + onOffStr);
        System.out.println("현재 온도 : " + currTemp);
        System.out.println("설정 온도 : " + setTemp);
        System.out.println("히터 : " + heaterStr);
        System.out.println("쿨러 : " +coolerStr);
        System.out.println("바람세기 : " +windStr[windStep]);
    }
    void setAirCon() {
        // 에어컨 설정을 위해 스캐너 객체 생성
        Scanner sc = new Scanner(System.in);
        System.out.println("현재 온도가 " + currTemp + "입니다.");
        System.out.print("온도를 설정하세요 : ");
        setTemp = sc.nextInt(); // 스캐너로부터 현재 온도를 입력받아 setTemp 넣어줌
        System.out.println("설정 온도는 " + setTemp +"입니다.");
        System.out.print("바람 세기를 설정 [1]1단, [2]2단, [3]3단 : ");
        windStep = sc.nextInt();
        if(currTemp > setTemp){
            System.out.println("Cooler 가 동작 합니다.");
            isCooler = true; // 에어컨이 켜졌음
            isHeater = false; // 확실히 하기 위해 넣는 코드
        }else if(currTemp < setTemp){
            System.out.println("Heater 가 동작 합니다.");
            isCooler = false;
            isHeater = true;
        }else{
            isCooler = false;
            isHeater = false;
        }
    }
    // 전원 설정
    void setPower(boolean power) {
        isPower = power;
    }
    // 바람세기 확인
    int getWindStep() {
        return windStep;

    }
    // 히터 상태 확인
    boolean isHeater() {
        return isHeater;
    }
    // 쿨러 상태 확인
    boolean isCooler(){
        return isCooler;
    }
    // 현재 온도 변경
    void setCurrTemp(int n) {
        currTemp += n;
    }
    // 현재 온도 확인
    int getCurrTemp() {
        return currTemp;
    }
    // 설정 온도 확인
    int getSetTemp(){
        return setTemp;
    }
}

 

에어컨만들기;

import java.util.Scanner;

import static java.lang.Thread.sleep;

public class AirConMain {
    public static void main(String[] args) throws InterruptedException {
        AirCon lgAirCon = new AirCon();
        Scanner sc = new Scanner(System.in);
        int elapsedTime = 0; // 경과 시간 계산
        boolean isSetTemp = false; // 온도를 변경하는 조건 체크
        System.out.print("에어컨을 켜시겠습니까?(yes/no) : ");
        String isON = sc.next();
        if(isON.equalsIgnoreCase("yes")){
            lgAirCon.setPower(true);
            lgAirCon.setAirCon();
            while(true){ //1초마다(1000millis = 1초) while 문 돌림
                sleep(1000);
                // Sleep 메서드는 객체가 중단 될 때까지 객체에 대한 잠금을 해제하지 않습니다.
                elapsedTime++; // 경과 시간을 누적함
                switch (lgAirCon.getWindStep()){
                    case 1 : if(elapsedTime >= 60) isSetTemp = true; break;
                    case 2 : if(elapsedTime >= 30) isSetTemp = true; break;
                    case 3 : if(elapsedTime >= 20) isSetTemp = true; break;
                    default : if(elapsedTime >= 61) isSetTemp = true; break;
                }//elaspseTime이 누적 되면서 case1에 경우 60초에 1도씩 내리는 sleep 메소드이고
                //case2는 30초보다 시간이 클때, case3는 20초보다 클때 온도세팅을 함
                if(isSetTemp){
                    if(lgAirCon.isHeater()) lgAirCon.setCurrTemp(1);
                    if(lgAirCon.isCooler()) lgAirCon.setCurrTemp(-1);
                    //setCurrTemp 설정에 따라 case 초마다 setCurrTemp 식에 1또는 -1대입됨
                    lgAirCon.airConInfo();
                    isSetTemp = false; // 다시 초기화
                    elapsedTime = 0; // 다시 초기화
                }
                if(lgAirCon.getCurrTemp() == lgAirCon.getSetTemp()){
                    //현재온도와 설정온도가 같으면 종료
                    System.out.println("에어컨을 종료합니다.");
                    break;
                }

            }
        }
    }



}

출력

에어컨을 켜시겠습니까?(yes/no) : yes
현재 온도가 30입니다.
온도를 설정하세요 : 25
설정 온도는 25입니다.
바람 세기를 설정 [1]1단, [2]2단, [3]3단 : 1
Cooler 가 동작 합니다.
=========에어컨 정보==========
전원 : ON
현재 온도 : 29
설정 온도 : 25
히터 : OFF
쿨러 : ON
바람세기 : 1단계
=========에어컨 정보==========
전원 : ON
현재 온도 : 28
설정 온도 : 25
히터 : OFF
쿨러 : ON
바람세기 : 1단계
=========에어컨 정보==========
전원 : ON
현재 온도 : 27
설정 온도 : 25
히터 : OFF
쿨러 : ON
바람세기 : 1단계
=========에어컨 정보==========
전원 : ON
현재 온도 : 26
설정 온도 : 25
히터 : OFF
쿨러 : ON
바람세기 : 1단계
=========에어컨 정보==========
전원 : ON
현재 온도 : 25
설정 온도 : 25
히터 : OFF
쿨러 : ON
바람세기 : 1단계
에어컨을 종료합니다.

 

3. instance of

 

package 객체타입확인;
// instanceof : 객체 타입을 확인하는 연산자
// 주로 상속 관계에서 부모 객체인지 자식 객체인지 확인
// 주로 형변환 가능 여부 확인용으로 사용 (true인 경우는 형변환이 가능하는 의미)
// 왼쪽은 참조 변수(parent,child,자식), 오른쪽은 클래스 타입(부모)
public class InstanceMain {
    public static void main(String[] args){
        Parent parent = new Parent("부모");
        Child child = new Child("자식");
        System.out.println(parent instanceof Parent);
        System.out.println(child instanceof Parent);
        System.out.println(parent instanceof Child);
        System.out.println(child instanceof Child);
        //부모는 자식의 객체를 마음대로 사용하지 못하므로 Child는 사용 못함
    }
}
class Parent {
    String name;
    public Parent(String name) {
        this.name = name;
    }
}
class Child extends Parent{
    String name;
    public Child(String name) {
        super(name);
        this.name = name;
    }
}

 

 

출력

true
true
false
true

4.매개변수의 다형성

 

package 매개변수의다형성;
// 운전자 클래스

public class Driver {
    String name;

    public Driver(String name) {
        this.name = name;
    }
    void drive(Vehicle vehicle) {
        System.out.print(name + "의 ");
        vehicle.run();
    }
}
package 매개변수의다형성;

import java.util.Scanner;

// 자동 타입 변환
public class TypeCastMain {
    public static void main(String[] args) {
        Driver driver = new Driver("우영우");
        Vehicle vehicle = new Vehicle();
        Bus bus = new Bus();
        Taxi taxi = new Taxi();
        Truck truck = new Truck();
        SportsCar sportsCar = new SportsCar();

        //instanceof 예시
        System.out.println(bus instanceof Vehicle);
        System.out.println(taxi instanceof Vehicle);
        System.out.println(truck instanceof Vehicle);
        System.out.println(truck instanceof Vehicle);
        System.out.println(vehicle instanceof Truck);
        //상속관계가 아니기 때문에 false



        Scanner sc = new Scanner(System.in);
        System.out.print("운전하고 싶은 차를 선택 [1]버스 [2]택시 [3]스포츠카 : ");
        int selectCar = sc.nextInt();
        switch (selectCar){
            case 1 : driver.drive(bus); break;
            case 2 : driver.drive(taxi); break;
            case 3 : driver.drive(sportsCar); break;
            case 4 : driver.drive(truck); break;
            //상속관계가 없으면 에러남 */
        }
    }
}
package 매개변수의다형성;

public class Vehicle {
    public void run(){
        System.out.print("차량이 달립니다.");
    }
}
class Bus extends Vehicle{
    @Override
    public void run(){
        System.out.print("버스가 달립니다.");
    }
}
class Taxi extends Vehicle{
    @Override
    public void run(){
        System.out.print("택시가 달립니다.");
    }
}
class SportsCar extends Vehicle {
    @Override
    public void run() {
        System.out.print("스포츠카가 달립니다.");
    }
}

class Truck extends Vehicle{
    public void run() {
        System.out.print("트럭이 달립니다.");
    }
}

출력

true
true
true
true
false
운전하고 싶은 차를 선택 [1]버스 [2]택시 [3]스포츠카 : 1
우영우의 버스가 달립니다.

'국비학원 교육 일지' 카테고리의 다른 글

[10일차] 국비교육  (0) 2022.08.01
[9일차] 국비교육  (0) 2022.07.29
[7일차] 국비교육  (0) 2022.07.27
[6일차] 국비교육  (0) 2022.07.26
[5일차] 국비교육  (0) 2022.07.25