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
관리 메뉴

정리정돈 개발블로그~

[11일차] 국비교육 본문

국비학원 교육 일지

[11일차] 국비교육

snooop 2022. 8. 2. 17:48

<추상화 문법, 싱글톤, 인터페이스 절반, 클래스 연습문제 >

 

1.싱글톤

 

  • 전역개체 필요

<예제1>

package 싱글톤연습;

public class Singleton {
    String name;
    int id;
    private static Singleton singleton = new Singleton();
    // static으로 정적 객체 만듦, private이라 getSingleton으로 불러줌
    private  Singleton() {
        name = "test";
        id = 100;
    }
    static Singleton getSingleton(){
        return singleton;
    }
}

 

package 싱글톤연습;
// 프로그램 전체에서 단 하나의 객체로 존재
// 장점 :  메모리 절약, 클래스간의 데이터 공유가 주 목적
// 동시접속 어려움 -> 해결: 자바 - 싱크로나이즈(성능 100배 느려짐)

public class SingletonMain {
    public static void main(String[] args){
        // 객체 생성이 안됨
        //Singleton test = new Singleton();
        Singleton single1 = Singleton.getSingleton();
        Singleton single2 = Singleton.getSingleton();
        if(single1 == single2){
            System.out.println("같은 싱글톤 객체 입니다.");
        }else{
            System.out.println("다른 싱글톤 객체 입니다.");
        }
        System.out.println(single1.id);
        System.out.println(single1.name);
        System.out.println(single2.id);
        System.out.println(single2.name);
        single1.id = 200;
        single1.name = "우영우";
        System.out.println(single2.id);
        System.out.println(single2.name);

    }
}

<예제 2>

package 싱글톤연습;

public class Test1 {
    Singleton single = Singleton.getSingleton();

    void setInfo(String name, int id){
        single.name = name;
        single.id = id;
    }

    void viewInfo(){
        System.out.println("이름 : " + single.name);
        System.out.println("아이디 : " +  single.id);
    }
}
package 싱글톤연습;

public class Test2 {
    Singleton single = Singleton.getSingleton();

    void setInfo(String name, int id){
        single.name = name;
        single.id = id;
    }

    void viewInfo(){
        System.out.println("이름 : " + single.name);
        System.out.println("아이디 : " +  single.id);
    }

}

 

package 싱글톤연습;

public class Singleton {
    String name;
    int id;
    private static Singleton singleton = new Singleton();
    // static으로 정적 객체 만듦, private이라 getSingleton으로 불러줌
    private  Singleton() {
        name = "test";
        id = 100;
    }
    static Singleton getSingleton(){
        return singleton;
    }
}
package 싱글톤연습;
// 프로그램 전체에서 단 하나의 객체로 존재
// 장점 :  메모리 절약, 클래스간의 데이터 공유가 주 목적
// 동시접속 어려움 -> 해결: 자바 - 싱크로나이즈(성능 100배 느려짐)

public class SingletonMain {
    public static void main(String[] args){
        Test1 test1 = new Test1();
        Test1 test2 = new Test2();
        test1.setInfo("동그라미", 27);
        test2.viewInfo();
    }
}

 

출력

이름 : 동그라미
아이디 : 27

 

 

2. 추상클래스와 인터페이스

 

<추상클래스>

  1) 추상메소드

  • 자식클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드
  • 목적 :  추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상메소드를 구현하도록 하기 위함

2) 추상 클래스 --> 읽어보기

  • 다형성을 가지는 메소드의 집합 
  • 하나 이상의 추상 메소드를 포함하는 클래스를 가리킴
  •  

 

 

<예제>

 

 

package 추상클래스;
// 추상 클래스를 만들기 위해서는 class 이름앞에 abstract 키워드 필요

public abstract class Animal {
    abstract void cry();
    // 선언만 있고 구현부가 없어야 함. 추상메소드는 바디{}가 있으면 안됨
}
class Cat extends Animal{

    @Override
    void cry() {
        System.out.println("냐옹냐옹");
    }
}
class Dog extends Animal{

    @Override
    void cry() {
        System.out.println("멍멍!!");
    }
}
package 추상클래스;

public class AbstractMain {
    public static void main(String[] args){
        /*Animal animal = new Animal();*/
        // 안됨. : 객체 생성 X - 싱글톤, 추상클래스
        // 추상클래스는 상속을 위한 클래스 이므로 되지 않음

        Cat cat = new Cat();
        Dog dog = new Dog();
        cat.cry();
        dog.cry();

    }
}

 출력

냐옹냐옹
멍멍!!

 

<추상클래스 예제2>

 

 

package 추상클래스2;

public abstract class Phone {
    public String name;
    public boolean isPower;
    public Phone(String name){
        this.name = name;
    }
    public void setPower(boolean isPower){
        this.isPower = isPower;
        if(isPower){
            System.out.println("Phone Power ON");
        }else {
            System.out.println("Phone Power OFF");
        }
    }
    abstract void call();
     //인터페이스 상속
}

 

package 추상클래스2;

public class SmartPhone extends Phone {

    // public Phone에 매개변수(String name)이 있기 때문에 super 필요함.
    public SmartPhone(String name) {
        super(name); // 부모의 생성자를 호출
    }

    @Override
    void call() {
        System.out.println("부모의 요청으로 통화기능을 완성 합니다.");
    } // 부모에 만들어 놓기만 하고 구현은 여기서 함, 실체가 있는 상속은 하나만 됨

    public void internet(){
        System.out.println("인터넷을 검색 합니다.");
    }
}
package 추상클래스2;

public class AbstractMain2 {
    public static void main(String[] args){
       SmartPhone smart = new SmartPhone("Galaxy G-Flip");
       smart.setPower(true);
       smart.internet();
       smart.call();

    }
}

 

출력

 

Phone Power ON
인터넷을 검색 합니다.
부모의 요청으로 통화기능을 완성 합니다.

 

3. 인터페이스 

  • 자바에서는 다중상속은 안되지만 지원을 위해 인터페이스를 사용
  • 인터페이스: 다른 클래스를 작성할 때 기본이 되는 틀 제공 , 다른 클래스 사이의 중간 매개 역할 담당 --> 일종의 추상 클래스 의미

 

<예제>

package 인터페이스1;

public interface NetworkAdapter {
    void connect();
    // abstract 키워드 생략 가능 ->
    // 인터페이스 내에서는 추상화이기 때문(일반메소드 올 수 없음. 단, 예외가 있다)
}

class LAN implements NetworkAdapter {
    String company;
    LAN(String company){
        this.company = company;
    }

    @Override
    public void connect() {
        System.out.println(company + "LAN에 연결 되었습니다.");
    }
}
class WiFi implements NetworkAdapter{
    String company;
    WiFi(String company) {
        this.company = company;
    }
    @Override
    public void connect() {
        //connect 기능은 독립적으로 봄 -> 함께 본다면 기능에 따라 코드가 달라짐
        System.out.println(company + "WiFi에 연결 되었습니다.");
    }
}
class FiveG implements NetworkAdapter{
      String company;
      FiveG(String company){
         this.company= company;
}

    @Override
    public void connect() {
          System.out.println(company + "5G에 연결 되었습니다.");

    }

 

package 인터페이스1;

import java.util.Scanner;

// 인터페이스는 추상 클래스와 마찬가지로 객체 생성이 안됨
// 인터페이스에 포함된 추상 메소드를 실제 구현 할 클래스가 필요
public class NetworkMain {
    public static void main(String[] args) {
        NetworkAdapter adapter;
        Scanner sc = new Scanner(System.in);
        System.out.print("연결할 네트워크를 선택 [1]LAN, [2]WiFi, [3]5G : ");
        int num = sc.nextInt();
        switch (num){
            case 1 :
                adapter = new LAN("KT Mega pass ");
                adapter.connect();
                break;
            case 2:
                adapter = new WiFi("SKT Telecom ");
                adapter.connect();
                break;
            case 3:
                adapter = new FiveG("LG U+ ");
                adapter.connect();
                break;
            default:
                System.out.println("네트워크 선택이 잘 못 되었습니다.");
        }
    }
}

 

출력

연결할 네트워크를 선택 [1]LAN, [2]WiFi, [3]5G : 1
KT Mega pass LAN에 연결 되었습니다.

 

<예제2>

 

package 인터페이스2;

public interface NetworkAdapter {
    void connect(); // 추상 메소드
}
class Chat{
    public void sendMsg(){
        System.out.println("메시지를 보냅니다.");
    }
    public void rcvMsg(){
        System.out.println("메시지를 받습니다.");
    }
}
class LAN extends Chat implements NetworkAdapter {
// 동시에 상속 받음
    String company;
    String name;
    LAN(String company, String name){
        this.company = company;
        this.name = name;
    }
    @Override
    public void connect() {
        System.out.println(company + " LAN에 연결 되었습니다.");
    }
    @Override
    public void sendMsg(){
        System.out.println(name + "에게 메시지를 보냅니다.");
    }
    @Override
    public void rcvMsg(){
        System.out.println(name + "으로 부터 메시지를 받습니다.");
    }
}
class WiFi implements NetworkAdapter{
    String company;
    String name;
    WiFi(String company, String name){
        this.company = company;
        this.name = name;

    }

    @Override
    public void connect() {
        System.out.println(company + " WiFi에 연결되었습니다.");
    }
    //상속 안받았으므로 @Override 에러 남
    public void sendMsg(){
        System.out.println(name + "에게 메시지를 보냅니다.");
    }
    public void rcvMsg(){
        System.out.println(name + "으로 부터 메시지를 받습니다.");
    }
}
class FiveG implements NetworkAdapter{
    String company;
    FiveG(String company){
        this.company = company;
    }

    @Override
    public void connect() {
        System.out.println(company + "5G에 연결 되었습니다.");
    }
package 인터페이스2;

import java.util.Scanner;

public class NetworkMain2 {
    public static void main (String[] args){
        NetworkAdapter adapter;
        Scanner sc = new Scanner(System.in);
        System.out.print("연결할 네트워크 선택 [1]LAN [2]WiFi, [3]5G : ");
        int num = sc.nextInt();
        switch(num){
            case 1 :
                adapter = new LAN("KT Mega Pass", "우영우");
                adapter.connect();
                ((LAN)adapter).sendMsg();
                ((LAN)adapter).rcvMsg();
                break;
            case 2 :
                adapter = new WiFi("SK Telecom", "이준호");
                adapter.connect();
                ((WiFi) adapter).sendMsg();
                ((WiFi) adapter).rcvMsg();
                break;
            case 3 :
                adapter = new FiveG("LG U+");
                adapter.connect();
                break;
            default:
                System.out.println("네트워크 선택이 잘 못 되었습니다.");
        }
    }
}

 

출력

 

연결할 네트워크 선택 [1]LAN [2]WiFi, [3]5G : 1
KT Mega Pass LAN에 연결 되었습니다.
우영우에게 메시지를 보냅니다.
우영우으로 부터 메시지를 받습니다

 

연결할 네트워크 선택 [1]LAN [2]WiFi, [3]5G : 3
LG U+5G에 연결 되었습니다.

<인터페이스3>

 

package 인터페이스3;
// 인터페이스에 포함되는 것들
// 형태가 없음--> 객체만들 수 없음 (인스턴스 필드 만들 수 없다)
// 상수 : 모든 필드는 자동으로 상수(final static)로 변환된다.
// 메소드 : 모든 메소드는 추상메소드로 변경된다. (자동으로 abstract 붙는다.)
// <예외>
// 디폴트메소드 : 구현부를 가짐. 상속 받은 클래스가 재정의 사용 가능
//              기능개선을 위함
// 정적 메소드 : static, 객체와 상관없이 인터페이스 타입으로 사용

public interface RemoteControl {
    int MAX_VOLUME = 100; // 인스턴스 필드이므로 상수로 간주함
    // 자동으로 final static 이 붙는다.
    int MIN_VOLUME = 0;

    void turnON();     // 자동으로 abstract 가 붙는다.
    void turnOFF();
    void setVolume (int volume);
    // 디폴트 메소드 : jdk 1.8 이후에 추가 됨, default 키워드를 사용함.
                    
    default void setMute(boolean mute){
        if(mute) System.out.println("무음 처리 합니다.");
        else System.out.println("무음 해제 합니다.");
    }
    static void changeBattery(){
        System.out.println("건전지를 교환 합니다.");
    }

}

 

package 인터페이스3;

public class Audio implements RemoteControl{
    private int volume;
    @Override
    public void turnON() {
        System.out.println("Audio 를 켭니다.");
    }

    @Override
    public void turnOFF() {
      System.out.println("Audio 를 끕니다 .");
    }

    @Override
    public void setVolume(int volume) {
      if(volume > RemoteControl.MAX_VOLUME){
          this.volume = RemoteControl.MAX_VOLUME;
          // MAX_VOLUME은 인터페이스에서 불러옴
      }else if(volume < RemoteControl.MIN_VOLUME){
          this.volume = RemoteControl.MIN_VOLUME;
      }else{
          this.volume = volume;
      }
      System.out.println("현재 Audio 볼륨 : " +  this.volume);
    }
    //위쪽은 인터페이스에서 구현해달라고 한것들
    //새로 추가된 메소드
    void getInfo(){
        System.out.println("오디오 입니다.");
        System.out.println("현재 볼륨은 " + volume +" 입니다.");
    }
    public void setMute(boolean mute){
        if(mute) System.out.println("오디오를 무음 처리합니다.");
        else System.out.println("오디오를 무음 처리를 해제합니다.");
    }
}
package 인터페이스3;

public class Television implements RemoteControl {
    private int volume;
    // 디폴트 메소드 꼭 구현 안해줘도 됨
    @Override
    public void turnON() {
        System.out.println("TV 를 켭니다.");
    }

    @Override
    public void turnOFF() {
        System.out.println("TV 를 끕니다.");
    }

    @Override
    public void setVolume(int volume) {
        if(volume > RemoteControl.MAX_VOLUME){
            this.volume = RemoteControl.MAX_VOLUME;

        }else if(volume < RemoteControl.MIN_VOLUME){
            this.volume = RemoteControl.MIN_VOLUME;
        }else{
            this.volume = volume;
        }
        System.out.println("현재 TV 볼륨 : " +  this.volume);
    }

 

import java.util.Scanner;

public class RemoteMain {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.print("제품 선택 [1]TV, [2]Audio : ");
        int selectMenu = sc.nextInt();
        RemoteControl remoCon;
        if(selectMenu == 1){
            remoCon = new Television();
            remoCon.turnON();
            remoCon.setVolume(20);
            remoCon.setMute(true);
            // 인터페이스 소속의 static 메소드
            RemoteControl.changeBattery();
        }else{
            remoCon = new Audio();
            remoCon.turnON();
            remoCon.setVolume(30);
            remoCon.setMute(true);
        }
    }

 

출력

 

제품 선택 [1]TV, [2]Audio : 1
TV 를 켭니다.
현재 TV 볼륨 : 20
무음 처리 합니다.
건전지를 교환 합니다.

 

제품 선택 [1]TV, [2]Audio : 2
Audio 를 켭니다.
현재 Audio 볼륨 : 30
오디오를 무음 처리합니다.

 

[내 풀이]

<클래스 연습문제_자동차>

 

package 클래스연습문제_자동차;

public abstract class vehicle {

    abstract void option();
    boolean isMode;
    int maxSpeed; int fe;  int fuelSize; int seatCnt; String name;
   public vehicle(String name) {
        this.maxSpeed = 120;
        this.fe = 10;
        this.fuelSize = 30;
        this.seatCnt = 4;
        this.name = name;
    }
}
class SportsCar extends vehicle {



    public SportsCar(String name) {
        super(name);
        maxSpeed = 250;
        fe = 8;
        fuelSize = 30;
        seatCnt = 2;
        this.name = name;


    }
    @Override
    void option() {
        if(isMode) maxSpeed *=1.2;

    }
    int getMovingCnt(int passCnt){
        if(passCnt % seatCnt != 0){
            return (passCnt / seatCnt) +1;
        }else return passCnt/seatCnt;
    }


}

class Car extends vehicle{


    public Car(String name) {
        super(name);

        maxSpeed = 200;
        fe = 12;
        fuelSize = 45;
        seatCnt = 4;
        this.name = name;
    }
    @Override
    void option() {
        if(isMode) seatCnt +=1;

    }
    int getMovingCnt(int passCnt){
        if(passCnt % seatCnt != 0){
            return (passCnt / seatCnt) +1;
        }else return passCnt/seatCnt;
    }

}

class Bus extends vehicle{

    public Bus(String name) {
        super( name);

        maxSpeed = 150;
        fe=5;
        fuelSize= 100;
        seatCnt = 20;
        this.name = name;

    }
    @Override
    void option() {
        if(isMode)  fuelSize += 100;


    }
    int getMovingCnt(int passCnt){
        if(passCnt % seatCnt != 0){
            return (passCnt / seatCnt) +1;
        }else return passCnt/seatCnt;
    }

 

package 클래스연습문제_자동차;

import 매개변수의다형성.Vehicle;

import java.util.Scanner;

public class vehicleMain {
    public static void main(String[] args){
        Vehicle vehicle = new Vehicle();
        int[] local ={0, 400, 200, 150, 300};

        Scanner sc = new Scanner(System.in);
        System.out.print("이동 지역을 선택  [1]부산 [2]대전 [3]강릉 [4]광주 : ");
        int n = sc.nextInt();
        System.out.print("승객 수 : ");
        int passCnt = sc.nextInt();
        System.out.print("이동 차량을 선택 [1]스포츠카, [2]승용차, [3]버스 : ");
        int carNum = sc.nextInt();


        switch(carNum){
            case 1 :  SportsCar sportsCar = new SportsCar("스포츠카");
            System.out.println("총 비용 산출 : " + (local[n]/sportsCar.fe*2000) *sportsCar.getMovingCnt(passCnt) );
            System.out.printf("주유 횟수 : %.2f" , (double)local[n]/sportsCar.fe/sportsCar.fuelSize);
            System.out.println();
            System.out.printf("총 시간 계산 : %.2f", (double)local[n]*sportsCar.getMovingCnt(passCnt)/sportsCar.maxSpeed);
            break;
            case 2 : Car car = new Car("자동차");
            System.out.println("총 비용 산출 : " + local[n]/car.fe *2000 *car.getMovingCnt(passCnt) );
            System.out.printf("주유 횟수 : %.2f " , (double)local[n]/car.fe/car.fuelSize);
            System.out.println();
            System.out.printf("총 시간 계산 : %.2f" , (double)local[n]*car.getMovingCnt(passCnt)/car.maxSpeed);
            break;
            case 3 : Bus bus = new Bus("버스");
            System.out.println("총 비용 산출 : " + local[n]/bus.fe *2000 *bus.getMovingCnt(passCnt));
            System.out.printf("주유 횟수 : %.2f " , (double)local[n]/bus.fe/bus.fuelSize);
            System.out.println();
            System.out.printf("총 시간 계산 : %.2f ", (double)local[n]*bus.getMovingCnt(passCnt)/bus.maxSpeed);
            break;
            default:
                System.out.println("선택이 잘 못 되셨습니다.");
        }

    }
}

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

[13일차] 국비교육  (0) 2022.08.04
[12일차] 국비교육  (0) 2022.08.03
[10일차] 국비교육  (0) 2022.08.01
[9일차] 국비교육  (0) 2022.07.29
[8일차] 국비교육  (0) 2022.07.28