Java (4)


Java (4) : constructor, access modifier, encapsulation, collaboration, static


1.コンストラクタ

생성자 (constructor)heapでインスタンスメモリを作成する생성자•ジェネレータのデフォルト構文([<パラメータリスト]){[<文]}
•オブジェクトを作成するときにnewキーワードとともに-new Studio()を使用します.
•コンストラクション関数は、通常の関数のように機能を呼び出すのではなく、newとともにオブジェクトを作成するために呼び出されます.
•オブジェクトの作成時に初期化変数または定数を呼び出したり、他の初期化機能を実行する方法
•ジェネレータは値を返さず、クラス名と同じ
•ほとんどの作成者は外部からアクセスできますが、必要に応じてプライベートとして宣言することもできます.기본 생성자 (default constructor)•クラスには少なくとも1つのコンストラクタが必要
•クラスでコンストラクション関数を実装することなく、新しいキーワードを使用してコンストラクション関数を呼び出すことができます.
•クラスにコンストラクション関数が1つもない場合、コンパイラはコンストラクション関数コード=public Studio(){}を挿入します.
•パラメータなし、実装部品なし
作成者を使用して初期化するときに(){}値を加算
ex)
package ch06;
ㅤ
public class Student {
ㅤ
  public int studentNumber;
  public String studentName;
  public int grade;
ㅤ
  public Student() {} // 생성자 overloading 
  ㅤ
  public Student(int studentNumber, String studentName, int grade) {
    	this.studentNumber = studentNumer; // this 붙여주기!, this는 public가져왔고 오른쪽은 매개변수 & 이름 같게하는게 좋음
	this.studentName = studentName;
	this.grade = grade;
     }
ㅤ
public String showStudentInfo();
ㅤ
   return studentName + “학생의 학번과 학년은” + studentNumber + grade + “입니다.”
}
-> 얘는 메인 아님
マスターを使用したクラスの作成
public class StudentTest {
ㅤ
  public static void main(String[] args) {
ㅤ
    Student studentLee = new Student();
    studentLee.studentID = 54321;
    studentLee.setStudentName(“Kim”);
    studentLee.address = “경기도 성남시”;
    system.out.println(studentLee.showStudentInfo());
  // 멤버변수는 초기화, string은 null값, int는 0
OR
Student studentKim = new Student(12345, “kim”, 3);
System.out.println(studentKim.showStudentInfo()); 
}
*멤버변수만 가능! 지역변수는 호출될 때 초기화가 안 됨
클라이언트 코드:サービスを使用したページモジュール&オブジェクトのインポートページ서비스 코드:サービスを提供するオブジェクトモジュール
defaultジェネレータを無効にすることもできます생성자 오버로딩 (overloading)参照データ型変数
変数のデータ型
1)基本資料タイプ:int、long、float、double
2)参考資料タイプ:String、Date、Student//作成後使用
*String例外
リファレンスシェイプの定義と使用

ex)
package ch09;
ㅤ
public class Student {
  int studentID;
  String studentName;
ㅤ
  Subject Korea;
  Subject math;
ㅤ
  Student (int studentId, String StudentName) {
    this. studentId = studentId;
    this. studentName = studentName;
ㅤ
    korea = new Subject();
    math = new Subject();
    }
ㅤ
  public void setKoreaSubjecct(String name, int score) {
 ㅤ
    korea.subjectName = name;
    korea.score = score;
ㅤ}
ㅤ
  public void setMathSubject(String name, int score) {
ㅤ
    math.subjectName = name;
    mat.score = score;
}
ㅤ
  public void showScoreInfo() {
    int total = korea.score + math.score;
    System.out.println(studentName + “학생의 총점은” + total + “점입니다.”)
  }
}
package ch09:
ㅤ
public class SubjectTest {
ㅤ
public static void main(String[] args) {
  student studentLee = new Student(100, “Lee”)
  studentLee.setKoreaSubject(“국어”, 100);
  studentLee.setMathsubject(“수학”, 99);
  studentLee.showScoreInfo();
}
ㅤㅤ
ㅤㅤ
ㅤㅤ
ㅤㅤ
ㅤㅤ

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

접근 제어 지시자 (accesss modifier)クラスのメンバー変数、メソッド、およびジェネレータがクラスの外部で使用可能かどうかを指定するキーワード
  • .
    private:同じクラスにのみアクセスできます(外部クラス、継承-親-関係のクラスにもアクセスできません).
    default(何でもX):同じパッケージ内でのみアクセス可能(継承関係でもパッケージが異なる場合はアクセスできません)、インポート後に使用
    保護:同じパッケージまたは継承関係のクラスからアクセスできますが、外部からアクセスできません.
    public:クラスの外部の任意の場所からアクセス可能get()/ set() 메서드
  • privateと宣言されたメンバー変数(フィールド)への共通アクセスおよび変更方法
  • get()メソッドのみが提供される場合、読み取り専用フィールド
  • クリップによって
  • が自動的に生成する.
    SETとGETの違い
    set = 설정, get = 값을 가져오는 것
    ㅤ
    User-id 라는 변수를 선언을 한다고 가정했을 때, User-id의 변수에 어떠한 값(ID)에 저장(set)을 한다.
    ㅤ
    User-id 에 저장된 값을 불러오는 것이 get이다.
    ㅤ
    쉽게 설명하면,
    ㅤ
    돼지저금통을 만든다  > 변수 선언
     ㅤ
    그 안에 돈을 저축한다 > set
    ㅤ
    그 안에 돈이 얼마나 들어 있는지 본다 > get
    なぜSETとGETを使うのですか?
    결국에는, SET, GET 메소드를 사용하는 이유는 외부로부터 변수값에 직접적으로 접근하는것을 막기 위해서다. 직접 접근하개 되면 값이 변하게 되고 그러면 데이터 무결성이 깨질 수 있기 때문이다.
    ㅤ
    대표적으로 자바에서는 함수를 통해 값을 전달받고, 전달하고 방식을 권장하고 있다. 
    ㅤ
    또한 클래스 내에서 변수 private(캡슐화, 정보은닉)를 선언해서 외부에서 접근할 수 없도록 한다.
    출처 : https://akdl911215.tistory.com/261
    정보 은닉(infomation hiding)
  • private制御のメンバー変数は、公開変数と比較して共通の方法でアクセスできます.
    privateの場合、publicメソッドで各変数の制限を制御できます.
  • public void setMonth(int month) {
    		ㅤ
    		if ( month < 1 || month > 12) {
    			isValid = false;
    		}
    		else {
    			this.month = month;
    		}
    	}
    •オブジェクト向けのプログラムでは、非表示情報は必要な外部で最小限のアクセス可能な情報を開くことができ、オブジェクトエラーを防止し、クライアント・オブジェクトがオブジェクトをより効率的に利用できるようにします.
    ex)
    package ch10;
    ㅤ
    public class Birthday {
    ㅤ
      private int day;     //초기값 0
      private int month;
      private int year;
    ㅤ
      private boolean isValid;  // 초기값 false
    ㅤ
      public int getDay() {
        return day;
      }
    ㅤ
      public void setDay(int day) {
    ㅤ
        if (day <1 || day >30) {
         isValid = false;
         }
        else {
         isValid = true;
         this.day = day
        }
    ㅤ
      public int getMonth() {
        return month;
       }
    ㅤ
      public void setMonth(int day) {
     ㅤ
      if (month <1 || month >12)
       {
        isValid = false;
       }
      else {
        isValid = true;
        this.day = day
       }
      }
      public int getYear() {
        return Year;
      }
    ㅤ
      public void setYear(int day) {
       this.year = year
      }
      ㅤ   //get set : 마우스 오른쪽 + source + generate getters and setters
      ㅤ
      public void showDate() {
        if (isVlaid) {
          System.out.println( year + “년” + month + “월” + day + “일 입니다.”);
    	}
        else {
          System.out.println(“유효하지 않은 날짜입나디.”);
        }
    } 
    package ch10;
    ㅤ
    public class BirthdayTest {
    ㅤ
    public static void main (Stirng[] args) {
      Birthday date = new BirthDay();
      date.setYear(2019);
      date.setMonth(13);
      date.setDay(30);
      }
    }
    privateの場合、メソッド側(get set関数側)に制限を設定してエラーを防止できます.
    ->この値に外部からアクセスできません.
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ

    3.パッケージ

    캡슐화 (encapsulation)情報隠蔽によるカプセル化
  • 必要な情報と機能のみ提供
  • ほとんどのメンバー変数とメソッドを非表示にし、統合された外部インタフェースのみを提供し、一貫した機能を実現する
  • 各メソッドまたはメンバー変数にアクセスすることによって発生するエラーを最小限に抑えます.->一貫した公開メソッド(関数)へのアクセスのみを許可
    レポートの作成例
    public class MakeReport {
    ㅤ
    	StringBuffer buffer = new StringBuffer();
    	ㅤ
    	private String line = "===========================================\n";
    	private String title = "  이름\t   주소 \t\t  전화번호  \n";
        ㅤ
    	private void makeHeader()
    	{
    		buffer.append(line);
    		buffer.append(title);
    		buffer.append(line);
    	}
    	ㅤ
    	private void generateBody()
    	{
    		buffer.append("James \t");
    		buffer.append("Seoul Korea \t");
    		buffer.append("010-2222-3333\n");
    		ㅤ
    		buffer.append("Tomas \t");
    		buffer.append("NewYork US \t");
    		buffer.append("010-7777-0987\n");
    	}
    	ㅤㅤ
    	private void makeFooter()
    	{
    		buffer.append(line);
    	}
    	ㅤ
    	public String getReport()
    	{
    		makeHeader();
    		generateBody();
    		makeFooter();
    		return buffer.toString();
    	}
    }
    public class TestReprt {
    ㅤ
    	public static void main(String[] args) {
    ㅤ
    		MakeReport report = new MakeReport();
    		String builder = report.getReport();
    ㅤ
    		System.out.println(builder);
    	}
    ㅤ
    }
    StringBuffer
  • string class string string string class string,書ける
  • 内部拡張可能なバッファクラス
  • フィールドで最も使用される(String Builder付き)
  • this가 하는 일
  • インスタンスは、自分のメモリ(インスタンス内のメモリ、アドレス値)
  • を指す.
  • ジェネレータに複数のコンストラクション関数がある場合、別のコンストラクション関数を呼び出すときに
  • を使用する.
  • は、自分のアドレス(参照値)
  • を返す.
    생성자에서 다른 생성자를 호출 하는 this
    public class Person {
    ㅤㅤ
      String name;
      int age; 
    ㅤㅤ
      public Person () {
        this (“이름없음”, 1);  
        // 아직 인스턴스 생성된 것이 아니기 때문에 
           이전에 다른 코드 쓸 수 없음
      }
    ㅤㅤ
      public Person(String name, int age) {
        this.name = name; 
        this.age = age;  
      }ㅤ
    }
    자신의 주소를 반환하는 this
    public class Person {
    ㅤ
    	String name;
    	int age;
    	ㅤ
    	public Person() {
    		this("이름없음", 1);
    	}
    	ㅤ
    	public Person(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	ㅤ
    	public Person getPerson() {
    		return this;
    	}
    	ㅤ
    	public static void main(String[] args)
    	{
    		Person p = new Person();
    		p.name = "James";
    		p.age = 37;
    		ㅤ
    		Person p2 = p.getPerson();
    		System.out.println(p);
    		System.out.println(p2);
    	}
    }
    [this]
    - 클래스에 생성자가 여러 개인 경우, 
      this를 이용하여 생성자에서 다른 생성자를 호출할 수 있음
    - 생성자에서 다른 생성자를 호출하는 경우, 
      인스턴스의 생성이 완전하지 않은 상태이므로 
      this() statement 이전에 다른 statement를 쓸 수 없음
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ

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

  • オブジェクト向け計画オブジェクト間連携
  • は、コラボレーション
  • を行うために必要なメッセージ送信および処理機能を実現する必要がある.
  • パラメータがオブジェクトを渡すときに発生する
  • .

    Student
    package ch14;
    ㅤ
    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(1)0;
        this.moeney -= 1000;
      }
    ㅤ
      public void takesubway (Subway subway) {
        subway.take(1200);
        this.money -= 1200;
      }
    ㅤ
      public void showBusInfo() {
        System.out.println(busNumber + "번 버스의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
    	}
    Bus
    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(lineNumber + "번 버스의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
      }
    }
    Subway
    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 + "원 입니다");
    	}
    }
    Take
    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();
    	}
    ㅤ
    }
    共通の変数が必要です.
    •複数のインスタンスが共有するデータム値が必要
    •学生ごとに新しい学習番号を作成
    •クレジットカード会社は新しいカードを発行するたびに、新しいカード番号を提供する
    •社員が入社したとき、
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ
    ㅤㅤ

    5.静的変数

    static 변수同じクラスで作成された複数のインスタンスを共有static 변수 선언과 사용하기static int serialNum;
    •インスタンスの作成時に作成した変数ではなく、最初のプログラムがメモリにロードされたときにメモリを割り当てます.
    •静的変数(vs.インスタンス変数)とも呼ばれるクラス変数
    •インスタンスの作成に制限されないため、クラス名を直接参照
    プロセス
    프로그램을 구동시키면 프로그램이 메모리에 올라가는데,
    메모리에 올라간 상태 = 프로세스 (thread상태로 돌아감)
    メモリアップ時の2つの領域
    데이터 영역
    처음부터 메모리 잡음 (상수, 리터럴, static)
    -> 프로세스 로딩되는 순간 데이터 영역에 잡히고,  프로그램이 다 끝나서 메모리에서 unload되는 순간 없어짐 
    ㅤ
    코드 영역
    명령어집합
    ㅤ
    인스턴스가 생성될때마다 메모리 할당 – heap (동적) 
    GC (garbage collector) 에 의해 제거
    ex)
    public class Employee {
    ㅤㅤ
    	public static int serialNum = 1000;
    	ㅤㅤ
    	private int employeeId;
    	private String employeeName;
    	private String department;
    	ㅤ
    	public Employee() // default 생성자
    	{
    		serialNum++;
    		employeeId = serialNum;
    	}
    ㅤ
    	public int getEmployeeId() {
    		return employeeId;
    	}
    	public void setEmployeeId(int employeeId) {
    		this.employeeId = employeeId;
    	}
    	public String getEmployeeName() {
    		return employeeName;
    	}
    	public void setEmployeeName(String employeeName) {
    		this.employeeName = employeeName;
    	}
    	public String getDepartment() {
    		return department;
    	}
    	public void setDepartment(String department) {
    		this.department = department;
    	}
    	ㅤ
    }
    public class EmployeeTest {
    ㅤ
    	public static void main(String[] args) {
    		Employee employeeLee = new Employee();
    		employeeLee.setEmployeeName("이순신");
    		System.out.println(employeeLee.serialNum);
    		ㅤ
    		Employee employeeKim = new Employee();
    		employeeKim.setEmployeeName("김유신");
    		employeeKim.serialNum++;
    		ㅤ
    		System.out.println(employeeLee.serialNum);
    		System.out.println(employeeKim.serialNum);
    		ㅤ
    	}
    }
    注)インスタンスとは独立しているため、クラス名で参照できます.
    -> System.out.println(employee.serialNum);static 메서드
    private static int serialNum = 1000;
    ㅤ
    public static int getSerialNum() {
    	return serialNum;
    }
    ㅤ
    public static void setSerialNum(int serialNum) {
    	Employee.serialNum = serialNum;
    }
    ㅤ
    System.out.println(Employee.getSerialNum());
    静的メソッド(クラスメソッド)では、インスタンス変数は使用できません.
  • 静的メソッドは、インスタンスを作成することなくクラス名を呼び出すことができます.
  • インスタンスを作成する前に呼び出すことができるので、静的メソッドでは
  • インスタンス変数は使用できません.
    Employee.java
    public static void setSerialNum(int serialNum) {
      int i = 0;
    ㅤ	
      employeeName = "Lee";  //오류발생 (만약 다른 곳에서 호출할 때 인스턴스가 생성되어있지 않을 수도 있을 수 있는데,
    static 메서드는 인스턴스 유무와 상관없이 호출될 수 있어야하기 때문
    ㅤ
      Employee.serialNum = serialNum;
      }
    EmployeeTest2.java
    public class EmployeeTest2 {
    	ㅤㅤ
      public static void main(String[] args) {
    	ㅤ
            System.out.println(Employee.getSerialNum());
    	Employee.setSerialNum(1003);
     	System.out.println(Employee.getSerialNum());
        ㅤ
    	}
    }
    변수의 유효 범위와 메모리
  • 変数の有効範囲(scope)と生成および消滅(ライフサイクル)は、変数のタイプによって異なります.
  • 地域では、変数、メンバー変数、クラス変数の有効範囲、ライフサイクルが異なり、使用するメモリも異なります.
  • 静的変数は、プログラムがメモリ内にあるときに領域を占有し続けるため、メモリ
  • をあまり大きく割り当てるべきではない.
  • クラスの複数のメソッドで使用される変数は、メンバー変数として宣言することが望ましい.
  • のメンバー変数が多すぎる場合、インスタンスの作成時に不要なメモリ
  • が割り当てられます.
  • の場合に適切な変数
  • を使用する必要がある.싱글톤 패턴이란?
  • プログラムは、1つのインスタンスを作成するときに使用する設計モード
  • のみを必要とする.
  • 静的変数、使用可能な方法
    会社対象
  • をモノトーンモードで実施する.
  • 作成者がプライベートと宣言
    private Company() {}
  • クラスでユニークなプライベートインスタンスを作成します(コンパイラのデフォルトはXです).
    private static Company instance = new Company();//singleton
  • は、クラスメソッドとして外部で参照できる一意のインスタンスを外部で参照できる共通のメソッドを提供する
  • .
    public static Company getInstance() {
    		    ㅤ
    	if( instance == null) {
    		instance = new Company();
    	}
    	return instance;
    		    ㅤ
    }
    CompanyTest.java
    public class CompanyTest {
        ㅤ
    	public static void main(String[] args) {
    		Company company1 = Company.getInstance();
    		    ㅤ
    		Company company2 = Company.getInstance();
    		    ㅤ
    		System.out.println(company1);
    		System.out.println(company2);
    		    ㅤ
    		//Calendar calendar = Calendar.getInstance();
    	}
    }
    본 게시글은 fastcampus 박은종강사 수업을 듣고 개인적으로 정리한 내용임을 밝힘.