본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2022-11-18(15day)

by elicho91 2022. 11. 18.

👉 계산기 만들기

1. class 이름 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()); 
    }
}

a. 요구사항

 - 위 Calculator 클래스를 상속하는 UpgradeCalculator를 만든다.

 - 뺴기기능 구현, 메서드 명 minus

...
class UpgradeCalculator extends Calculator {
	void minus(int val) {
    	this.value -= val;
    }
}

public class Sample {
	public static void main(String[] args) {
    	UpgradeCalculator cal = new UpgradeCalculator();
        cal.add(10);
        cal.minus(3);
        System.out.println(cal.getValue()); // 7 출력
    } 
}

 

 

2. 위 Calculator클래스를 활용해서, 멤버 필드인 value의 크기 제한이 있는 MaxLimitCalculator클래스 만들기

a. 요구사항

 -멤버 필드 value의 크기가 100보다 큰 값은 가질 수 없다.

class MaxLimitCalculator extends UpgradeCalculator {
	int getValue() {
    	if (this.value >= 100) {this.value = 100;}
    
    	return this.value;
    }
}

public class Sample {
	public static void main(String[] args) {
    	MaxLimitCalculator cal = new MaxLimitCalculator();
        
        cal.add(10);
        cal.minus(3); // 7 출력
        cal.add(100); // 계산값은 107이지만 100 출력
    }
}

 

 

3. 위 Calculator클래스에서 짝수인지, 홀수인지 판별해주는 메서드 추가

a.요구사항

 -짝수 홀수 판별 메서드 : isOdd 홀수이면 true 반환, 짝수이면 false 반환

class Calculator {
	...
    
    boolean isOdd(int num) {
    	return num % 2 == 0;
    }
}

public class Sample {
	...
    
    	System.out.println(cal.isOdd(cal.getValue()));
}

 

 

4. 위 Calculator클래스에서 평균값 구하는 메서드 추가

a. 요구사항

-정수의 리스트 입력시, 입력받은 리스트의 평균값을 반환하는 avg 메서드 구현

import java.util.ArrayList;

class Calculator {
	...

    int avg(ArrayList<Integer> data) {
    	int sum = 0;
    	for (int i=0; i<data.size(); i++) {
        	sum += data.get(i);
        }
        
        return sum / data.size();        
    }
}

public class Sample {
	...
        
        ArrayList<Integer> data2 = new ArrayList<>(Arrays.asList(2,4,6,8,10));
        System.out.println(cal.avg(data2)); // 6 출력
}

👉 미네랄 계산기 만들기

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

 

 

a. 요구사항

 - 광물이 추가될 때마다 (자수정, 오팔, 다이아… 쭉쭉쭉 추가 예정) add메서드를 추가해야하는 단점이있는 코드.

 -  MineralCalculator 클래스의 add 메서드 추가하지 않는 방법을 생각해서, 코드를 수정하세요.

interface Mineral {		// Mineral 인터페이스를 생성
    int getValue();		// 광물의 가치를 리턴하는 getValue 메서드를 선언
}

class Gold implements Mineral {		//Mineral 인터페이스를 구현
    public int getValue() {
        return 100;
    }
}

class Silver implements Mineral {		//Mineral 인터페이스를 구현
    public int getValue() {
        return 90;
    }
}

class Bronze implements Mineral {		//Mineral 인터페이스를 구현
    public int getValue() {
        return 80;
    }
}

class MineralCalculator {
    int value = 0;

    public void add(Mineral mineral) {		// add 메서드는 모든 광물을 오버로딩하지 않고 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 출력
    }
}

👉  오류 원인 찾기(1)

다음 코드를 보고, 주석에서 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번 
        Animal b = new Dog();  // 2번
        Animal c = new Lion();  // 3번
        Dog d = new Animal();  // 4번
        // Dog 클래스는 Animal 자식 클래스이므로 관계성립이 안된다.
        Predator e = new Lion();  // 5번
    }
}

👉  오류 원인 찾기(2)

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

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번
        System.out.println(a.bark());   // 2번
        // a 객체는 Animal 타입으로 생성되어서 hello() 메서드만 사용가능
        System.out.println(b.hello());  // 3번
        System.out.println(b.bark());   // 4번
        System.out.println(c.hello());  // 5번
        // c 객체는 Predator 타입으로 생성되어서 bark() 메서드만 사용가능
        System.out.println(c.bark());   // 6번
    }
}

🙋‍♂️ 소감 : 

객체지향이라는 개념을 인지하고 문제를 풀어보니,
이론만 들었을 때보다는 확실히 더 이해하기 수월했다.
추상화는 아직 이해하기 조금 어려워서 주말 동안 더 공부해야겠다.

😈 아는 내용이라고 그냥 넘어가지 않기! 😈

'❤️‍🔥TIL (Today I Learned)' 카테고리의 다른 글

[TIL] 2022-11-22(17day)  (0) 2022.11.22
[TIL] 2022-11-21(16day)  (0) 2022.11.21
[TIL] 2022-11-17(14day)  (0) 2022.11.17
[TIL] 2022-11-16(13day)  (0) 2022.11.16
[TIL] 2022-11-15(12day)  (0) 2022.11.15

댓글