I/Pログ

プログラミング(現在Java)の学習アウトプットログです。基本から始めていきます。ブログタイトルのI/PはInternet Protocolと、Idea Portの意味をもたせています

Java(oracle) 型の確認クイズ

今回は、初めのほう記事にしたJavaの「型」について、簡単なクイズ形式でプログラムを作ったので、投稿します。

//jstest.html
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="reset.css">
    <link rel="stylesheet" href="jstest.css">
</head>
<body>
    <h1>Javaの型について</h1>
    <ul>
        <li>
            <p>とても小さな整数の型の名前</p>
            <input type="text" id="Question1"><button id="btn1">Answer</button>
        </li>
        <li>
            <p>小さな整数の型の名前</p>
            <input type="text" id="Question2"><button id="btn2">Answer</button>
        </li>
        <li>
            <p>普通の整数の型の名前</p>
            <input type="text" id="Question3"><button id="btn3">Answer</button>
        </li>
        <li>        
            <p>大きな整数の名前</p>
            <input type="text" id="Question4"><button id="btn4">Answer</button></li>
        <li>
            <p>少しあいまいでもいい小数</p>
            <input type="text" id="Question5"><button id="btn5">Answer</button>
        </li>
        <li>
            <p>普通の小数</p>
            <input type="text" id="Question6"><button id="btn6">Answer</button>
        </li>
        <li>
            <p>真偽値型</p>
            <input type="text" id="Question7"><button id="btn7">Answer</button>
        </li>
        <li>
            <p>文字型</p>
            <input type="text" id="Question8"><button id="btn8">Answer</button>
        </li>
        <li>
            <p>文字列型</p>
            <input type="text" id="Question9"><button id="btn9">Answer</button>
        </li>
    </ul>
<script src="jstest.js"></script>


</body>
</html>
//jstest.css
html{
    color: #333333;
    text-align: center;
}
body{
    width: 480px;
    margin-bottom: 80px;

}
li{
    list-style: none;
    margin-bottom: 16px;
}
button{
    color: #fff;
    background-color: #333;
}
//reset.css
*,*::before,*::after{box-sizing:border-box}
body,h1,h2,h3,h4,p,figure,blockquote,dl,dd{margin:0}
ul[role="list"],
ol[role="list"]{list-style:none}html:focus-within{scroll-behavior:smooth}
body{min-height:100vh;text-rendering:optimizeSpeed;line-height:1.5}
a:not([class]){text-decoration-skip-ink:auto}img,
picture{max-width:100%;display:block}
input,button,textarea,select{font:inherit}
@media(prefers-reduced-motion:reduce){html:focus-within{scroll-behavior:auto}*,
*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;
    transition-duration:.01ms !important;scroll-behavior:auto !important}}
//jstest.js
document.getElementById("btn1").addEventListener("click",ansCheck1);
function ansCheck1(){
    let answer = document.getElementById("Question1").value;
    if(answer == 'byte'){
        alert('Correct');
    }else{
        alert('mistake... 正解はbyteです');
    }
}

document.getElementById("btn2").addEventListener("click",ansCheck2);
function ansCheck2(){
    let answer = document.getElementById("Question2").value;
    if(answer == 'short'){
        alert('Correct');
    }else{
        alert('mistake... 正解はshortです');
    }
}

document.getElementById("btn3").addEventListener("click",ansCheck3);
function ansCheck3(){
    let answer = document.getElementById("Question3").value;
    if(answer == 'int'){
        alert('Correct');
    }else{
        alert('mistake... 正解はintです');
    }
}

document.getElementById("btn4").addEventListener("click",ansCheck4);
function ansCheck4(){
    let answer = document.getElementById("Question4").value;
    if(answer == 'Long'){
        alert('Correct');
    }else{
        alert('mistake... 正解はLongです');
    }
}

document.getElementById("btn5").addEventListener("click",ansCheck5);
function ansCheck5(){
    let answer = document.getElementById("Question5").value;
    if(answer == 'float'){
        alert('Correct');
    }else{
        alert('mistake... 正解はfloatです');
    }
}

document.getElementById("btn6").addEventListener("click",ansCheck6);
function ansCheck6(){
    let answer = document.getElementById("Question6").value;
    if(answer == 'double'){
        alert('Correct');
    }else{
        alert('mistake... 正解はdoubleです');
    }
}

document.getElementById("btn7").addEventListener("click",ansCheck7);
function ansCheck7(){
    let answer = document.getElementById("Question7").value;
    if(answer == 'boolean'){
        alert('Correct');
    }else{
        alert('mistake... 正解はbooleanです');
    }
}

document.getElementById("btn8").addEventListener("click",ansCheck8);
function ansCheck8(){
    let answer = document.getElementById("Question8").value;
    if(answer == 'char'){
        alert('Correct');
    }else{
        alert('mistake... 正解はcharです');
    }
}

document.getElementById("btn9").addEventListener("click",ansCheck9);
function ansCheck9(){
    let answer = document.getElementById("Question9").value;
    if(answer == 'String'){
        alert('Correct');
    }else{
        alert('mistake... 正解はStringです');
    }
}

今回の簡単なクイズは、html/css/Javascriptで作りました。 コピーして使用される場合、上記のファイルを同じ階層にまとめれば動作します。 Javaの型付けの仕様上半角英字以外での型宣言は受け付けないため、クイズも半角英字以外での入力はすべて不正解にしています。

Java(oracle) 型変換2 

今回は型変換についての2回目です。 まずは「強制的な型変換」からです。

public class Main{
    public static void main(String[] args){
        int pi = (int)3.1415;
        System.out.println(age);
    }
}

上記を実行すると、「3」とだけ出力されます。これは、(int)によるダウンキャストをされたためです。(int)のようなものを、キャスト演算子といいます。これは非常に強力で、先の例の場合小数点以下が文字通り「切り捨て」られて、データ自体を失ってしまいます。そのため、ほとんど使われることはありません。

演算時の自動型変換

7 / 2 = 3 // int
5.0 / 2.0 = 2.0 //double

上記のような計算をJavaでする場合、小数点以下の有無で自動的に型変換されます。

5.0 / 2 = 2.5

また上記のような場合、2が2.0として認識され、格納できる数字データの範囲が広いdoubleに統一されてから演算されます。

文字列を含む演算の型変換

public class Main{
    public static void main(String[] args){
        String msg = "今日は" + 25 + "日";
        System.out.println(msg);
    }
}

上記は、「今日は25日」と出力されますが、25がintからStringに変換されています。

型変換は、「int型のものをLong型にいれる」など、小さい物を大きい器に入れるような事は出来ますが、その逆はできません。現実でも、器よりも大きなものは入りませんね。それと同じ事がイメージできれば、大きなミスはないかと思います。
今回は以上です。お疲れ様でした。

Java(oracle) 型変換1

今回は型変換についてです。
先の記事に、データ型について書きましたが、今回は変数に代入する際のJavaの動きを解説します。
Javaには型を変換する仕組みがあり、3つ挙げられます。

  1. 代入時の自動型変換

  2. 強制的な型変換

  3. 演算時の自動型変換
    たとえば、int age;だけ宣言して、以下のように代入してみると下のふたつはエラーが起きるでしょう。

age = 20; //〇
age = 3.14; //×
age = "代入";×

int型で宣言しているのに、小数や文字・文字列は入れられません。 逆に、宣言した型のほうが大きい場合、入れる数字が「意味的に大きい」場合、代入することができます。(これもあいまいな表現なのでスッキリわかるJava 入門編を参照してください)
以下を実行してみて下さい。

public class Main{
    public static void main(String[] args){
float flo = 8; // flo型のflo変数に8を代入
double dou = flo; // floatよりも「大きな型」に再代入
System.out.println(flo);
System.out.println(dou);
    }
}

出力したふたつの変数は両方とも8.0になったでしょうか。先に代入した型よりも、2回目に代入する「型」のほうが大きい場合にはそのまま代入することができています。 「型」自体が扱える数字の大きさを小さい方から並べると

byte <  short < int < long < float < double

となります。

Java(oracle) 演算子について

今回はJava演算子についてです。 まず四則演算を行うものからです。

算術演算子

% : 剰余₍割り算の余り₎ 。割り算の余りを求めて表示します。
/ : 除算。商を求めます。
* : 乗算。積を求めます。
+ : 加算。和を求めます。
- : 減算。差を求めます。


文字列結合演算子

これは+だけの特別な仕様ですが、文字同士は、+で結合できます。

"文字" + "結合" = 文字結合

このような感じです。

代入演算子

= : 右辺を左辺に代入
+= : 左辺と右辺を加算してから左辺に代入
-= : 左辺と右辺を減算してから左辺に代入
*= : 左辺と右辺を乗算してから左辺に代入
/= : 左辺と右辺を除算してから左辺に代入
%= : 左辺と右辺を除算してからその余りを左辺に代入
+= : 左辺の後に右辺を連結して代入(文字+数字の結合など)

インクリメント/デクリメント演算子

++ : 値を1増やす
-- : 値を1減らす

インクリメント/デクリメント演算子は、主に繰り返し処理で使います(後に書きますが、for whileなどの事です)。これは少し変わっていて、左右両方にオペランドがあるものではありません。これは単項演算子と呼ばれます。 また、インクリメント/デクリメント演算子は被演算子の前後どちらに置くかによって、計算結果が微妙に変わるので注意しましょう。

public class Main{
    public static void main(String[] args){
        int a = 10;
        int b = 10;
        System.out.println(++a + 20);
        System.out.println(b++ + 20);
    }
}

試しに上記のコードを実行してみて下さい。計算結果が違うかと思います。解説は「スッキリわかるJava 入門編」に詳しくあるので、手に取ってみてはいかがでしょうか。
今回は以上です。お疲れ様でした。

Java(oracle) エスケープシーケンス

今回は、エスケープシーケンスについてです。

エスケープシーケンスはchar,String型のリテラルを記述する際に使います。¥'など、2文字でひと組として認識され、ブラウザなどで表示される記号として認識されます。

public class Main{
    public static void main(String[] args){
        System.out.println("この二重引用符(\")はブラウザで表示することもできます。");
    }
}

エスケープシーケンスは、主にブラウザに特殊な記号を出力したい状況(ネットショップとかなら¥マーク使いたいですよね)や、セキュリティ対策で使われます。
Webアプリケーションの場合、エスケープしていない事で悪意ある攻撃者がデータベースの書き換えができてしまうなど、大きな事故に繋がります。
この話については、徳丸浩さんがブログ・Twitterなどで発信したり書籍も刊行されているので、チェックしてみるのがいいかと思います。

今回は短いですが、これで失礼します。 お疲れ様でした。

Java(oracle) 計算の文

今回から何回かJavaoracle)における計算の文についてです。

int a = 7;
int b = 8;
c= a + b;

System.out.println(c);

試しに上記を実行してみると、cには15が入っているかと思います。Javaや、その他のプログラミング言語では四則演算の算数的なもの、文字の代入などを使った「数学」的なもの、文字の連結までが行えます。

式の構成要素について

a b ... z のアルファベット、数字をオペランド
+ - * / などの演算子オペレーター といいます。
オペレーターについて、少しだけ注意点があるので下記で示します。

int a = 7;//①

String b = "演";
String c = "算";
System.out.println(b + c);//②

まず①ですが、aには7が入ります。この式の=の意味は代入です。 では、②はどうでしょうか。実行してみると、「演算」と出てきます。これは、演 + 算と判断され連結された評価結果です。しかし、1文字なのでchar型ではどうなのかと実行してみると「charからStringへ型変換はできません」となりエラーが出ます。

リテラル

オペランドのなかで、「7」「literal」など具体的な値をリテラルといいます。 リテラルはデータ型を持っています。

小数点がない数字 [例: 87 / 型 : int]
小数点がない数字で末尾が[ L/l ] [例 : 81475623459L / 型 : Long]
小数点付の数字 [例 : 3.14159265359 / 型 : double]
小数点付の数字で末尾が[ F/f ] [例 : 2.71828182846f / 型 : float]
true または false [例 : true / 型 : boolean]
引用符で囲まれた文字 [例 : '鳳' / 型 : char]
二重引用符で囲まれた文字列 [例 : "Java" / 型 : String]


実際にJavaでプログラムを組もうとすると型のチェックがある前提なので以前のデータ型についても見直しておきたいところです。 今回はここまでです。お疲れ様でした。

Java(oracle) 変数の初期化と定数の利用

今回は変数の初期化定数の利用についてです。

変数の初期化

//パターン1
int age;
age = 23;
//パターン2
int age = 23;

変数の初期化には大まかに2パターンあります。上記のように2行に分けて、変数の型・変数名を宣言してから変数に数値・文字・真偽値などを入れるパターン。
パターン2は、変数の型 変数名 = 中身という感じで1行で書いてしまいます。使い分けが必要なものでしょうが、大体の人は1行で書いてしまえた方が楽なのではないでしょうか。

変数の再代入

int age = 53;
age = 23;

上記の変数ageは(53、23)どちらの数字が表示されるでしょうか? System.out.printlnなどでコンソールに出力してみて下さい。 基本的には、上から順に実行(順次実行)されて上書きされます。

定数の利用(上書きの拒否)

変数宣言の前に final という言葉をつけると、定数の扱いとなり、それ以後の変数の代入を受け付けなくなります。

final double pi = 3.14;
int multiplied =10;
pi = 2.718;
double ans = multiplied * pi;
System.out.println(ans);


上記のコードをコピーして動かしてみて下さい。pi = 2.718;の行でエラーが出るはずです。
上書きを拒否できるので、公式などの固定したい部分をfinalにする、Webシステムの上書きされたくない箇所(ユーザーコードなど)を定数にすることで安全に扱う事ができるようになります。

eclipseなどの統合開発環境はsyntax(構文)エラーなどを知らせてくれるので、 タイプミスなどにも気づきやすくなります。プログラムを書くのであれば、早めの導入をおすすめします。
今回は以上です。お疲れさまでした。