객체지향 개념 예제

윤재열·2022년 1월 9일
0

Java

목록 보기
15/71

1. 학생, 버스, 지하철 프로그램

학생 클래스

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();
    }
}

2. 상속과 다형성을 이용해서 택시에 대한 정보를 나타내자.

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();
    }
}

3.마린과 메딕 객체의 상호 작용

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); //메딕의 치료 -> 마린

    }
}

4.다음은 Calculator 클래스와 그 사용법을 담은 코드이다.

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을 출력;

    }
}

5. 객체변수 value가 100 이상의 값은 가질 수 없도록 제한하는 MaxLimitCalculator 클래스를 만들어 보자. 즉 다음과 같이 동작해야 한다.

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 출력
    }
}

6. 다음의 클래스에 주어진 정수가 홀수인지 짝수인지 판별해 주는 메서드(isOdd)를 추가해 보자. (홀수이면 true, 짝수면 false를 리턴해야 한다.)

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
    }
}

7. 다음 클래스에 정수 배열 또는 정수의 리스트 입력시 그 평균값을 구해 정수로 리턴하는 avg 메서드를 추가해 보자.

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);

8. 다음 프로그램의 출력결과를 예측하고 그 이유에 대해서 설명하시오.

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 로 동일한 객체인지 검사를 해보더라도 다르다는 것을 확인할 수 있다.

9. 다음은 Calculator 객체를 생성하고 값을 더한 후에 그 결과값을 출력하는 예제이다. 하지만 코드를 실행하면 오류가 발생한다. Calculator 클래스를 수정하여 다음의 코드에서 오류가 발생하지 않도록 하시오.

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 클래스의 생성자를 만들고 초기값을 설정해야 한다.

10. 다음은 광물의 가치를 계산하는 MineralCalculator 클래스와 그 사용법이 담긴 코드이다. 광물 계산기는 금인 경우 100, 은인 경우 90, 구리의 경우는 80의 가치를 더하는 기능(add 메스드)이 있다.

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 출력
        }
    }

11. 다음의 코드를 보고 1번, 2번, 3번, 4번, 5번 문장 중에서 오류가 발생하는 문장을 모두 찾고 오류의 원인에 대해서 설명하시오.

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관계가 성립할 수 없다.

12. 다음의 코드를 보고 1번, 2번, 3번, 4번, 5번, 6번 문장 중에서 오류가 발생하는 문장을 모두 찾고 오류의 원인에 대해서 설명하시오.

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 메서드만 사용이 가능하다

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글