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 |