[ジャワイン川]2週目学習ログ-2


2-01. オブジェクト向けプログラミングとオブジェクト向けプログラミング


オブジェクト
オブジェクトの定義->実装機能->各オブジェクト間のコラボレーションの実装

2-02. 生活の中でオブジェクトを探してクラスとして実装する

  • オブジェクト作成例
  • public class Student { 
    	int studentNumber; 
        String studentName;
        ...
  • 定義対象
  • 各オブジェクトの属性をメンバー変数として表す
  • 各客体間の連携を実現
  • 類用大文字
  • public classファイルに1つしかありません!クラス自体は複数実現可能
  • 2-03. 関数とメソッド

  • 例示関数
  • int add(int num1, int num2) {
    		
    	int result;
    	result = num1 + num2;
    	return result;
    }
    メソッド(method)
  • オブジェクトの機能を実現するためにクラスで実現される関数
  • 2-04. オブジェクトのプロパティはメンバー変数であり、オブジェクトの機能はメソッドによって実現されます。


    2-05. インスタンスとスタックメモリの作成(heap memory)


    ≪インスタンス|Instance|emdw≫
  • newキーワードを使用してメモリにクラスを作成した状態
  • 生成したインスタンスをheapメモリに割り当てる
  • 2-06. コンストラクション関数(constructor)について説明しましょう

  • オブジェクト作成時にnewキーとともに-new Studio()を使用する.
  • ジェネレータは戻り値がなく、クラス名と同じ
  • ...
    Student studentLee = new Student(12345, "Lee", 3);
    ...
    public class Student {
    
    	public int studentNumber;
    	public String studentName;
    	public int grade;
    	
    	public Student(int studentNumber, String studentName, int grade) {
    		this.studentNumber = studentNumber;
    		this.studentName = studentName;
    		this.grade = grade;
    	}
    

    2-07. 複数の作成者を定義する作成者をロード(再ロード)

  • ジェネレータは複数実装可能
  • public class UserInfo {
    
    	public String userId;
    	public String userPassWord;
    	public String userName;
    	public String userAddress;
    	public String phoneNumber;
    	
    	public UserInfo(){}
    	
    	public UserInfo(String userId, String userPassWord, String userName) {
    		this.userId = userId;
    		this.userPassWord = userPassWord;
    		this.userName = userName;
    	}
    

    2-08. 復習してみましょう




    2-09. 参照データ型変数


    2-10. アクセス制御インジケータ(accessmodifier)と情報非表示


    アクセス制御インジケータ
  • private:同一クラス内のみアクセス可能
  • default:同じパッケージ内でしかアクセスできない(継承関係であってもパッケージが異なる場合はアクセスできない)
  • protected:同一パッケージ、継承関係クラスからアクセス可能
  • public:教室以外のどこからでもアクセス可能
  • get()/set()メソッド
    privateとして宣言されたメンバー変数(フィールド)への共通アクセスと変更方法
    情報を隠す
    オブジェクトエラーを回避し、オブジェクトの使用率を向上させるために、外部からアクセスできる情報を最小限に抑える
    package ch10;
    
    public class BirthDay {
    	
    	private int day;
    	private int month;
    	private int year;
    	
    	private boolean isValid;
    	
    	public int getDay() {
    		return day;
    	}
    	
    	public void setDay(int day) {
    		switch(month){
    			case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    				if(day < 1 || day > 31) {
    					isValid = false;
    				} else {
    					isValid = true;
    					this.day = day;
    				}
    				break;
    			case 2: 
    				if(day < 1 || day > 28) {
    					isValid = false;
    				} else {
    					isValid = true;
    					this.day = day;
    				}
    				break;
    			case 4: case 6: case 9: case 11:
    				if(day < 1 || day > 30) {
    					isValid = false;
    				} else {
    					isValid = true;
    					this.day = day;
    				}
    				break;
    		};
    	}
    	
    	public int getMonth() {
    		return month;
    	}
    	
    	public void setMonth(int month) {
    		if( month < 1 || month > 12)
    		{
    			isValid = false;
    		} else {
    			isValid = true;
    			this.month = month;
    		}
    		
    	}
    	
    	public int getYear() {
    		return year;
    	}
    	
    	public void setYear(int year) {
    		this.year = year;
    	}
    	
    	public void showDate() {
    		if(isValid) {
    			System.out.println(year + "년 " + month + "월 " + day + "일 입니다.");
    		} else {
    			System.out.println("유효하지 않은 날짜입니다.");
    		}
    	}
    	
    }
    

    2-11. パッヶージ


    必要な情報と機能のみを提供
    各メソッドまたはメンバー変数へのアクセスによるエラーを最小限に抑える

    2-12. オブジェクト自体を指すthis


    this
    インスタンス自体へのメモリ

    2-13. オブジェクト間のコラボレーション(ソート)


    オブジェクト間のコラボレーション

    2-14. 対象向けのプログラム設計を用いて,学生がバスで通学する過程を実施することを試みる.

    public class Student {
    	
    	String studentName;
    	int money;
    	
    	public Student(String studentName, int money) {
    		this.studentName = studentName;
    		this.money = money;
    	}
    	
    	public void takeBus(Bus bus) {
    		bus.take(1000);
    		this.money -= 1000;
    	}
    	
    	public void takeSubway(Subway subway) {
    		subway.take(1200);
    		this.money -= 1200;
    	}
    	
    	public void showInfo() {
    		System.out.println(studentName + "님의 남은 돈은 " + money + "원 입니다");
    	}
    }
    
    public class Bus {
    	
    	int busNumber;
    	int passengerCount;
    	int money;
    	
    	public Bus(int busNumber) {
    		this.busNumber = busNumber;
    	}
    	
    	public void take(int money) {
    		this.money += money;
    		passengerCount++;
    	}
    	
    	public void showBusInfo() {
    		System.out.println(busNumber + "번 버스의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
    	}
    }
    
    public class Subway {
    	
    	int lineNumber;
    	int passengerCount;
    	int money;
    	
    	public Subway(int lineNumber) {
    		this.lineNumber = lineNumber;
    	}
    	
    	public void take(int money) {
    		this.money += money;
    		passengerCount++;
    	}
    	
    	public void showSubwayInfo() {
    		System.out.println(lineNumber + "번 지하철의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
    	}
    }
    
    public class TakeTransTest {
    
    	public static void main(String[] args) {
    		Student studentJ = new Student("James", 5000);
    		Student studentT = new Student("Tomas", 10000);
    		
    		Bus bus100 = new Bus(100);
    		Subway subwayGreen = new Subway(2);
    		
    		studentJ.takeBus(bus100);
    		studentT.takeSubway(subwayGreen);
    		
    		studentJ.showInfo();
    		studentT.showInfo();
    		
    		bus100.showBusInfo();
    		subwayGreen.showSubwayInfo();
    	}
    
    }
    

    2-15. 復習してみましょう

    
    
    public class Taxi {
    	
    	String taxiName;
    	int money;
    	
    	public Taxi(String taxiName) {
    		this.taxiName = taxiName;
    	}
    	
    	public void take(int money) {
    		this.money += money;
    	}
    	
    	public void showTaxiInfo() {
    		System.out.println(taxiName + " 수입은 " + money + "원 입니다.");
    		
    	}
    	
    }
    
    public class Student {
    ...
    public void takeTaxi(Taxi taxi) {
    		taxi.take(10000);
    		this.money -= 10000;
    	}
    }
    
    public class TakeTransTest {
    ...
    Student studentE = new Student("Edward", 20000);
    		Taxi newTaxi = new Taxi("잘 간다 운수택시");
    		
    		studentE.takeTaxi(newTaxi);
    		
    		studentE.showInfo();
    		newTaxi.showTaxiInfo();
            }

    2-16. 複数のインスタンスに共通する変数を宣言-静的変数


    複数のインスタンスが共有する条件値が必要です.
    ex)学号、四号など
    static int serialNum~

    2-17. 静的メソッドの実装、使用、変数の有効範囲

  • 静的方法ではインスタンス変数の使用は許可されていない
  • メンバー変数が多すぎると、インスタンスの作成時に余分なメモリが割り当てられる
  • 2-18. 静的適用-モノトーンモード


    1つのインスタンスのみを作成するための設計モード.

    2-19. (静態とSingletonモード)を復習してみましょう

    public class Car {
    	
    	public static int serialNumber = 10000;
    	private int carNum;
    	
    
    	public int getCarNum() {
    		return carNum;
    	}
    
    	public void setCarNum(int carNum) {
    		this.carNum = carNum;
    	}
    
    	public Car() {
    		serialNumber++;
    		carNum = serialNumber;
    	}
    	
    }
    public class CarFactory {
    	
    	public static CarFactory instance = new CarFactory();
    
    	public CarFactory() {
    		
    	}
    	
    	public static CarFactory getInstance() {
    		if( instance == null) {
    			instance = new CarFactory();
    		}
    		return instance;
    	}
    	
    	public Car createCar() {
    		Car car = new Car();
    		return car;
    	}
    	
    }

    2-20. データを順番に一度に管理する-配列(Array)




    2-21. オブジェクト配列の使用


    オブジェクト配列の場合、要素として使用されるオブジェクトアドレス(4バイト、8バイト)のメモリのみが割り当てられます.
    オブジェクト配列のコピー
  • System.arrayCopy(src, srcPos, dest, destPos, length)
  • **浅いコピー
  • オブジェクトアドレスのみコピー->要素を1つ変更すると一緒に変更される
  • ...
    System.arraycopy(library, 0, copyLibrary, 0, 5);
    ...

    **複製
    ...
    copyLibaray[0] = new Book();
    		copyLibaray[1] = new Book();
    		copyLibaray[2] = new Book();
    		copyLibaray[3] = new Book();
    		copyLibaray[4] = new Book();
    		
    		for(int i = 0; i< library.length; i++) {
    			copyLibaray[i].setTitle(library[i].getTitle());
    			copyLibaray[i].setAuthor(library[i].getAuthor());
    		}
    		
    		
    		library[0].setTitle("나목");
    		library[0].setAuthor("박완서");
    ...

    2-22. 2 D配列複写の使用


    int[][] arr = new int[2][3];
    データ型配列名=newデータ型[行数][列数]

    2-23. 実装対象配列のクラスArrayList