java.util.ScannerクラスのnextとnextLineの違い
以前のブログで書いたJavaの標準入力におけるnextとnextLineの違いについて簡単に記載します。
標準入力では文字列として認識させる方法として主に2通りあります。
それがnextとnextLineになります。
例1
Scanner sc = new Scanner(System.in);
String a = sc.next();
Scanner sc = new Scanner(System.in);
String b = sc.nextLine();
例1の場合はどちらで入力を行ってもa、bに格納されるのは文字列になります。
この違いを簡単に言うと、空白を認識するか空白までを認識するかの違いになります。
next:入力された値を”改行”までの範囲で認識します。
nextLine:入力された値を”空白”までの範囲で認識します。
これだけの説明だとわかりにくいと思うので少し例を出してみます。
入力値が”99 あああ”だった場合
nextの場合は空白までの値が認識されるためaには”99”が代入されることになります。
nextLineは空白も文字列として認識されるためbには”99 あああ”が代入されます。
空白を認識させたいかさせたくないかで使い分けるわけですが、nextは応用すると一度の入力で複数の値を識別することが可能となります。
例1を少し書き直します。
例2
Scanner sc = new Scanner(System.in);
String a = sc.next();
String b = sc.next();
bもnextに変えてみました。(一行削除している理由は特に考えないように)
この状態で”99 あああ”と入力します。
そうすると1度の入力でaには”99”、bには”あああ”が代入されます。
イメージを持ってもらえるように解説してみます。(解説はイメージです。厳密に言えば違うことを書いてますがあしからず)
nextを用いると値の入力を求められますが、入力した値はいったんscの中に格納されます。
つまりscの中には”99 あああ”が一時的に入っていると思って下さい。
その中からnextは空白までの値なので”99”が取り出されaに代入されます。(この時に空白は削除されます)
しかしscの中には”あああ”は残っている状態になります。
なので次にnextを実行するとscに残っている”あああ”がbに代入されます。
(ちなみにscの中身がない状態でnextを実行するとコンソール入力を求められることになります。なので、最初はscも空なのでコンソール入力をする必要があるわけです。)
for文のような繰り返しを用いると複数の値を一気に変数や配列に格納することが可能です。
他にもいろいろと使い方があるので、調べてみると面白いですよ!
Javaでのコンソール入力(Scannerクラスによる数値入力)
Javaでコンソール入力を行う方法について。
今回はScannerクラスを用いた標準入力の方法を紹介します。
持っているテキストで紹介されているのは、入力された値を文字列として扱う方法でしたので書式を次に示します。
java.util.Scanner (変数) = new java.util.Scanner(System.in);
String (変数2) = (変数).nextLine();
// 今回は(変数)をsc (変数2)をinpとしてみます。
java.util.Scanner sc = new java.util.Scanner(System.in);
String inp = sc.nextLine();
ですが、これだと数値を入力しても文字列として認識されてしまいます。
そこで文字列が数字列だった場合、数値に変換するメソッドを利用します。Integer.parseInt() // カッコ内の数字列をInt型の数値に変換(大文字可、マイナス可ただしマイナス記号は半角に限る、小数点不可、数値以外の場合はエラー)
これを使ってみます。
java.util.Scanner sc = new java.util.Scanner(System.in);
String inp = sc.nextLine();
int x = Integer.parseInt(inp);
xという変数を宣言してその中に変換した数値を代入してみました。
しかし、これだと入力値をinpに代入して、それをさらにxに代入するという手間がかかっています。
そこで2行目を省略してみます。
java.util.Scanner sc = new java.util.Scanner(System.in);
int x = Integer.parseInt(sc.nextLine());
これだとカッコの中にカッコが入り見栄えが悪いですね。
ここまできていきなりですが、実は最初から文字列ではなく数値として認識させる方法があるのです。
nextLineのLineをIntに変えるとInt型として、Doubleに変えるとDouble型として認識してくれます(最初からそれ使えよ!というツッコミは無視)
今回はInt型のxに代入するのでInt型で認識させてみます。
java.util.Scanner sc = new java.util.Scanner(System.in);
int x = sc.nextInt();
それでもまだ長いです。
そもそも最初の行が何してるかわからない人も多くいるでしょうし、2度も”java.util.Scanner”を記述するのは面倒ですね。
ということでこれを省略します。
importを使って”import java.util.Scanner;”を宣言しておけば後はScannerと記述するだけでjava.util.Scannerとして認識してくれます。
(”import java.util.Scanner;”を記述する必要あり)
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
かなりすっきりしてきました。
(余談ですが、Eclipseだと”import java.util.Scanner;”を記述しなくても自動的に挿入してくれます。)
しかし、C言語だと1行で済むのにJavaだと2行かかってしまってしまいます。
そこで、これを無理やり1行にまとめてみます。
(”import java.util.Scanner;”を記述する必要あり)
int x = new Scanner(System.in).nextInt;
かなり無理やりですがなんとか1行で表せました。
しかし、”import java.util.Scanner;”の記述が嫌な人もいるでしょうからこれをさらに書き換えます。
int x = new java.util.Scanner(System.in).nextInt;
なんとか1行だけで表すことが出来ました。
これらをまとめると次のようになります。
java.util.Scanner sc = new java.util.Scanner(System.in);
String inp = sc.nextLine();
int x = Integer.parseInt(inp);
↓
java.util.Scanner sc = new java.util.Scanner(System.in);
int x = Integer.parseInt(sc.nextLine());
↓
java.util.Scanner sc = new java.util.Scanner(System.in);
int x = sc.nextInt();
↓
(”import java.util.Scanner;”を記述する必要あり)
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
↓
(”import java.util.Scanner;”を記述する必要あり)
int x = new Scanner(System.in).nextInt;
↓
int x = new java.util.Scanner(System.in).nextInt;
Scannerクラスでどこまで出来るかな~と挑戦したらこのような結果になりました。
セキュリティとは
セキュリティとは何か?
セキュリティとは日本語では良く"安全"と訳される。
けれども、’safety’も"安全"と訳される。
結果的に同じもの?とも考えられるが、実際は別物。
セキュリティの意味についてはいろいろな解釈があるのですが、今回はセキュリティの語源から意味を考えてみます。
まず、セキュリティを英語でかくと‘security’で、これは‘secure’の名詞形になります。
‘secure’の語源はラテン語の’se’(~なしに)と’cura’(心配)からきており、これが“心配からの自由”という意味で‘secure’として英語に組み込まれました。
‘security’は‘secure’の名詞形であることから“secureである条件(または方法)”のこと
つまり、セキュリティとは“~からの自由”という構造を持っており、心配事や恐怖、不安等の様々なネガティブな要因からの自由、つまり、“安全を脅かす様々な脅威からの自由”のことをセキュリティと言います。
何が脅威になり得るかはケースバイケースですが、基本的には人が生み出す脅威もしくは自然発生する脅威の2種類に分類することができるように感じます。
何となく難しそうな話をしてみましたが、いろいろな説があるので一概にこれだとは言えません。
日本語でセキュリティを表現すること自体に意味はなく、議論する必要があるのかは謎です。ですが、世の中にはそんなことをいろいろと考える人もいたりします。
Linuxとは
LinuxとはOS(OperatingSystem)の一種です。
Linuxが登場した時には既にUNIXというOSが普及していました。しかし、UNIXは特許等の権利関係に縛られており、自由に使えるようにはなっていませんでした。そこで、Linuxの開発者であるLinusTorvals氏がC言語を用いてゼロから作ったものがLinuxというOSになります。
当時既に普及していたUNIXとの互換性を求め、UNIX上で動くソフトウェアの大半をLinux上でも動かすことが出来ました。そのため、UNIXと互換性を持ちながら、UNIXのような縛りがないこともあり普及していきました。
Linuxの正体はカーネルと呼ばれるパソコンを動かすために必要となる核の部分のことです。言い換えるとパソコンを動かすための基礎部分のことです。
カーネルだけでは何もすることができないため、実際にLinuxを利用するにはLinuxカーネル以外にも様々なプログラムが必要になります。
そのため、Linuxをパソコン上で動かすには必要なプログラムを一つ一つ集めて・・・とする必要があったのですが、それを各パソコン毎に行うのが多大な手間がかかるため、それを集めて、設定を行い、簡単にインストールできるようにパッケージ化してくれたものが提供されるようになりました。また、このパッケージのことをディストリビューションと言います。
複数の人や企業、団体が様々なディストリビューションを提供しているため、Linuxと一言でいってもさまざまなディストリビューションが存在します。
Linuxのディストリビューションの数は星の数ほどあります。
数多くのディストリビューションが存在しますが、これらを大別すると3系統に分類することができます。
・RedHat系
(Red Hat Enterprise Linux、Fedora、CentOSなど)
・Debian系
(Slackwareなど)
この分類はパッケージの管理システムの違いで分類されています。
Redhat系はパッケージ管理システムにRPM形式、Debian系はdeb形式を採用している系列であり、Slackware系はパッケージ管理システムを持っていない系列になります。
簡単にこの形式の違いを説明すると、RPM形式は設定等がある程度自動的に行われ、deb形式は詳細な設定が可能。それに対してパッケージ管理システムを持っていないSlackware系は基本的にはすべて自力で行う必要があり手間がかかりまます。
とりあえずLinuxを試してみたいという人にはSlackware系ではなくRedHat系かDebian系をお勧めします。
余談ですが互換という言葉について
互換にはソース互換という言葉とバイナリ互換という2種類あります。
プログラムは、プログラミング言語で書かれたもの(ソースコード)をコンパイラと呼ばれる翻訳機でコンピュータが扱える0と1の2進数(バイナリ)に翻訳(コンパイル)することで利用することが出来るようになります。
ソース互換とはソースコード段階での互換性、バイナリ互換とは翻訳されたバイナリ段階での互換性のことです。
わかりやすく言えば、ソース互換だと新たにコンパイルする必要があるのに対して、バイナリ互換とは既にコンパイルされたものを利用可能ということ。
LinuxはUNIXとソース互換であるため、UNIX用に書かれたソースコードを新たにLinux用にコンパイルし直す必要があるということになります。
ブログはじめました!
何を思い立ったかブログをはじめてみました!!
パソコン関係のことを中心に記事を掲載していきますのでどうぞよろしくお願いします!!
主に自身の知識の整理を行う予定なので役に立つかはわかりませんが、なるべくわかりやすく執筆していこうと思っております。
どうぞよろしくお願いします!!