013-001-002
文字列フィールドを持つクラス:名刺管理プログラム
中級
問題説明
【解説】
1. 問題の背景と目的
この問題では、文字列(String)を扱うクラスの基本を学びます。ビジネスシーンで使われる名刺の情報を管理するクラスを作成することで、「クラスとは何か」「フィールドとは何か」「コンストラクタとメソッドの役割」を実践的に理解できます。実際の名刺管理アプリケーションでも同様の設計が使われており、実務で役立つスキルです。
2. 前提知識の詳細説明
クラスとは
クラスは「オブジェクトの設計図」です。名刺の情報を管理したい場合、どんな情報が必要か(名前、会社名など)、どんな操作ができるか(情報を取得する、表示するなど)を定義したものがクラスです。
フィールドとは
フィールドはクラスの中で「データを保存する変数」です。名刺クラスの場合、nameフィールドには「Alice Johnson」のような名前の文字列が保存されます。privateを付けることで、クラスの外部から直接書き換えられないように保護します。
コンストラクタとは
コンストラクタは「オブジェクトを作成するときに自動的に呼ばれる特別なメソッド」です。new NameCard("Alice", "TechCorp", ...)のように書くと、このコンストラクタが実行され、渡された引数がフィールドに保存されます。
thisキーワード
this.name = name;のthisは「このオブジェクトの」という意味です。左側のthis.nameはフィールド、右側のnameは引数を指します。同じ名前を使う場合、thisで区別します。
3. コードの行ごとの詳細解説
フィールドの宣言
private String name;
```java
この行では、nameという名前のフィールドを宣言しています。privateは「このクラスの中だけでアクセス可能」という意味です。Stringは文字列型を表します。この時点ではnameにはまだ値が入っていません(null状態)。
### コンストラクタの実装
```java
public NameCard(String name, String company, String title, String email) {
this.name = name;
this.company = company;
this.title = title;
this.email = email;
}
```java
このコンストラクタは4つの引数を受け取ります。this.name = name;の部分で、引数で渡された値をフィールドに代入しています。この処理により、オブジェクト作成時に初期値が設定されます。
### getterメソッドの実装
```java
public String getName() {
return name;
}
```java
このメソッドは、フィールドに保存されているnameの値を返します。return文を使うことで、呼び出し元にnameの値を渡します。戻り値の型はStringなので、文字列が返されます。
### 文字列の整形
```java
public String getCardInfo() {
return "+------------------------------+\n" +
"| Name: " + name + " |\n" +
"| Company: " + company + " |\n" +
"| Title: " + title + " |\n" +
"| Email: " + email + " |\n" +
"+------------------------------+";
}
```java
このメソッドでは、複数の文字列を+<a href="https://javadrill.tech/problems/003">演算子</a>で連結しています。\nは改行を表します。フィールドの値を組み込むことで、名刺の情報を見やすく整形した文字列を作成します。
## 4. よくある間違いと修正例
### 間違い1: thisキーワードを忘れる
```java
// ❌ 間違い
public NameCard(String name, String company, String title, String email) {
name = name; // フィールドではなく引数に代入してしまう
}
// ✅ 正しい
public NameCard(String name, String company, String title, String email) {
this.name = name; // thisでフィールドを指定
}
```java
**理由**: thisを付けないと、引数のnameに引数のnameを代入することになり、フィールドには何も保存されません。
### 間違い2: getterメソッドの戻り値の型を間違える
```java
// ❌ 間違い
public void getName() {
return name; // voidは何も返さない型なのでエラー
}
// ✅ 正しい
public String getName() {
return name; // 文字列を返すのでString型
}
```java
**理由**: returnで値を返す場合、メソッドの戻り値の型を正しく指定する必要があります。voidは「何も返さない」という意味なので、return文と一緒に使えません。
### 間違い3: フィールドをpublicにしてしまう
```java
// ❌ 間違い(推奨されない)
public String name; // 外部から直接書き換え可能
// ✅ 正しい
private String name; // カプセル化:外部からは見えない
public String getName() { return name; } // getterで安全に公開
```java
**理由**: フィールドをpublicにすると、クラスの外部から自由に書き換えられてしまい、データの整合性が保てません。privateにしてgetterで公開するのがベストプラクティスです。
## 5. 実践的なデバッグのヒント
### コンパイルエラーが出た場合
- クラス名とファイル名が一致しているか確認(NameCard.java)
- すべてのメソッドに適切な戻り値の型を指定しているか確認
- コンストラクタの名前がクラス名と完全に一致しているか確認
### 実行時にNullPointerExceptionが出た場合
- コンストラクタで引数をフィールドに正しく代入しているか確認
- thisキーワードを使っているか確認
- オブジェクト作成時に必要な引数をすべて渡しているか確認
### 期待した出力が得られない場合
- System.out.println()を使って、各メソッドの戻り値を確認
- フィールドの値が正しく初期化されているか確認
- 文字列の連結が正しく行われているか確認(+の位置など)
## 6. 発展的な内容
### さらなる機能追加
- 電話番号フィールドの追加
- 名刺情報の更新メソッド(setName()など)
- 複数の名刺を管理するリストの実装
- 名刺情報をファイルに保存・読み込み
### より実務的な応用
- データベースへの保存機能
- QRコード生成(vCardフォーマット)
- メール送信機能(メールアドレスを使って)
- 名刺のデジタル化アプリケーション
## 7. 関連する学習項目
次に学ぶべきトピックやこの問題と関連する概念:
- カプセル化(情報隠蔽)の詳細(カテゴリ014)
- オブジェクト指向プログラミングの基礎(カテゴリ023)
- <a href="https://javadrill.tech/problems/020">コレクション</a>(複数の名刺を管理)(カテゴリ015)
- <a href="https://javadrill.tech/problems/014">継承</a>(名刺クラスを拡張して社員証クラスを作る)(カテゴリ016)
- <a href="https://javadrill.tech/problems/019/001">例外処理</a>(不正な入力への対応)(カテゴリ019)
テストケース例
※ 出力例はプログラミングの国際標準に準拠し英語で表示しています
正常系
入力:
期待される出力:
+----+ | Name: Alice Johnson | | Company: TechCorp | | Title: Engineer | | Email: alice@techcorp.com | +----+
正常系
入力:
期待される出力:
+----+ | Name: Bob Smith | | Company: InnovateLabs | | Title: Manager | | Email: bob@innovate.com | +----+
境界値
入力:
期待される出力:
+----+ | Name: A | | Company: B | | Title: C | | Email: D | +----+
正常系
入力:
期待される出力:
+----+ | Name: Christopher Alexander Johnson | | Company: International Technology Solutions Inc | | Title: Senior Software Architect | | Email: christopher.johnson@internationaltech.com | +----+
異常系
入力:
期待される出力:
java.lang.NullPointerException
❌ テストに失敗したケースがあります
あなたの解答
現在のモード:● 自分のコード
99
1
2
3
4
5
6
7
8
9
10
›
⌄
⌄
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
残り 9 回実行可能
