본문 바로가기
JAVA

[JAVA] 객체지향 복습 Quiz

by hotdog7778 2023. 6. 20.

Q1. UpgradeCalculator

/*
다음은 Calculator 클래스와 그 사용법을 담은 코드이다.
Calculator 클래스를 상속하는 UpgradeCalculator를 만들고 값을 뺄 수 있는 minus 메서드를 추가해 보자.
즉 다음과 같이 동작하는 클래스를 만들어야 한다.

UpgradeCalculator cal = new UpgradeCalculator();
cal.add(10);
cal.minus(3);
System.out.println(cal.getValue());  // 10에서 3을 뺀 7을 출력
 */
class Calculator {
    int value;

    Calculator() {
        this.value = 0;
    }

    void add(int val) {
        this.value += val;
    }

    int getValue() {
        return this.value;
    }
}

class UpgradeCalculator extends Calculator{
    // 마이너스 메소드를 만들자
    void minus(int val) {
        this.value -= val;
    }
}

public class Sample {
    public static void main(String[] args) {
//        Calculator cal = new Calculator();
//        cal.add(10);
//        System.out.println(cal.getValue());  // 10 출력
        UpgradeCalculator ucal = new UpgradeCalculator(); // 생성자에 의해서 val 값은 0으로 초기화.
        ucal.add(32);
        System.out.println(ucal.getValue());
        ucal.minus(12);
        System.out.println(ucal.getValue());

    }
}

Q2. MaxLimitCalculator

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

MaxLimitCalculator cal = new MaxLimitCalculator();
cal.add(50);  // 50 더하기
cal.add(60);  // 60 더하기
System.out.println(cal.getValue());  // 100 출력

단 MaxLimitCalculator 클래스는 반드시 다음의 Calculator 클래스를 상속해서 만들어야 한다.
 */
class Calculator {
    int value;

    Calculator() {
        this.value = 0;
    }

    void add(int val) {
        this.value += val;
    }

    int getValue() {
        return this.value;
    }
}

class MaxLimitCalculator extends Calculator{
    // 100이상이면 100을 반환하는 메소드를 만들자
    void add(int val) {  // add 메소드를 오버라이딩 했다.
        this.value += val;
        if(this.value > 100) {
            this.value = 100;
        }
    }
}
public class Sample {

    public static void main(String[] args) {
        MaxLimitCalculator mlcal = new MaxLimitCalculator();
        System.out.println(mlcal.getValue());
        mlcal.add(11);
        System.out.println(mlcal.getValue());
        mlcal.add(77);
        System.out.println(mlcal.getValue());
        mlcal.add(33);
        System.out.println(mlcal.getValue());
    }
}

Q3. 홀수 짝수 판별하기

/*
다음과 같이 주어진 정수가 홀수인지 짝수인지 판별해 주는 Calculator 클래스를 작성하시오.
(홀수이면 true, 짝수면 false를 리턴해야 한다.)

Calculator cal = new Calculator();
System.out.println(cal.isOdd(3));  // 3은 홀수이므로 true 출력
System.out.println(cal.isOdd(4));  // 4는 짝수이므로 false 출력

true
false
 */
class Calculator {
    int value;
    // 생성자
    Calculator(){
        this.value = 0;
    }
    boolean isOdd(int num){
        // num 을 받아서.
        return num % 2 == 1; // 리턴시킨다. num을 2로 나눈 나머지와 1이 같은지 비교. 참이면 true 거짓이면 false
    }
}
public class Sample {
    public static void main(String[] args) {
        Calculator cal = new Calculator();
        System.out.println(cal.isOdd(3));  // 3은 홀수이므로 true 출력
        System.out.println(cal.isOdd(4));  // 4는 짝수이므로 false 출력
        System.out.println(cal.isOdd(0));
    }
}

Q4. 평균값을 구하는 메서드

어레이 리스트를 매개변수로 받을때 <Integer> 를 안쓰니까 받아온 리스트 요소값이 오브젝트 형이었다. 그래서 연산이 안됐었음.

/*
다음과 같이 정수 배열 또는 정수의 리스트로 그 평균값을 구해 리턴하는 Calculator 클래스를 작성하시오.

정수 배열 사용 예

int[] data = {1, 3, 5, 7, 9};
Calculator cal = new Calculator();
int result = cal.avg(data);
System.out.println(result);  // 5 출력
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 출력
5
메서드 오버로딩을 사용해 보자.
 */

import java.util.ArrayList;
import java.util.Arrays;

// 정수 배열 케이스
class Calculator{
    //평균 계산식 data[0] ~++ data[4] / 5
    // 평균을 구하는 avg 메소드 만들기
    int avg(int[] data){
        int sum = 0;
        int len = data.length;
        for(int i=0; i<len; i++){
            sum += data[i];
        }
        // for 문이 끝난다음 배열의 요소 수로 sum을 나눈다.
        // result = sum/len;
        return sum / len;
    }
    int avg(ArrayList<Integer> data){
        int sum = 0;
        int len = data.size();
        for(int i=0; i<len; i++){
            sum += data.get(i);
        }
        return sum / len;
    }
}
public class Sample {
    public static void main(String[] args){
        // 정수 배열을 선언하자
        int data1[] = {1, 3, 5, 7, 9};
        // avg 메소드를 사용해서 data 배열 요소들의 평균을 구하자
        Calculator avgCal1 = new Calculator();
        int result1 = avgCal1.avg(data1);
        System.out.println(result1);

        // 정수 리스트를 선언하자.
        ArrayList<Integer> data2 = new ArrayList<>(Arrays.asList(2,4,6,8,10));
        Calculator avgCal2 = new Calculator();
        int result2 = avgCal2.avg(data2);
        System.out.println(result2);
    }
}

Q5. 리스트와 객체

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

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        ArrayList a = new ArrayList<>(Arrays.asList(1, 2, 3));
        ArrayList b = a;
        a.add(4);
        System.out.println(b.size()); // 4
    }
}
/*
스스로 찾아본것 (<https://lts0606.tistory.com/585>)

기본데이터 타입과 참조 데이터 타입이 있다.
ArrayList 는 리스트타입중 하나로 참조 데이터 타입이다.
참조 데이터 타입인 ArrayList 는 실제 데이터가 있는 곳의 주소값을 저장한다.
a 객체도 마찬가지로 (1,2,3) 데이터가 있는 곳의 주소값을 저장하고 있다.
ArrayList b = a; 코드는 b 도 a 와 같은 주소값을 저장한다는 의미로 최종 도착지의 값은 둘이 같다.

키워드
참조 형식(Reference Types)
Call by Reference
 */

/* 
점프투 자바 해설
4가 출력된다. 왜냐하면 b와 a는 모두 동일한 리스트 객체를 가리키고 있기 때문이다. 
만약 b객체를 a객체와 동일한 값을 가지지만 독립적으로 생성하고 싶다면 다음과 같이 해야한다.
ArrayList b = new ArrayList<>(a);
b 객체를 생성할때 a객체의 데이터를 기반으로 신규 객체로 생성했다. 
이렇게 하면 a객체에 요소를 추가해도 b 객체에는 변화가 없고,
a == b 로 동일한 객체인지 검사를 해보더라도 다르다는 것을 확인할 수 있다.
*/

Q6. 생성자와 초깃값

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

class Calculator {
    Integer value;
    // Integer 자료형은 값을 대입하지 않을 경우 null이기 때문에
    // add 메서드에서 null에 값을 더하려고 하기 때문에 오류가 발생한다.
    // 따라서 다음처럼 Calculator 클래스의 생성자를 만들고 초깃값을 설정해야 한다.
    Calculator(){
        this.value = 0;
    }
    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());
    }
}

Q7. 인터페이스 사용하기

add 를 계속 실행하는게 아니라 cal.getValue(골드,실버) 이런식으로 계산할 수 있게 코드를 바꿔보고 싶음

// 다음은 광물의 가치를 계산하는 MineralCalculator 클래스와 그 사용법이 담긴 코드이다.
// 광물 계산기는 금인 경우 100, 은인 경우 90, 구리의 경우는 80의 가치를 더하는 기능(add 메스드)이 있다.
// 하지만 이 광물 계산기는 광물이 추가될 때마다 add 메서드를 추가해야 한다는 단점이 있다.
// 광물이 추가되더라도 MineralCalculator 클래스를 변경할 필요가 없도록 코드를 수정하시오.
// Mineral 인터페이스를 생성하고 광물 클래스에 적용해 보자.
interface Mineral {
    int getValue(); // 인터페이스에는 동작방식을 정의할 수 없다.
}
class Kong implements Mineral{
    public int getValue(){
        return 1;
    }
}
class Gold implements Mineral{
    public int getValue(){  // public을 사용해야함에 주의
        return 100;
    }
}
class Silver implements Mineral{
    public int getValue() {
        return 90;
    }
}

class Bronze implements Mineral{
    public int getValue(){
        return 80;
    }
}

class MineralCalculator {
    int value = 0;

    public void add(Mineral mineral) {
        this.value += mineral.getValue(); // 골드,실버,브론즈의 getValue 를 실행한다고 보자
    }
    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());
        cal.add(new Kong());
        System.out.println(cal.getValue());  // 270 출력
    }
}

Q8. 오류 찾기 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번 // 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
    }
}

Q9. 오류 찾기 2

// 다음의 코드를 보고 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번 x
        System.out.println(b.hello());  // 3번 o
        System.out.println(b.bark());   // 4번 o
        System.out.println(c.hello());  // 5번 x
        System.out.println(c.bark());   // 6번 o
    }
}

 

'JAVA' 카테고리의 다른 글

[JVM] JVM 메모리구조와 동작방식  (0) 2023.06.29
[JAVA] 객체지향 복습  (0) 2023.06.20
[Java] 자료형 / 형변환 복습  (2) 2023.06.18
[Java] 소스코드 형태 복습  (0) 2023.06.18