009-001-002

PointCardクラス:publicフィールドとメソッドでポイント管理

中級

問題説明

入力・出力形式

入力

標準入力から2つの整数をそれぞれ1行で受け取ります。

  • 1行目: 1回目にaddPointsへ渡すポイント数
  • 2行目: 2回目にaddPointsへ渡すポイント数

出力

最終的なポイント残高(getPoints()の戻り値)を1行で出力します。

入出力例

入力:
50
70

出力:
120

【解説】

この問題では: PointCardクラスを実装し、pointsなどのフィールドを持つオブジェクトの状態を管理するプログラムを作成します。

1. 問題の背景と目的

この問題では、Javaのアクセス修飾子の中でも最も基本的な「public修飾子」について学びます。publicは「公開された」という意味で、クラスの外部からそのフィールドやメソッドに自由にアクセスできることを示します。

実務では、ポイントカードシステムのように、外部から状態を変更したり、情報を取得したりする必要がある場面が多くあります。public修飾子を正しく理解することで、クラス間のデータのやり取りを適切に設計できるようになります。

この学習は、次に学ぶ「private修飾子」や「カプセル化」といった概念の基礎となります。まずはpublicでアクセス制御の仕組みを理解し、その後により安全な設計方法を学んでいきます。

2. 前提知識の詳細説明

クラスとフィールドの基礎

クラスとは、オブジェクトの設計図です。例えば「PointCard」というクラスは、ポイントカードの仕組みを定義しています。

フィールドとは、クラスが持つデータを保存する変数のことです。この問題ではpublic int pointsというフィールドで、現在のポイント数を保存しています。変数と同じように値を格納できますが、クラスの一部として定義される点が異なります。

メソッドの役割

メソッドとは、クラスが持つ「機能」や「動作」を定義したものです。この問題ではaddPointsメソッドとgetPointsメソッドの2つを実装しています。

  • addPoints: ポイントを追加する機能
  • getPoints: 現在のポイントを取得する機能

public修飾子とは

publicは、アクセス修飾子の一種です。アクセス修飾子は「誰がこのフィールドやメソッドにアクセスできるか」を制御します。

publicを付けると、どこからでも(他のクラスからでも)そのメンバにアクセスできます。これにより、外部のコードがポイントカードを操作できるようになります。

3. コードの行ごとの詳細解説

クラス宣言

public class PointCard {
```java
クラス自体もpublicにすることで、他のファイルからこのクラスを使用できるようにしています。

### フィールド宣言
```java
public int points = 0;
```java
この行では以下のことが起きています:
1. `public`修飾子により、クラス外部からこのフィールドに直接アクセス可能になります
2. `int`型なので整数値(ポイント数)を保存できます
3. `points`という名前を付けています
4. `= 0`で初期値を0に設定しています(ポイントは最初0から始まる)

### addPointsメソッド
```java
public void addPoints(int amount) {
```java
- `public`: 外部から呼び出せるようにしています
- `void`: このメソッドは値を返しません(戻り値なし)
- `addPoints`: メソッド名
- `(int amount)`: 追加するポイント数を引数として受け取ります

```java
if (amount > 0) {
    points += amount;
}
```java
この部分が重要です:
1. `if (amount > 0)`で、受け取った値が正の数かチェックします
2. 正の数の場合のみ、`points += amount`でポイントを加算します
3. これにより、負の値を加算してポイントがマイナスになることを防ぎます

### getPointsメソッド
```java
public int getPoints() {
    return points;
}
```java
- `public`: 外部から呼び出せます
- `int`: 整数値を返すことを示します
- `return points`: 現在のポイント数を呼び出し元に返します

このメソッドを呼ぶことで、外部から現在のポイント残高を確認できます。

## 4. よくある間違いと修正例

### 間違い1: publicを忘れる

**間違ったコード:**
```java
int points = 0;
void addPoints(int amount) { ... }
```java

**理由:** アクセス修飾子を省略すると「パッケージプライベート」(同じパッケージ内からのみアクセス可能)になります。この問題では、明示的に外部アクセスを許可するため、publicが必要です。

**正しいコード:**
```java
public int points = 0;
public void addPoints(int amount) { ... }
```java

### 間違い2: 入力検証を忘れる

**間違ったコード:**
```java
public void addPoints(int amount) {
    points += amount;  // 負の値でも加算してしまう
}
```java

**理由:** 負の値を渡されたとき、ポイントがマイナスになってしまいます。これは現実のポイントカードではありえない状態です。

**正しいコード:**
```java
public void addPoints(int amount) {
    if (amount > 0) {  // 正の値のみ加算
        points += amount;
    }
}
```java

### 間違い3: getPointsで誤った値を返す

**間違ったコード:**
```java
public int getPoints() {
    return 0;  // 常に0を返してしまう
}
```java

**理由:** 実際のポイント残高(points)を返さず、常に0を返してしまいます。

**正しいコード:**
```java
public int getPoints() {
    return points;  // 正しくフィールドの値を返す
}
```java

## 5. 実践的なデバッグのヒント

### エラー: cannot find symbol
```java
error: cannot find symbol
  symbol:   method getPoints()
```java
このエラーが出た場合、メソッド名のスペルミスか、publicを付け忘れている可能性があります。メソッド宣言を確認してください。

### エラー: incompatible types
```java
error: incompatible types: void cannot be converted to int
```java
このエラーは、戻り値の型が間違っている時に出ます。

テストケース例

※ 出力例はプログラミングの国際標準に準拠し英語で表示しています

正常系
入力:
50
70
期待される出力:
120
正常系
入力:
100
150
期待される出力:
250
境界値
入力:
50
0
期待される出力:
50
異常系
入力:
100
-50
期待される出力:
100

あなたの解答

現在のモード: 自分のコード
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// ここにコードを書いてください

sc.close();
}
}
0 B / 5 MB

残り 10 回実行可能