학생 클래스
package classpart;
public class Student {
public String name;
public int money;
public Student(){}
public Student(String name, int money) {
this.name = name;
this.money = money;
}
public void takeBus(Bus bus){
this.money -= 1000;
bus.take(1000);
}
public void takeSubway(Subway subway){
this.money -= 1500;
subway.take(1500);
}
public String getName() {
return name;
}
public int getMoney() {
return money;
}
public void showInfo(){
System.out.println(this.getName()+"의 남은돈은"+this.getMoney());
}
}
버스 클래스
package classpart;
public class Bus {
public int busNum;
public int income =0;
public int passenger;
public Bus(int busNum) {
this.busNum = busNum;
}
public void take(int money){
passenger++;
this.income +=money;
}
public int getBusNum() {
return busNum;
}
public int getIncome() {
return income;
}
public int getPassenger() {
return passenger;
}
public void showInfo(){
System.out.println("버스번호"+this.getBusNum()+"의 수입은"+this.getIncome()+"이며,승객수는"+this.getPassenger()+"입니다.");
}
}
지하철 클래스
package classpart;
public class Subway {
public String subwayNum;
public int income;
public int passenger;
public Subway(String subwayNum) {
this.subwayNum = subwayNum;
}
public void take(int money){
this.income += money;
passenger++;
}
public String getSubwayNum() {
return subwayNum;
}
public int getIncome() {
return income;
}
public int getPassenger() {
return passenger;
}
public void showInfo(){
System.out.println("지하철"+this.getSubwayNum()+"의 승객수는"+this.getPassenger()+"이며, 수입은"+getIncome()+"입니다.");
}
}
테스트 클래스
package classpart;
public class TransTest {
public static void main(String[] args) {
Student s1 = new Student("윤재열",20000);
Student s2 = new Student("김태환",15000);
Student s3 = new Student("김형욱",10000);
Bus bus100 = new Bus(100);
Subway num2 = new Subway("2호선");
Subway num7 = new Subway("7호선");
s1.takeBus(bus100); //윤재열 버스100번이용
s1.takeSubway(num2); //윤재열 지하철2호선이용
s2.takeSubway(num2); //김태환 지하철2호선이용
s2.takeSubway(num7); //김태환 지하철7호선이용
s3.takeSubway(num7); //김형욱 지하철7호선이용
s1.showInfo();
s2.showInfo();
s3.showInfo();
bus100.showInfo();
num2.showInfo();
num7.showInfo();
}
}
package Ex2;
public class Car {
public String name;
public int currentGear;
public void changeGear(int gear) {
System.out.println("기어를" + gear + "단으로 변경한다.");
currentGear = gear;
}
public String get_CurrentState() {
return name + "의 현재 기어 상태" + currentGear;
}
}
package Ex2;
public class Taxi extends Car{ //상속 extends
public int fare;
public int passenger;
}
package Ex2;
public class MyTaxi extends Taxi{
@Override
public void changeGear(int gear) {
System.out.println("기어를 "+gear+"변경후 고정한다.");
currentGear = gear;
}
public static void main(String[] args) {
MyTaxi myT = new MyTaxi();
myT.name="133나 4623";
myT.currentGear=1;
myT.fare=10000;
myT.passenger=2;
myT.changeGear(2);
myT.get_CurrentState();
}
}
package JavaStandard7.Ex3;
class Marine{ //마린 클래스
public String name;
public int hp;
public Marine(String name, int hp) {
this.name = name;
this.hp = hp;
}
public void stimpack(){ //메서드
System.out.print("[" + name + "]" + "의 스팀팩!" + " hp:" + hp);
hp -=10;
System.out.println("->"+hp);
}
}
class Medic{ //메딕 클래스
public String name;
public int hp;
public Medic(String name, int hp) {
this.name = name;
this.hp = hp;
}
public void heal(Marine target){ //힐 메서드
System.out.print("[" + name + "]" + "의 치유! " + target.name+"hp: " + target.hp);
target.hp += 10;
System.out.println("->" + target.hp);
}
}
public class Starcraft {
public static void main(String[] args) {
//객체 생성
Marine marine = new Marine("마린",80);
Medic medic = new Medic("메딕",60);
marine.stimpack(); //마린 스팀팩 버프
medic.heal(marine); //메딕의 치료 -> 마린
}
}
class Calculator {
int value;
Calculator() {
this.value = 0;
}
void add(int val) {
this.value += val;
}
int getValue() {
return this.value;
}
}
public class Sample {
public static void main(String[] args) {
Calculator cal = new Calculator();
cal.add(10);
System.out.println(cal.getValue()); // 10 출력
}
}
===============================풀이====================================
Calculator 클래스를 상속하는 UpgradeCalculator를 만들고 값을 뺄 수 있는 minus 메서드를 추가해 보자. 즉 다음과 같이 동작하는 클래스를 만들어야 한다.
UpgradeCalculator cal = new UpgradeCalculator();
cal.add(10);
cal.minus(3);
System.out.println(cal.getValue()); // 10에서 7을 뺀 3을 출력
UpgradeCalculator클래스
public class UpgradeCalculator extends Calculator{
public void minus(int val){
this.value -= val;
}
public int getValue(){
return this.value;
}
}
sample클래스
class Sample {
public static void main(String[] args) {
UpgradeCalculator cal= new UpgradeCalculator();
cal.add(10);
cal.minus(3);
System.out.println(cal.getValue()); // 10에서 7을 뺀 3을 출력;
}
}
MaxLimitCalculator cal = new MaxLimitCalculator();
cal.add(50); // 50 더하기
cal.add(60); // 60 더하기
System.out.println(cal.getValue()); // 100 출력
단, MaxLimitCalculator 클래스는 반드시Calcultor클래스를 상속해서 만들어야한다.
class Calculator {
int value;
Calculator() {
this.value = 0;
}
void add(int val) {
this.value += val;
}
int getValue() {
return this.value;
}
}
===============================풀이====================================
package JavaStandard7.Ex5;
public class MaxLimitCalculator extends Calculator{
@Override
void add(int val) {
super.value += val;
if(super.value >= 100)
super.value =100;
}
}
package JavaStandard7.Ex5;
public class Sample {
public static void main(String[] args) {
MaxLimitCalculator cal = new MaxLimitCalculator();
cal.add(50);
cal.add(60);
System.out.println(cal.getValue()); //100 출력
}
}
class Calculator {
int value;
Calculator() {
this.value = 0;
}
void add(int val) {
this.value += val;
}
int getValue() {
return this.value;
}
}
===============================풀이====================================
public class Calculator {
int value;
Calculator() {
this.value = 0;
}
void add(int val) {
this.value += val;
}
int getValue() {
return this.value;
}
public boolean isOdd(int num){ //boolean자료형을 써서 만약 num이 홀수면 true,나머지 짝수면 false.
return num%2==1;
}
}
public class Sample {
public static void main(String[] args) {
Calculator cal = new Calculator();
System.out.println(cal.isOdd(3)); //true
System.out.println(cal.isOdd(4)); //false
}
}
class Calculator {
int value;
Calculator() {
this.value = 0;
}
void add(int val) {
this.value += val;
}
int getValue() {
return this.value;
}
}
정수 배열을 사용한 예는 다음과 같다.
int[] data = {1, 3, 5, 7, 9};
Calculator cal = new Calculator();
int result = cal.avg(data);
System.out.println(result); // 5 출력
정수 리스트를 사용한 예는 다음과 같다.
ArrayList<Integer> data = new ArrayList<>(Arrays.asList(1, 3, 5, 7, 9));
Calculator cal = new Calculator();
int result = cal.avg(data);
System.out.println(result); // 5 출력
===============================풀이====================================
import java.util.ArrayList;
public class Calculator {
int value;
Calculator() {
this.value = 0;
}
void add(int val) {
this.value += val;
}
int getValue() {
return this.value;
}
// public double avg(int[] data){ //내가 한것...배열,리스트는 향상된for문을 이용 해야된다는 걸 까먹었다..
// int i=0;
// int sum = 0;
// double result=0;
// for(i=0; i<data.length; i++){
// sum += data[i];
// }
// return result =sum/data.length;
// }
// public double avg(ArrayList<Integer> data){
// int i = 0;
// int sum = 0;
// double result=0;
// for(i=0; i<data.size(); i++){
// sum += data.get(i);
// }
// return result = sum/data.size();
// }
public int avg(int[] data){ //향상된 for문 이용
int total = 0;
for(int num : data){
total += num;
}
return total/data.length;
}
public int avg(ArrayList<Integer>data){
int total = 0;
for(int num : data){
total += num;
}
return total/data.size();
}
}
import java.util.ArrayList;
import java.util.Arrays;
public class Sample {
public static void main(String[] args) {
int[] data ={1,3,5,7,9};
Calculator cal = new Calculator();
double result =cal.average(data);
System.out.println(result);
ArrayList<Integer> data1 = new ArrayList<>(Arrays.asList(1,3,5,7,9));
Calculator cal2 = new Calculator();
double result1 = cal2.average(data1);
System.out.println(result1);
import java.util.ArrayList;
import java.util.Arrays;
public class Sample {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3));
ArrayList<Integer> b = a;
a.add(4);
System.out.println(b.size());
}
}
===============================풀이====================================
4가 출력된다. 왜냐하면 b와 a는 모두 동일한 리스트 객체를 가리키고 있기 때문이다. 동일한 객체인지를 확인하기 위해 다음과 같이 출력해 보자.
import java.util.ArrayList;
import java.util.Arrays;
public class Sample {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3));
ArrayList<Integer> b = a;
a.add(4);
System.out.println(a==b); // true 출력
}
}
a와 b가 동일한 객체이기 때문에 true가 출력된다.
만약 b객체를 a객체와 동일한 값을 가지지만 독립적으로 생성하고 싶다면 다음과 같이 해야한다.
import java.util.ArrayList;
import java.util.Arrays;
public class Sample {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3));
ArrayList<Integer> b = new ArrayList<>(a);
a.add(4);
System.out.println(b.size()); // 3 출력
System.out.println(a == b); // false 출력
}
}
b 객체를 생성할때 a객체의 데이터를 기반으로 신규 객체로 생성했다. 이렇게 하면 a객체에 요소를 추가해도 b 객체에는 변화가 없고 a == b 로 동일한 객체인지 검사를 해보더라도 다르다는 것을 확인할 수 있다.
class Calculator {
Integer value;
void add(int val) {
this.value += val;
}
public Integer getValue() {
return this.value;
}
}
public class Sample {
public static void main(String[] args) {
Calculator cal = new Calculator();
cal.add(3); // 여기서 NullPointerException 이 발생한다.
System.out.println(cal.getValue());
}
}
===============================풀이====================================
public class Calculator {
public Calculator(){ //생성자 생성 후 초기값 설정.
this.value = 0;
}
public Integer value;
public void add(int val) {
this.value += val;
}
public Integer getValue() {
return this.value;
}
}
Integer 자료형은 값을 대입하지 않을 경우 null이기 때문에 add 메서드에서 null에 값을 더하려고 하기 때문에 오류가 발생한다. 따라서 다음처럼 Calculator 클래스의 생성자를 만들고 초기값을 설정해야 한다.
class Gold {
}
class Silver {
}
class Bronze {
}
class MineralCalculator {
int value = 0;
public void add(Gold gold) {
this.value += 100;
}
public void add(Silver silver) {
this.value += 90;
}
public void add(Bronze bronze) {
this.value += 80;
}
public int getValue() {
return this.value;
}
}
public class Sample {
public static void main(String[] args) {
MineralCalculator cal = new MineralCalculator();
cal.add(new Gold());
cal.add(new Silver());
cal.add(new Bronze());
System.out.println(cal.getValue()); // 270 출력
}
}
하지만 이 광물 계산기는 광물이 추가될 때마다 add 메서드를 추가해야 한다는 단점이 있다. 광물이 추가되더라도 MineralCalculator 클래스를 변경할 필요가 없도록 코드를 수정하시오.
===============================풀이====================================
public interface Mineral {
int getValue();
}
Mineral 인터페이스를 새로 생성하고 이를 각각의 금,은,구리 클래스에 implements한다.
class Gold implements Mineral{
@Override
public int getValue() {
return 100;
}
}
class Silver implements Mineral{
@Override
public int getValue() {
return 90;
}
}
class Bronze implements Mineral {
@Override
public int getValue() {
return 80;
}
}
class MineralCalculator {
int value = 0;
public void add(Mineral mineral){
this.value += mineral.getValue();
}
public int getValue() {
return this.value;
}
}
public class Sample {
public static void main(String[] args) {
MineralCalculator cal = new MineralCalculator();
cal.add(new Gold());
cal.add(new Silver());
cal.add(new Bronze());
System.out.println(cal.getValue()); // 270 출력
}
}
interface Predator {
}
class Animal {
}
class Dog extends Animal {
}
class Lion extends Animal implements Predator {
}
public class Sample {
public static void main(String[] args) {
Animal a = new Animal(); // 1번 O
Animal b = new Dog(); // 2번 O
Animal c = new Lion(); // 3번 O
Dog d = new Animal(); // 4번 X
Predator e = new Lion(); // 5번 O
}
}
4번 문장이 오류가 발생한다.Dog 클래스는 Animal의 자식클래스 이므로 Is-a관계가 성립할 수 없다.
interface Predator {
String bark();
}
abstract class Animal {
public String hello() {
return "hello";
}
}
class Dog extends Animal {
}
class Lion extends Animal implements Predator {
public String bark() {
return "Bark bark!!";
}
}
public class Sample {
public static void main(String[] args) {
Animal a = new Lion();
Lion b = new Lion();
Predator c = new Lion();
System.out.println(a.hello()); // 1번 O
System.out.println(a.bark()); // 2번 hello밖에못함
System.out.println(b.hello()); // 3번 O
System.out.println(b.bark()); // 4번 O
System.out.println(c.hello()); // 5번 bark밖에 못쓴다.
System.out.println(c.bark()); // 6번 O
}
}
===============================풀이====================================
2번 문장과 5번 문장에서 오류가 발생한다.
2번 문장이 오류가 발생하는 이유는 a 객체가 Animal 타입으로 생성되었기 때문이다. Animal 타입의 객체는 hello 메서드만 사용이 가능하다.
5번 문장이 오류가 발생하는 이유는 c 객체가 Predator 타입으로 생성되었기 때문이다. Predator 타입의 객체는 bark 메서드만 사용이 가능하다