정리정돈 개발블로그~
[11일차] 국비교육 본문
<추상화 문법, 싱글톤, 인터페이스 절반, 클래스 연습문제 >
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 |