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
ORStudent 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() 메서드
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の場合、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
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 + "원 입니다");
}
Buspublic 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 + "원 입니다");
}
}
Subwaypublic 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 + "원 입니다");
}
}
Takepublic 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.javapublic class EmployeeTest2 {
ㅤㅤ
public static void main(String[] args) {
ㅤ
System.out.println(Employee.getSerialNum());
Employee.setSerialNum(1003);
System.out.println(Employee.getSerialNum());
ㅤ
}
}
변수의 유효 범위와 메모리
싱글톤 패턴이란?
会社対象
private Company() {}
private static Company instance = new Company();//singleton
public static Company getInstance() {
ㅤ
if( instance == null) {
instance = new Company();
}
return instance;
ㅤ
}
CompanyTest.javapublic 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 박은종강사 수업을 듣고 개인적으로 정리한 내용임을 밝힘.
Reference
この問題について(Java (4)), 我々は、より多くの情報をここで見つけました https://velog.io/@anthony16/Java-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol