資格
大学生・専門学校生・社会人
解決済み

この問題の2行目sbというのはなんでしょうか。
文字型sという箱の中にABCDという値が入っていて、
StringBuffer:sb←stringBuffer(s)
sbという箱の中をABCDで初期化するという意味かと思ったのですが
メンバ変数とかメソッドとかを説明してる枠の中にsbについて記載がないし、
「StringBuffer:」という書き方と「StringBuffer(s)」でしてる事が違いがあるのか分かりませんでした。

ワグラム中の 問 11 次の記述中の [7] オブジェクト指向 頭の位置は1である。 (4)として Catsb 解説 p. 158 クラス StringBuffer は文字列処理を行うクラスである。 クラス StringBuffer a 図に示す。 に入れる正しい答えを, 解答群の中から選べ。 ここで、文字の先 明を ある。 関数 stringProcessing を stringProcessing ("ABCD") として呼び出すと, 戻り値はで ()tignod 型 説明 メンバ変数 文字列型 格納する文字列。 str 説明 コンストラクタ StringBuffer (文字列型: str) (Linersqlstsb. メソッド 戻り値 引数 strでメンバ変数 str を初期化する。 説明 append(文字列型: str) StringBuffer メンバ変数 str の末尾に引数 str を追加し,イ ンスタンスへの参照を返す。 delete(整数型: start, StringBuffer メンバ変数 str の start 番目からend - 1番 目まで削除し, インスタンスへの参照を返す。 メンバ変数 str を返す。 整数型: end) toString() 文字列型 TIDNA replace (整数型: start, StringBuffer メンバ変数 str の start番目から end 整数型 end, 文字列型: str) lastIndexOf( 整数型 文字列型: str) 目の部分文字列を引数 str に置換し, インス inersqtiqson タンスへの参照を返す。 tibne メンバ変数 str を検索し, 引数 strが最後に出 現する、先頭からの文字位置を返す。見つか らない場合は-1を返す。 図 クラス StringBuffer の説明 ISASE [プログラム] 1: ○整数型: stringProcessing (文字列型:s) 2: StringBuffer: sb ← StringBuffer(s) 3: sb ←sb.append("ABCD").delete(4, 6) 4: sb ← sb.append(sb.delete(2, 3).toString()).replace(3, 4, "D") 5: return sb.lastIndexOf("CD") 第1部 予想 ided ist ge 01508300 金を
基本情報技術者試験

回答

✨ ベストアンサー ✨

簡単に まとめてみました。

クラスとオブジェクト(またはインスタンス)については既に知っているという前提でよろしいでしょうか?

■「StringBuffer: sb ← StringBuffer(s)」の意味

別の質問で『文字型: a ← "B"』というコードがありましたよね。これは

1. 文字のみを入れられる箱を作り、(変数型)
2. その箱に a という名前をつけ、(変数名)
3. "B" と書かれた紙を中に入れ、(変数の値)
4. いまいる教室に置く。(局所変数)

という意味でした。

クラスとは、複数の変数と複数の関数(メソッド)を 1 つにまとめた新しい型のことなので、『整数型』や『文字型』のような感じで使えるんです。

なので、上の例にならうと、『StringBuffer: sb ← StringBuffer(s)』は、

1. StringBuffer 型(とその派生型)のオブジェクトのみを入れられる箱を作り、
2. その箱に sb という名前をつけ、
3. StringBuffer 型のオブジェクトを新しく作って中に入れ、(※後述)
4. いまいる教室に置く。

という意味になります。

■2 行目の「sb」というのは、なにか?

変数(箱)につけた名前(変数名)です。
変数名は(プログラミング言語のルールの範囲で)自由につけることができます。

■説明してる枠の中に sb についての記載がないのは、なぜ?

sb は箱の名前(変数名)なので、使う側で勝手に付けることができますよね。
a でも b でもいいですし、sb1, sb2 のように複数 作ってもいいです。

使う側で勝手につけられる名前なので、クラスの説明文には書かれていません。というか、書くことができません。

一方で、メンバ変数はクラス設計者がつけた名前なので、説明文に記載があります。
もちろん、使う側が勝手に名前変更できるものではありません。

■「StringBuffer: 」と「StringBuffer(s)」の違い

「StringBuffer: 」という部分は「文字型: 」と同じように、変数の型を指定している部分です。
単に、箱に入れられるデータを制限しているだけで、実際にデータを作ったり、初期化しているわけではありません。
イメージで言うと、箱を作っただけの状態です。中身は空です。

「StringBuffer(s)」という部分は、StringBuffer クラスのオブジェクトを 1 つ、実際に作ってます。
そのときに、初期化用のデータとして s の箱の中のデータ "ABCD" をコンストラクタに渡した、ということですね。

なので、

「StringBuffer: 」 → 箱の性質(型)を決めただけ
「StringBuffer(s)」 → データ(オブジェクト)を実際に作った
「StringBuffer sb: ← StringBuffer(s)」 → オブジェクトを作って代入した

という違いがあります。

■参照について

いきなり全て話すと混乱する可能性があるかと思い、ちょっと不正確な記述をした部分があります。

上の説明の手順 3 で、

3. StringBuffer 型のオブジェクトを新しく作って中に入れ、

と書きましたが、ここは正確には、

3. StringBuffer 型のオブジェクトを新しく作って、その参照を紙に書いて中に入れ、

となります。

オブジェクト自体は、実は箱には入れません。

でも、写真の問題では、不正確なイメージのほうでも問題なさそうなので、必要ないなら「参照について」の部分の説明は無視して構いません。

不明な点があればコメントください。
分かる範囲で答えますので。

もも

ありがとうございます。なんとなく理解できてきました。

「StringBuffer: 」 → 箱の性質(型)を決めただけ
というのがまだイメージ掴めておらず、、

文字型みたいな感じで箱の性質を決めてるという事だと理解しましたが、
StringBuffer型の性質とはどうかいう意味でしょうか。
特にこのStringBuffer型というのに意味はなく、箱の形が作られたイメージでしょうか。

■StringBuffer 型の性質とは、どうかいう意味か?

あまり難しく考えなくていいと思いますよ。

単に、箱の中に入れることができるデータを制限しているというだけの話です。

例えば、文字型の箱 a の中に、整数 789 を入れることはできませんよね。
もし、無理やり入れようとするコードを書くと、コンパイラがエラーを出して、コンパイルしてくれません。

これは、
・箱の型と異なる型のデータを入れようとしている。
→間違ったコードを書いているのでは?
→プログラマに知らせよう
という、コンパイラの機能なのです。

なので、「StringBuffer 型の箱」というのは、単に StringBuffer クラスのオブジェクトしか入れられない箱のことです。
「性質」という曖昧な言葉を使ったので、ちょっと分かりにくかったかもしれません。

■StringBuffer 型というのに意味はない? 箱の形が作られたイメージ?

イメージでいうなら、箱の形は全て同じです。直方体状でいいでしょう。(ちょっと後述)
整数型も文字型も StringBuffer 型も同じ形をした箱です。
箱の形だけで、何の型の箱なのかを区別することはできません。

どうやって区別するかというと、その箱の側面にラベルが貼ってあって、
・変数名(例: a, b, sb など)
・箱の型(例: 整数, 文字, StringBuffer など)
が書かれているイメージです。

そして『コンパイラ』という名前の警備員が常に監視していて、間違った型のデータを入れようとすると、警告(コンパイルエラー)をしてきます。
「あなたは整数を入れようとしましたが、この箱には StringBuffer クラスのオブジェクトしか入れられませんよ」みたいに。

なので「StringBuffer 型の箱」というのは、何か特別な形や性質をもった箱のことではありません。
単に、「型: StringBuffer」とラベルに書かれてあるだけの普通の箱です。
StringBuffer クラスのオブジェクト以外も物理的には入るけど、入れようとすると警備員に怒られるだけです。

もう一度、元の質問に答えてみると、(1 つめのコードを少し改変してますが)
「StringBuffer: sb」 → 普通の空箱を持ってきて、「変数名: sb, 型: StringBuffer」とラベルに書いた
「StringBuffer(s)」 → StringBuffer クラスのオブジェクトを実際に作った
「StringBuffer sb: ← StringBuffer(s)」 → オブジェクトを箱 sb に入れた(型は同じなので怒られない)
というイメージです。

ちなみに、意図的に ちょっと不正確な記述をしていて、より正確には こうです。
・誤:「StringBuffer クラスのオブジェクトしか入れられない」
・正:「StringBuffer クラスか、その派生クラスのオブジェクトしか入れられない」
(クラスの継承について、まだ勉強されてないなら無視していいです)

余談ですが、箱の大きさは異なるイメージでもいいかもしれません。
例えば、32bit 整数型と 64bit 実数型なら、データ量が 2 倍なのだから、箱のサイズも 2 倍というイメージでもよさそう。
(ただ、イメージが面倒になるので、同じ大きさの箱でもいいと思いますが)

もも

ありがとうございます!理解できました。
詳しくありがとうございます🙇‍♀️

もも

解説いただいたおかげで、基本情報技術者試験に合格できました。ありがとうございました!

おお、おめでとうございます!!
役に立てたようで、僕もうれしいです。

この回答にコメントする
疑問は解決しましたか?

この質問を見ている人は
こちらの質問も見ています😉