プログラミング勉強ノート

JavaやPHPについて学んだことを書いていきます。

Java 配列とArrayList

Java SE 8

配列

配列の宣言

宣言した配列の要素数は後から変えることができない。
配列には同じデータ型の値しか入れることができない。
→インタフェースや継承によって多態性をもつ場合を除く。

//要素数3のint型配列
int[] list1 = new int[3];
int[0] = 0;
int[1] = 1;
int[2] = 2;

for(int i : list1){
	System.out.println(i);
}

//宣言時に要素を代入する
int[] list2 = {0, 1, 2, 3, 4, 5};

for(int i : list2){
	System.out.println(i);
}

文字列を配列に(split)

String data = "a,b,c,d,e,f";
String[] list = data.split(",");

配列を文字列に(join)

String[] list = {"a","b","c","d","e","f"};
String data = String.join(",", list);

配列の長さ(length)

String[] list = {"a","b","c","d","e","f"};
System.out.println(list.length);

2次元配列

//配列list1,list2,list3が存在するとき
int[][] lists = {list1, list2, list3};
//直接記述するとき
int[][] lists = {{0,1,2,3}, {4,5,6,7}, {8,9,0}};
//newで配列を作る
int[][] lists = new int[3][4];//整数配列の要素の初期値は0

//for文で出力
for(int i = 0; i < lists.length; i++){
	for(int j = 0; j < lists[i].length; j++){
		System.out.println(lists[i][j]);
	}
}
//拡張for文で出力
for(int[] list : lists){
	for(int i : list){
		System.out.println(i);
	}
}

ArrayList

ArrayListの使い方

はじめから要素数を決められない場合や、後から追加したい場合に使う。

import java.util.*

//以下main文
	ArrayList<String> team = new ArrayList<>();	//変数の宣言
	team.add("要素0");			//要素を追加
	team.add("要素1");
	team.add("要素2");
	for (String member : team){		//拡張for文はそのまま使える
		System.out.println(member);
	}
	System.out.println(team.get(1));	//要素をインデックス指定
	System.out.println(team.size());	//配列の長さ
	team.set(1,"要素1だったもの");		//要素インデックス1を更新
	team.remove(1);				//要素インデックス1を削除。
	//※削除するとインデックス2だった"要素2"がインデックス1にくる。

<>で囲んだ部分はジェネリクス。右辺の<>内は書く必要がない。

PHP 勉強1

基本文法

<?php
	//ここにプログラムを書く
?>

変数

$a = 100;
$name = "名前";

$list1 = ["a", "b", "c", "d", "e"];
$list2 = array("a", "b", "c", "d", "e");

$array = [
	"key1" => "value1",
	"key2" => "value2",
	"key3" => "value3",
];
unset($array["key1"]);
print_r($array);

出力

echo "hello";

連結

//.で区切って文字列を連結
echo "こんにちは、".$name."さん";
//{}で囲んで変数を表示
$s = "ハロー、{$name}さん";
print_r($s);

参考
PHP入門編のレッスン一覧 | プログラミング学習サービス【paizaラーニング】

www.amazon.co.jp

Java メソッドとクラス

Java SE 8

メソッド

クラス内でのメソッドの定義

public static 戻り値型 メソッド名(仮引数,...){
	return 戻り値;
}

mainメソッドからの呼び出し

メソッド名(実引数,...);

オーバーロード

既に存在するメソッドと同名で、仮引数の型や個数が異なるメソッドを定義すると、オーバーロード(多重定義)を行うことができる。
オーバーロードした場合、実引数の指定によって呼び出すメソッドを変えることができる。

クラス

クラスは設計図で、通常はその実態であるインスタンスをnewすることで、そのインスタンスが持つフィールドやメソッドを用いる。

フィールド

クラスには、それぞれのインスタンスがもつことのできるフィールドと呼ばれる変数を複数定義できる。
フィールドはクラス宣言の下に書く。

public class Rectangle{
	//フィールド
	private int tate;
	private int yoko;
}

クラスメソッド

クラスには、それぞれのインスタンスがもつことのできるクラスメソッドと呼ばれるメソッドを複数定義できる。
クラスメソッドではフィールドの値を使って計算したり、フィールドの値を出力したりすることができる。
クラスメソッドにはstaticがつかない。

public class Rectangle{
	private int tate;
	private int yoko;

	//クラスメソッド
	public int getArea(){
		return tate * yoko;
	}
	public void show(){
		System.out.println("tate:"+tate+", yoko:"+yoko+", area:"+getArea());
	}
}

コンストラク

インスタンスを作成するとき、初期化処理を行う特別なメソッドであるコンストラクタが呼び出される。
ひとつもコンストラクタが書かれていない場合、コンパイラがデフォルトコンストラクタを作成する。
コンストラクタ名はクラス名と同じものを使う。
Eclipseでは、ソース、フィールドを使用してコンストラクターを生成、などで自動生成処理が行える。
コンストラクタの仮引数の型や個数を変えて複数定義しておくことで、仮引数の型や個数に応じて異なるコンストラクタを呼び出すクラスになる。

public class Rectangle{
	private int tate;
	private int yoko;

	//コンストラクタ
	public Rectangle(){
		this.tate = 5;
		this.yoko = 15;
	}
	public Rectangle(int tate, int yoko){
		this.tate = tate;
		this.yoko = yoko;
	}

	public int getArea(){
		return tate * yoko;
	}
	public void show(){
		System.out.println("tate:"+tate+", yoko:"+yoko+", area:"+getArea());
	}
}

new

メインメソッドでnewすることでインスタンスを作成し、フィールドやクラスメソッドを利用できるようになる。

public static void main(String[] args){
	Rectangle r = new Rectangle(10, 20);
	r.show();
}

newされるとコンストラクタに仮引数の10と20が渡され、ローカル変数rが参照するインスタンス自身のフィールドのtateに10、yokoに20をそれぞれ代入する。

r.tate = 100;

のように記述するとpublicなフィールドにアクセスできてしまう。それを避けるためにフィールドはprivateで定義する。

r.show();

でRectangleクラスのshowメソッドを呼び出すことができる。
show()では自身のフィールドと、getAreaメソッドを使って計算した面積の値を出力する。
getArea内で計算しているのはthis.tateとthis.yokoだが、ここはあえてthisを書かなくても動く。
コンストラクタ内では、フィールドのtateと仮引数のtateを区別するためにthisを書いている。

HAS-A関係

フィールドに別のクラスのインスタンスをもつクラスを作成することができる。
基本的に、クラスがもつフィールドは、そのクラス内で処理する。

継承

クラス作成時に「extends クラス名」を書き加えると、該当クラスのスーパークラス(親)を継承したサブクラス(子)を作ることができる。

public class NamedRectangle extends Rectangle{
	//追加するフィールド
	String name;
	
	//コンストラクタ
	public NamedRectangle(String name){
		super();
		this.name = name;
	}
	public NamedRectangle(String name, int tate, int yoko){
		super(tate, yoko);
		this.name = name;

	public static void main(String[] args){
		NamedRectangle nr = new NamedRectangle("one", 10, 20);
		nr.show();
	}
}

コンストラクタでは、親のコンストラクタを呼び出せるsuper();を使用している。
子にはshowメソッドはないが、親のshowメソッドを利用することができる。

オーバーライド

親のもつメソッドと同名で異なる動作のメソッドを子に作ることができる。

public class NamedRectangle extends Rectangle{
	int tate;
	int yoko;
	String name;

	public NamedRectangle(String name) {
		super();
		this.name = name;
	}
	public NamedRectangle(String name, int tate, int yoko){
		super(tate, yoko);
		this.name = name;
	}

	//ここでshowメソッドをオーバーライド
	@Override
	public void show() {
		System.out.println("name:"+name+", tate:"+tate+", yoko:"+yoko+", area:"+getArea());
	}

	public static void main(String[] args) {
		NamedRectangle nr = new NamedRectangle("one", 10, 20);
		//ここで呼び出されるのは、オーバーライドされたshowメソッド
		nr.show();
	}
}

抽象クラス

クラス定義時にabstractをつけると、実際の処理を書かない抽象メソッドをもつ抽象クラスを書くことができる。
抽象クラスは継承した子クラスでコンストラクタを定義し、メソッドをオーバーライドすることでnewできるクラスになる。
抽象クラス自体をnewすることはできない。

abstract class クラス名{
	abstract 戻り値型 メソッド名(仮引数,...);
}

インタフェース

インタフェースは-ableという名前をつけることが多い。
インタフェースの宣言時はclassではなくinterfaceと書く。
中には抽象メソッドを書き、実際の処理は書かない。このときabstractは省略される。

public interface Lockable{
	boolean lock();
	boolean unlock();
}

インタフェースはクラス宣言時にimplementsで実装し、インタフェースがもつ抽象メソッドをすべてオーバーライドする。

public class Safe implements Lockable{
	@Override
	public boolean lock(){
		return true;
	}
	@Override
	public boolean unlock(){
		return false;
	}

	public static void main(String[] args){
		Safe sf = new Safe();
		System.out.println(sf.lock());
		System.out.println(sf.unlock());
	}

上記はlock()はtrueを返し、unlock()はfalseを返すだけのプログラム。
Comparableインタフェースを実装すると指定の比較方法で比較処理を行えるクラスが作れるようになる。
参考
なぜ抽象クラス(Abstract)を実装するのか - Qiita

Java 基本文法

Java SE 8

ひな形

public class Test {
	public static void main(String[] args) {
		処理;
	}
}

class名は大文字から開始する。ソースファイルと同じものになる。
処理の部分にメインメソッドで実行するものを書いていく。
命令の末尾にはセミコロン「;」をつける。
eclipseでは「main」とキー入力し、ctrl+spaceでmainメソッドを短縮入力可能。

標準出力

//改行あり出力
System.out.println("hello");
//改行なし出力
System.out.print("world");
//変数の出力
String s = "文字列";
System.out.println(s);

eclipseでは「sys」とキー入力し、ctrl+spaceでprintlnメソッドを短縮入力可能。

コメント

//1行コメント

/*
複数行コメント
*/

変数

Javaで使用できる変数には、プリミティブ型と参照型が存在する。

プリミティブ型

データ型
boolean true, false
char 16ビットUnicode文字 ¥u0000~¥uFFFF
byte 8ビット整数 -128~127
short 16ビット整数 -32,768~32,767
int 32ビット整数 -2,147,483,648~2,147,483,647
long 64ビット整数 -9,223,372,036,854,775,808~9,223,372,036,854,775,807
float 32ビット単精度浮動小数点数
double 64ビット倍精度浮動小数点数

参照型

データ型
String 文字列

変数宣言

//データ型 変数名 = 値;
int a = 100;
String s = "文字列";

final

finalをつけて宣言した変数は一度だけ代入が可能となる。変更ができないので定数のように利用できる。

//final データ型 変数名 = 値;
final float PI = 3.1415F;

キャスト(型変換)

int i = 1;
double d = 1.2;
String s = "123";

//実数を整数型に変換
(int)d;
//整数を実数型に変換
(double)i;
//文字列を整数型に変換
Integer.parseInt(s);
//文字列を実数型に変換
Double.parseDouble(s);

ランダム値

Mathを利用する

//x個のyから始まるランダムな値
double rand = Math.random() * x + y;
int number = (int)rand;    //int型にキャスト

//1行で書くなら
int number = (int)(Math.random() * x + y);

Randomを利用する

//x個の0から始まるランダムな値
Random rand = new Random();
int number = rand.nextInt(x);

import java.util.Random;が必要。

演算子

算術演算子

演算子 意味
+ 加算
- 減算
* 乗算
/ 除算(整数同士の除算は商のみとなり、小数にはならない)
% 剰余

比較演算子

演算子 意味
== 等しい
!= 等しくない
< より小さい
> より大きい
<= 以下
>= 以上

論理演算子

演算子 意味
&& and
|| or
! 否定

制御構文

if(条件分岐)

if (条件式1){
	//処理①;
} else if (条件式2){
	//処理②;
} else {
	//当てはまらない場合の処理③;
}

switch(条件分岐)

switch (式){
	case 定数1:
		//処理①;
		break;
	case 定数2:
		//処理②;
		berak;
	default:
		//当てはまらない場合の処理③;
}

while(繰り返し)

int i = 0;
while (i <= 5){
	//処理;
	i++;
}

do while(繰り返し)

1度は必ず実行し、条件式を満たしていれば繰り返し。

int i = 0;
do{
	//処理;
	i++;
}while(i <= 5);

for(繰り返し)

for(int i = 0; i <= 5; i++){
	//処理;
}

拡張for(繰り返し)

int配列iに格納された0番目の配列から順に、すべての要素のぶんだけ繰り返す。

int[] i = {0, 1, 2, 3, 4};
for (int x : i){
	//処理;
}

参考
Java入門 ~Javaの開発環境を用意する手順やJavaを使ったプログラミングの方法について解説します~ | JavaDrive
演算子 | Javaコード入門
乱数を生成!JavaでRandomクラスを使う方法【初心者向け】 | TechAcademyマガジン

Java 導入

インストール

Javaの開発にはJDKIDEが必要となる。
今回は以下を使用する。
OS : windows 64bit
JDK : SE 8
IDE : Eclipse

JDK SE 8

JDK(Java Development Kit)のダウンロード

Java SE - Downloads | Oracle Technology Network | Oracle
上記サイトのJDK Downloadで、利用しているOSのJDKを入手する。今回はJava SE 8を選択。

パスを通す

インストールが終了したら、コマンドプロンプトからコンパイルできるようにするため、環境変数Pathに下記を入力する。

Program Files\Java\jdk1.8.0_261\bin

この「jdk1.8.0_◯◯◯」部分に入る数値は、実際にインストールされてるフォルダを見て確認する。
また、JAVA_HOME変数が無いクリーンな環境ではシステム環境変数欄で新規をクリックし以下項目を入力。

JAVA_HOME
C:\Program Files\Java\jdk1.8.0_261

参考
【初心者でもすぐわかる】JDKのインストール方法 Windows編

コマンドプロンプトからコンパイルと実行

コンパイルしてclassファイルを生成する。

javac ソースファイル名.java

classファイルを実行する。

java クラスファイル名

Javaのソースファイル名とクラスファイル名は同一のものとなる。

Eclipse

Eclipseのダウンロード

IDE(統合開発環境)としてEclipseを使用する。
Eclipse 日本語化 | MergeDoc Project
上記サイトから、利用しているOSのFull EditionのJavaをダウンロードする。
ダウンロードしたzipファイルはCドライブ直下で解凍する。

Eclipseの設定

初回起動時にJavaプロジェクトの保存先となるworkspaceディレクトリを設定。
Eclipseが起動したら、Preferences、General、WorkspaceでText file encodingをUTF-8に設定。