프로그래밍 언어/JAVA

<JAVA> 명품 JAVA Programming 5장 실습문제 9번, 10번, 11번

창조적생각 2021. 7. 8. 21:37

9번. 다음 Stack 인터페이스를 상속받아 실수를 저장하는 StringStack 클래스를 구현하라.

1
2
3
4
5
6
interface Stack{
    int length(); //현재 스택에 저장된 개수 리턴
    int capacity(); //스택의 전체 저장 가능한 개수 리턴
    String pop(); //스택의 촙에 실수 저장
    boolean push(String val); //스택의 촙에 저장된 실수 리턴
}
cs

그리고 다음 실행 사례와 같이 작동하도록 StackApp 클래스에 main()메소드를 작성하라.

 

[실행결과]

총 스택의 저장 공간의 크기 입력>>3
문자열 입력>>hello
문자열 입력>>sunny
문자열 입력>>smile
문자열 입력>>happy
스택이 꽉 차서 푸시 불가!
문자열 입력>>그만
스택에 저장된 모든 문자열 팝 : smile sunny hello

 

[풀이]

StringStack 클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class StringStack implements Stack {
    int num; //스택에 저장 가능한 개수 num
    int length//현재 스택에 저장된 개수 length
    String[] stack;
    StringStack(int num){
        this.num = num;
        this.length = 0;
        stack = new String[num];
    }
    
@Override
public int length() {
    // TODO Auto-generated method stub
    return length;
}
 
@Override
public int capacity() {
    // TODO Auto-generated method stub
    return num;
}
 
@Override
public String pop() {
    // TODO Auto-generated method stub
    if(num<-1)
    return null;
    length--;
    return stack[length];
    
}
 
@Override
public boolean push(String val) {
    // TODO Auto-generated method stub
    if(length<num) {
        stack[length= val;
        length++;
        return true;
    }
    return false;
}
}
cs

StackApp 클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class StackApp {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        System.out.print("총 스택의 저장 공간의 크기 입력>>");
        int num = scanner.nextInt();
        StringStack sst = new StringStack(num);
        while(true) {
            System.out.print("문자열 입력>>");
            String val = scanner.next();
            if(val.equals("그만"))
                break;
            if(!sst.push(val)) {
                System.out.println("스택이 꽉 차서 푸시 불가!");
            }
        }
         System.out.print("스택에 저장된 모든 문자열 팝 : ");
        for(int i = 0; i<num; i++) {
            String s = sst.pop();
            System.out.print(s+" ");
        }
        
cs

10. 다음은 키와 값을 하나의 아이템으로 저장하고 검색 수정이 가능한 추상 클래스가 있다.

 

1
2
3
4
5
6
7
8
9
10
11
package practice5_10;
 
abstract public class PairMap {
protected String KeyArray[];
protected String valueArray[];
abstract String get(String key);
abstract void put(String key, String value);
abstract String delete(String key);
abstract int length();
}
 
cs

PairMap을 상속하는 Dictionary 클래스를 구현하고, 이를 다음과 같이 활용하는 main() 메소드를 가진 클래스 DictionaryApp도 작성하라.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package practice5_10;
 
public class DictionaryApp {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Dictionary dic = new Dictionary(10);
        dic.put("황기태""자바");
        dic.put("이재문""파이선");
        dic.put("이재문""C++");
        System.out.println("이재문은 값은 "+ dic.get("이재문"));
        System.out.println("황기태의 값은 "+dic.get("황기태"));
        dic.delete("황기태");
        System.out.println("황기태의 값은 "+dic.get("황기태"));
 
    }
 
}
 
cs

[실행결과]

이재문은 값은 C++
황기태의 값은 자바
황기태의 값은 null

 

[풀이]

Dictionary 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class Dictionary extends PairMap{
    int length;
    String key;
    String value;
    String KeyArray[];
    String valueArray[];
    int n = 0;
    Dictionary(int length){
        this.length = length;
        KeyArray = new String[length];
        valueArray = new String[length];
        this.n = 0;
    }
    @Override
    String get(String key) {    
        // TODO Auto-generated method stub
        if (key.equals(KeyArray[0]))
            return valueArray[0];
        if (key.equals(KeyArray[1]))
            return valueArray[1];
        if (key.equals(KeyArray[2]))
            return valueArray[2];
        else return null;
    }
 
    @Override
    void put(String key, String value) {
        // TODO Auto-generated method stub
        for(int i = 0; i<length;i++)
            if(key.equals(KeyArray[i])) {
                KeyArray[i] = key;
                valueArray[i] = value;}
        KeyArray[n] = key;
        valueArray[n] = value;
        n++;
        
        }
        
 
    @Override
    String delete(String key) {
        // TODO Auto-generated method stub
        for(int i =0; i<length; i++)
            if (key.equals(KeyArray[i])) {
                String s = KeyArray[i];
                KeyArray[i] = null
        return s;}
        return null;
    }
 
    @Override
    int length() {
        // TODO Auto-generated method stub
        return length;
    }
 
 
}
 
cs

 

 

11. 철수 학생은 다음 3개의 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하려고 한다(4장 실습문제 11 참고).

- int 타입의 a, b 필드: 2개의 피연산자
- void setValue(int a, int b): 피연산자 값을 객체 내에 저장한다.
- int calculate(): 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.
곰곰 생각해보니, Add, Sub, Mul, Div 클래스에 공통된 필드와 메소드가 존재하므로 새로운 추상 클래스 Calc를 작성하고 Calc를 상속받아 만들면 되겠다고 생각했다. 그리고 main() 메소드에서 다음 실행 사례와 같이 2개의 정수와 연산자를 입력받은 후, Add, Sub, Mul, Div 중에서 이 연산을 처리할 수 있는 객체를 생성하고 setValue() 와 calculate()를 호출하여 그 결과 값을 화면에 출력하면 된다고 생각하였다. 철수처럼 프로그램을 작성하라.
[실행결과]
두 정수와 연산자를 입력하시오 >> 5 7 +
12

[풀이]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package practice5_11;
 
public abstract class Calc { //추상 클래스Calc를 생성
int a;
int b;
void setValue() {};
void calculate() {};
 
}
 
 
 
 
package practice5_11;
 
public class Add {
int a;
int b;
void setValue(int a, int b) {// 추상메소드에 오버라이딩을 합니다.
this.a = a;
this.b = b;
}
int claculate() {
return a + b;
}
 
}
 
 
 
package practice5_11;
 
public class Sub {
 
int a;
int b;
void setValue(int a, int b) {
this.a = a;
this.b = b;
}
int claculate() {
return a - b;
}
 
}
 
 
package practice5_11;
 
public class Mul {
int a;
int b;
void setValue(int a, int b) {
this.a = a;
this.b = b;
}
int claculate() {
return a * b;
}
}
 
 
package practice5_11;
 
public class Div {
int a;
int b;
void setValue(int a, int b) {
this.a = a;
this.b = b;
}
int claculate() {
return a / b;
}
}
 
 
 
package practice5_11;
import java.util.Scanner;
 
public class Cal {
 
public static void main(String[] args) {
// TODO Auto-generated method stub
 
 
 
int a,b;
String c;
Scanner scanner = new Scanner(System.in);
 
System.out.print("두 정수와 연산자를 입력하시오>>");
 
= scanner.nextInt();
= scanner.nextInt();
= scanner.next();
switch(c) { //switch문을 써서 구별해 줍니다.
case "+":
Add add = new Add();
add.setValue(a, b);
System.out.println(add.claculate());
break; //switch 문에서는 반드시 break를 써야 합니다. 그렇지 않으면 한바퀴 돕니다.
case "-":
Sub sub = new Sub();
sub.setValue(a, b);
System.out.println(sub.claculate());
break;
case "*":
Mul mul = new Mul();
mul.setValue(a, b);
System.out.println(mul.claculate());
break;
case "/":
Div div = new Div();
div.setValue(a, b);
System.out.println(div.claculate());
break;
default :
 
System.out.println("그만");
 
}
 
 
}
 
}
cs
728x90