質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

2080閲覧

Java クラスライブラリがうまく解釈できない 2

Abeginner

総合スコア29

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/25 22:57

編集2016/11/26 01:25

Windows10でEclipseを用いてJavaの勉強をしています。

昨日同じ質問をしてみたのですが、質問の仕方が悪かったのか、うまく理解できなかったので、もう一度質問させてください。
*昨日の質問*
https://teratail.com/questions/56549

質問としては、
Javaのクラスライブラリとは、どう解釈して使えばいいものか教えて欲しい
ということ。

例えば、char charAt(int index) というクラスライブラリを想定した時、int indexという言葉が出てきます。
int型のindexという仮引数だと説明して頂いたのですが、仮引数だったらaでもxでも何でも良さそうな気がしますが、何を見てもchar charAt(int index) はindexです。
indexつまり索引? 意味がわかりません。int型の索引って何ですか? short型とかdouble型のindexもあるのですか?
そもそもindexって何ですか?
他のクラスライブラリだとoffsetとか色々出てきます。
indexとかoffsetとか習った覚えもないワードがたくさん出てきて混乱してしまいます。

しかも、char charAt(int index) とvoid setCharAt(int index, char ch) では、同じint indexを使っています。コンピューターはどうやって区別しているのですか?
void setCharAt(int index, char ch) のint indexを指定したせいで、char charAt(int index)が間違った動きをしたりしないのですか?
indexって本当に仮引数なんですよね? int indexと書かれた時にだけ特殊な働きをする暗号だったりしないんですよね??

実際、何を見ても、誰に聞いてもわからなかったので、char charAt(int index)のint indexには見た感じ「何文字目を指定したいのか」を数字で入れればいいんだろうと予想して適当に使っていましたが、クラスライブラリを見ていると説明もなしにindexとかoffsetとかprefixとかchとか、挙句の果てにはaやらbやら、類推の限度を超えたワードまで出てきます。
これらは何なんですか?
昨日は、参考書を勉強し直せと言われてしまいましたが、私の調べ方が悪いのかindexやoffsetの説明を見つけることはできませんでした。
プログラマーなら、説明なしに当然理解できるものなのですか?
どうやって勉強したらいいですか?

ご指導、ご鞭撻のほどよろしくお願いいたします。

*追加*
まだ伝わりにくかったのかもしれません。もっと具体的にしてみます。
charAtについて。
charAtの説明をコピーしてくると、

public char charAt(int index)

指定されたインデックスのchar値を返します。インデックスの範囲は0からlength() - 1までです。配列のインデックス付けの場合と同じように、シーケンスの最初のcharのインデックスは0、次の文字のインデックスは1と続きます。
インデックスで指定されたchar値がサロゲートの場合、サロゲート値が返されます。
定義:charAt、インタフェース: CharSequence
パラメータ:index - char値のインデックス。
戻り値:文字列内の指定されたインデックス位置にあるchar値。最初のchar値のインデックスが0になる。
例外:IndexOutOfBoundsException - index引数が負の値、または文字列の長さと同じかこれより大きい値の場合。

つまり…? どういう意味??
指定されたインデックスというのがint indexですか?
length()-1とか、どこから出てきた?

全く意味が分からないけど、たぶん「あいうえお」という文字列があったら、コンピューター的には「"あ"というchar値、"い"というchar値、"う"というchar値、"え"というchar値、"お"というchar値」って書かれてて、文字の順番を「0,1,2,3,4」と数える。
だから、「1」って言ったら「い」って返す。
そういう意味だと当たりを付けて使っていました。

でも、だったらintって何?
int型で数え切れる範囲内なら数えてやるけど、100万文字目は数えてやらないから使う時気を付けろよ!という意味? それとも、その時はその時でintを書き換えればいいのですか?
その前に、インデックスの解釈もわからないし、charAtもchar型のAtという意味? Atって何?
いや、charAtという名前のメソッドなんだろうとは思いますよ。でも、charは何でAtは何なんですか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2016/11/26 00:54 編集

そもそも言われている「クラスライブラリ」というものは一体どこを見ているのでしょうか?本ですか?サイトですか?アプリのヘルプですか?「何を見てわからないのか」をはっきりしてみてはどうでしょうか?もしかしたら、間違っている物や説明などの情報が不足した物を見ていている可能性もあると思っています
guest

回答4

0

まず大前提ですが、引数の名前はコンピューターにとって「メソッドでの変数を区別する」以上の意味はありません。つまり、例に出したものでは「charAtint型の引数を1つ取る」、それだけです。また、メソッドの引数はメソッドの実行ごとに別なものとなるので、同じindexの引数があるメソッドに影響する、なんてこともありません。

では、何のために名前がついているかと言えば、それは人間のためです。仮にcharAt(int hoge)となっていたとしても動作は同じなのですが、hogeでは何を与えればいいのかわかりません。一方で、int indexとなっていれば、推測ができるようになります。

とはいえ、どちらにしてもドキュメントをしっかり確認してください。繰り返しますが、変数の名前に「コンピューター的な」意味はありません。

(補足)

Stringの長さをintで数えている件ですが、String.lengthint型を返すように、そもそも「intの最大値(21億ちょっと)より長い文字列は1つのStringにできない」ようです(もっとも、それ以前にメモリが足りなくなるかもしれませんが)。

投稿2016/11/25 23:16

編集2016/11/26 02:30
maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Abeginner

2016/11/26 02:02

2点お聞きしてもよろしいでしょうか? "int indexとなっていれば、推測ができるようになります。" とありあすが、具体的に脳内ではどのように推測しているのか教えて頂けますか? ドキュメントとは具体的に何でしょうか? https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#charAt-int- の説明文のこと? それとも、何か探すと他にドキュメントというものが存在しているのでしょうか?
maisumakun

2016/11/26 02:09

Abeginner

2016/11/26 02:22

つまり、indexは単なる英単語ってこと?? 最初に混乱しはじめたきっかけは、コンピューターだしindexって言ったら指数のことかな? つまり、このクラスライブラリはindexに数字を代入すると、内部の計算で指数関数に値を渡すのかなーとか思ったら、他のクラスライブラリを見ていると、どうもそういう意味ではなさそう。 結局、indexというのは「目盛り、指針」と解釈すればいいのですね? でも、プログラミングの目盛りって何ですか?? リファレンスというのも、 https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#charAt-int- の説明部分?ですよね? 正直、見てもわからないんですけど…(具体的には、質問本文の追記内容のような状態になってしまいます) これ、どうしたらいいのですか?
maisumakun

2016/11/26 02:23

はい、何度も説明しているように「index」は「単なる英単語」です。特別な意味なんてありません。
Abeginner

2016/11/26 02:35

でも、例えばchar charAt(int index)とStringBuffer deleteCharAt(int index)だったら、どっちもint indexですよね? static int abs(int a)は同じint型でもindexではなくてaですよね? つまり、世の中のプログラマーはindexやaと言われたら、何か共通のものを想像しているのではないのですか? それとも、indexやaには何の意味もなく、世の中のプログラマーは何も想像せずcharAtを見ただけでindexとかは無視してプログラミングしているんですか?
maisumakun

2016/11/26 02:54

まず、「コンピューター処理の上では」indexであろうがaであろうがteratailであろうが、なんでも構いません。「引数名は無視して」プログラミングしても、全く問題はありません。 一方で、「プログラムを書く人間からすれば」、引数名には「どういう引数を渡す」と意味付けをしてあります。とりわけ、複数の引数を取るメソッドを呼ぶ場合、どの引数がどれだったか、名前を見ればある程度判別できます。 ただ、それを行うには、ある程度の「慣れ」が必要です。慣れるまでは、引数名に悩むぐらいであれば無視して「何番目の引数に何を与える」という感じでプログラミングした方がいいと思います。 (なお、別なメソッドに同じ名前の引数があっても、「特に関連があるとは限りません」。)
guest

0

ベストアンサー

英語圏の人間なら見たら恐らくすぐわかります

char charAt(int index) -> 文字型 文字位置(整数型 添字)

void setCharAt(int index, char ch) -> なし 文字位置調整(整数 添字,文字型 文字)

offset -> 位置を基準点からの距離で表した値

prefix -> 頭にくっつく文字

index -> 何番目か(添字)

ch -> よく見て下さい これは 「char(文字)」という単語を半分にしただけです 単に「文字型の変数」を示したいがcharと書くと前の型を示すcharと見分けがつきにくいので半分にしただけ

サロゲート -> 機械的に連番を振った主キー http://exlight.net/devel/unicode/surrogate.html
サロゲートが分からないのはプログラムを作る上での基礎知識がそこまで至っていないからで、
そこはでできた時に調べて勉強するべき部分だと思います

APIに書いてあるメソッドの中に宣言された変数名は全て 人間相手の説明のために
メソッドの例を示すために中に入れてあるもので、変数名は その役割を示す、英語を使う人間にとっては分かりやすい意味の名前に
なっているだけですおそらく 実際に使用する時には別の名前でも問題ありません
aやらbやらは、単に意味をつけず違いを示す二つ以上の変数を分けて示すだけでいい場合に書かれているのだと思います

これらは何

変数名はただ説明のために英語で書いてあるだけです メソッド名のようにプログラム内で使うためには
一字一句変更してはならないものとは違います

英語ではなくカタカナ語にして検索すると出てきます
出てきてもよくわからない場合は検索結果の別のページをめぐってその状況で使えると思える意味が出るまで探します

APIは日本語訳されてあっても、メソッド内部の変数やメソッド名そのものまでは日本語訳されていません。
charAt の場合 at が The train stops at the station.(その列車はその駅で止まる)などで使われている
「どこで」を示す単語だと分かり
APIを読まなくともcharAt は文字位置に関係するメソッドだと類推できます。
indexやoffsetも 英語圏のエンジニアなら読めばすぐ類推できるものなのでしょう しかし
日本語圏の人間にはそれが分からない
技術英語というジャンルがあったような気がしますが
プログラム上でよく用いられる英単語に慣れれば分かるようになるものなのだと思います

APIに示されているのはたいてい(か、全て)
メソッド
修飾子 型名 メソッド名(型名 変数名,型名 変数名,型名 変数名....)
か、
コンストラクタ
修飾子 クラス名(型名 変数名,型名 変数名,型名 変数名....)

です このどちらかに当てはめて読みます

indexって本当に仮引数なんですよね? int indexと書かれた時にだけ特殊な働きをする暗号だったりしないんですよね??

仮引数であり、 int iodexでもint idoexでも働きは同じです 特殊な働きなどはないのではないかと思います
単に いつもどのメソッドの説明にもコンストラクタにの説明も同じ意味を持つ変数を入れるべき部分には
同じ意味を示す英単語を書いていると
初見のメソッドやコンストラクタの説明を読んだとき「ああ この変数は
indexと書いてあるから添字を入れるんだな」 などと一発で分かるようになり便利だからです

http://wa3.i-3-i.info/index.html

指定されたインデックスというのがint indexですか?

そうです。

length()-1とか、どこから

このメソッド
public char charAt(int index)は、「String」クラスで用いられるメソッドです。

String a="what is this?";
という風にString型のオブジェクトみが作られると

char b=a.charAt(2);
という風にString型から用いることのできるメソッドです 他の型のクラスから用いるものではありません。
APIのcharAtメソッドが載っている部分の上のほうにString型のだと書いてあるのではないかと思います。

String型の話をしている時にlength() が出てきたら、それは
String型で用いられる別のメソッドであるlength()を指しています。

int c=a.length();
とすると、aの文字列の長さがcに代入される、そのような機能を持つメソッドです。

最初の一文字を0として数えていく数え方ではlength()の数そのものを入れると
最大文字数を一文字超えてしまうので、length()-1を最大値としているのです。

int型で数え切れる範囲内なら数えてやるけど、100万文字目は数えてやらないから使う時気を付けろよ!という意味?

そうです。通常使用する分には目で追える範囲、数えられる範囲の文字目を取り出す機能で充分です。この
charAtメソッドはそれ以上の機能を持っていないのです。
ただ100万文字目は数えてくれます intの扱える範囲は-2147483647~2147483648で100万を軽く超えているので・・・

投稿2016/11/26 01:29

編集2016/11/26 04:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/11/26 02:26

もしかして回答内容をエディタで作ってコピー&ペースしていませんか?teratail のバグで記述内容が表示されないというものが以前有ったので、ペースト後に何文字か記入してみてください。
退会済みユーザー

退会済みユーザー

2016/11/26 02:48 編集

無表示訂正しました まさにエディタからペーストしたものでした
Abeginner

2016/11/26 02:57

ありがとうございます! やっとわかりました!! ここで書いて下さった offset -> 位置を基準点からの距離で表した値 prefix -> 頭にくっつく文字 index -> 何番目か(添字) みたいなものは、どこで勉強したらわかるようになりますか?
退会済みユーザー

退会済みユーザー

2016/11/26 03:11 編集

カタカナ文字にして 「オフセット」とか「プレフィックス」で検索したら下のURLのサイトに意味が載っているのが出たり他のサイトで出た意味の検索結果から類推したのです indexに関してだけは以前から色んな所で見かけていたので「添字」だとしか考えられませんでした StringのメソッドのindexOf,lastIndexOfなどを使っているとメソッドの用途から自然にindexは添字を示すものだという理解が生まれていたからだと思います prefixはpreの時点で何か先頭じみた意味を感じましたし、英語の予備知識も関係あるのかも知れません
Abeginner

2016/11/26 03:16

本当だ…英語をカタカナ語にしただけで、わかりやすい説明がいっぱい出てきた…! ありがとうございます。本当にありがとうございます。 何を使って勉強しても、こういうのがずっとわからなかったんです! 英単語的な意味から類推していましたが、日常で使う意味とプログラミングしてる時に指すものって一致してるようで一致してないじゃないですか?(atって前置詞で場所とかを点で表そうとしてるんだとは思うけど、名詞が続かないぞ…場所でいいのか?みたいな) 本当に助かりました! ありがとうございます!!
Abeginner

2016/11/26 03:20

ああ、わかった。 charAt(int index) って、「char型の文字 at 整数型で表した添え字」って意味か。
Abeginner

2016/11/26 03:33

あああああああ! クラスライブラリで、何でところどころ大文字が入ってるのかと思ったら、そこで単語毎に分解できるようになってるのか! StringBuffer replace (int start, int end, String str)だったら、 String buffer replaces a string, which is from "int start" to "int end", to "String str". って解釈すればいいのか! わかった。わかりました。 重ね重ね、本当にありがとうございました!
退会済みユーザー

退会済みユーザー

2016/11/26 04:05 編集

待ってください StringBuffer は Stringとは全く別の変数の型です StringBuffer s1=new StringBuffer("全く"); StringBuffer s2=new StringBuffer("別"); のように使います 用意されているメソッドもappend やinsertなど全然別物です String型に入れるとできない操作を文字列に対して行える型です 半角スペースでの間が空いていないものを切断して二つにして解釈するのは間違いかと・・・いえ 単一の返り値の型だと分かってて意味上でのみ切断して解釈しているのなら問題ないですが
Abeginner

2016/11/26 04:04

StringBufferはString型のBufferではなく、String Bufferという固有名詞(クラス名)ということですよね? publicとか英語の前置修飾の形だし、先頭から読んでいくとブロークンな英文になるように書いてあるのかと思ったのですが、そうではなく…? ていうか、プログラムされている時って、クラスライブラリを目にした時にはどのように考えているのですか? StringBuffer insert(int offset, char c)とか、丸暗記ですか??
退会済みユーザー

退会済みユーザー

2016/11/26 04:15 編集

StringBuffer insert(int offset, char c)は、 返り値の型 メソッド名(引数の型1 引数の名前,引数の型2 引数の名前...) の形に当てはめると StringBuffer=返り値の型 insert=メソッド名 int offset, char c =引数の型1 引数の名前,引数の型2 引数の名前 だと分かります 場合によっては(というかしばしば) 修飾子 返り値の型 メソッド名(引数の型1 引数の名前,引数の型2 引数の名前...) にもなり、その場合は 先頭にpublic,private などの修飾子がつく場合がありますが、要は ()の直前にある名前がメソッド名であり、そのまた一つ前に書いてある単語は 「返り値の型」だということです。 引数とは違い、返り値の数は一つです 二つ以上にはなりません また 引数の場合のように適当な変数の名前がつけられていません 型だけ書いてあるのです なのでこの場合も返り値の数は一つであり、StringBufferは単一の型として読めます というかスペースで区切られていないものは単一の何かの名前であり基本的に分離できません 確かに大まかに英文としても読めるのでしょうが、プログラムとしての読み方は英文の読み通りとは限りません 丸暗記というかよく使うものは使用時に毎回調べて使っているうちに覚えていると思います
ozwk

2016/11/26 04:14

知らないやつ見たらググれば一発。良い世の中。 頻繁に出てくるやつは自然に覚える。 学校のテストじゃないんだから 自分で「このメソッドはどういう動きをするんだろう」なんて無駄なこと考えるより さっさと調べる。
swordone

2016/11/26 15:46

補足説明 charAtの様に、単語ごとの頭文字を大文字にしてつなげる書き方を「キャメルケース」と呼びます。キャメル=ラクダ の背中のようにでこぼこしているからそう呼ばれたのでしょうね。
guest

0

メソッドの仮引数、もっと言えば変数の名前はプログラムにとって変数を区別する以上の意味はありません。あなたの言うとおり、

int型のindexという仮引数だと説明して頂いたのですが、仮引数だったらaでもxでも何でも良さそうな気がします

そう、なんだっていいのです。また、メソッドの引数はローカル変数のような扱いになるので、別メソッドの引数名とかぶったところで何ら問題ありません。メソッド名と引数の個数で判別出来ます。

ただ、クラスライブラリというのは個人で作ったプログラムと異なり、作成者と違う不特定多数の人が利用することを前提としています。好き勝手な名前を付けたのでは、その引数の意味、つまり「何を引数に渡せばいいのか?」が作成者以外の人は分かりませんよね。
一応、クラスライブラリにはドキュメントが存在します。例に出されたcharAt、おそらくStringクラスのメソッドと思われるのですが、「Java String」のように検索するとこのようなページが上位にヒットします。この中のcharAtメソッドに、パラメータとして引数の説明があります(少々わかりにくいですが…)。前回の質問で出てきたStringBufferもこの通り。

ただプログラミングしているときにいちいちこんなのを検索して、中の説明を読んではいられません。引数名に人が読んで意味のある名前が付いていれば、何を渡せばいいかがわかりやすくなります。

投稿2016/11/25 23:57

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Abeginner

2016/11/26 00:16

このcharAtのリンクを見ると、 "インデックスで指定されたchar値がサロゲートの場合、サロゲート値が返されます。" と書いてあります。 このインデックスって何ですか? サロゲートって何ですか?? int indexのindexはここで書いてある"インデックス"を意味しているのですか?
swordone

2016/11/26 00:28

indexはその通り「インデックス」です。もともと英語のドキュメントを日本語化したものなので、ところどころ不自然になったりしています。 サロゲートはまた別の話になってしまうのですが、簡単に説明します。 もともとJavaでは文字を表す型としてcharがあります。これは16ビットなので2の16乗=65536通りの文字が表せます。しかし表現したい文字が増えてきて、これでは足りないという事態に陥りました。そこで、一部の文字についてはchar2つで一文字を表そうということになったのです。この片割れが「サロゲート」です。
Abeginner

2016/11/26 00:43

自分でもどこまで理解できたのかわからないのですが、 char charAt(int index)の場合、 char型の戻り値を持つcharAtというメソッドで、char型で指定したAt一文字が何かを教えてくれますという意味? カッコ内に入れて欲しいのは、int型のインデックス。 インデックスというのは…雰囲気から察するに、何文字目かを意味するプログラミングの用語? そして、charAtが指定したのがchar2つで一文字を表すパターンであれば、ちゃんとchar2つで返しますよ…という解釈であってますか???
guest

0

昨日は、参考書を勉強し直せと言われてしまいましたが、私の調べ方が悪いのかindexやoffsetの説明を見つけることはできませんでした。

昨日の私の回答は読まれましたか?仕様書に書いてあります。

Java8 API仕様書(日本語)
Java9 API Specification

投稿2016/11/25 23:30

MasashiKimura

総合スコア1150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2016/11/25 23:48

おそらく、「メソッドを超えた」indexの意味を探しているので、(もともとそんなものはないから)見つかっていないんだと思います。
swordone

2016/11/25 23:59

初心者にいきなりこのページはハードル高すぎるかと…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問