6.1 this 예약어
this : 인스턴스(객체) 스스로를 가리키는 예약어
즉, this == 참조 변수가 가리키는 힙에 저장된 인스턴스의 주소
class BirthDay
{
String name;
int day, month, year;
public void printThis()
{
System.out.println(this); // this == bDay(인스턴스가 저장된 힙 주소)
}
BirthDay()
{
// this == bDay == Birthday. 그냥 특정 인스턴스의 Birthday라고 생각하면 됨
this("이름 없음", 0, 0, 0); // 디폴트 생성자에서 바로 아래 생성자를 호출
}
BirthDay(String name, int day, int month, int year)
{
this.name = name;
this.day = day;
this.month = month;
this.year = year;
}
BirthDay returnItSelf()
{
return this; // 인스턴스 자신의 주소를 반환
}
}
public class ThisExample
{
public static void main(String[] args)
{
BirthDay bDay = new BirthDay();
System.out.println(bDay);
bDay.printThis();
BirthDay basic = new BirthDay(); // 디폴트 생성자에서 다른 생성자 호출
System.out.println(basic.name + basic.day + basic.month + basic.year);
BirthDay p = basic.returnItSelf(); // basic 인스턴스의 주소를 p에 대입
System.out.println(p); // So, p의 주소와 basic의 주소가 같아짐
System.out.println(basic);
}
}
6.2장 객체 간 협력
버스, 지하철, 택시, 학생 클래스를 만들고 TakeTrans 클래스의 main 함수에서 4가지 클래스의 인스턴스를 만든 후 각 인스턴스가 서로 연동돼서 협력한다.
택시 클래스는 p.180 나 혼자 코딩
public class Bus {
int busNumber; // 버스 번호
int passengerCount; // 승객 수
int money; // 버스의 수입
public Bus(int busNumebr) // 버스 번호를 매개변수로 받는 생성자
{
this.busNumber = busNumebr;
}
public void take(int money) // 승객이 낸 돈을 받음
{
this.money += money; // 버스의 수입 증가
passengerCount++; // 승객 수 증가
}
public void showInfo() { // 버스 정보를 출력하는 함수
System.out.println("버스 " + busNumber + "번의 승객은 " + passengerCount +"명이고, 수입은 " + money + "입니다.");
}
}
public class Subway {
public String lineNumber; // 지하철 노선 번호
public int passengerCount; // 승객 수
public int money; // 수입 액
public Subway(String lineNumber) { // 지하철 노선 초기화
this.lineNumber = lineNumber;
}
public void take(int money) { // 승객이 탄 경우
this.money += money; // 수입 증가
passengerCount++; // 승객 수 증가
}
public void showInfo() // 지하철 정보 출력
{
System.out.println(lineNumber + "의 승객은 " + passengerCount +"명이고, 수입은 " + money + "입니다.");
}
}
public class Taxi
{
public String taxiNum; // 택시 번호
public int passengerCount; // 승객 수
public int money; // 수입 액
public Taxi(String num) {this.taxiNum = num;}
public void take(int money)
{
this.money += money;
passengerCount++;
}
public void showInfo()
{
System.out.println(taxiNum + "의 승객은 " + passengerCount +"명이고, 수입은 " + money + "입니다.");
}
}
public class Student {
public String studentName; // 학생 이름
public int grade; // 학년
public 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(1500);
this.money -= 1500;
}
public void takeTaxi(Taxi taxi) {
taxi.take(1500);
this.money -= 1500;
}
public void showInfo() {
System.out.println(studentName + "님의 남은 돈은 " + money + "입니다.");
}
}
public class TakeTrans {
public static void main(String[] args) {
// 두 명의 학생을 생성
Student studentJames = new Student("James", 5000);
Student studentTomas = new Student("Tomas", 10000);
Student studentEdward = new Student("Edward", 10000);
Bus bus100 = new Bus(100);
studentJames.takeBus(bus100); // james가 100번 버스를 탐
studentJames.showInfo(); // james 정보 출력
bus100.showInfo(); // 버스 정보 출력
Subway subwayGreen = new Subway("2호선");
studentTomas.takeSubway(subwayGreen); // Tomas가 2호선을 탐
studentTomas.showInfo(); // Tomas 정보 출력
subwayGreen.showInfo();
Taxi taxi7777 = new Taxi("tojaman486");
studentEdward.takeTaxi(taxi7777);
studentEdward.showInfo();
taxi7777.showInfo();
}
}
6.3 static 변수, static 메서드(정적 변수, 정적 메서드, 클래스 변수, 클래스 메서드)
클래스의 인스턴스가 공통으로 사용하는 멤버 변수에 static을 붙여준다.
즉, 인스턴스가 생성될 때 마다 초기화 되는 것이 아닌 프로그램이 실행될 때 딱 한번 메모리 공간이 할당되고 모든 인스턴스가 공유한다.
따라서, 다른 멤버 변수와 같이 인스턴스로 참조할 수도 있고 클래스 외부에서 클래스로 참조할 수도 있다.
public class Student1 {
public static int serialNum = 1000;
private static int seriaNum2 = 10000;
int studentID;
int studentID2;
String studentName;
int grade;
String address;
public Student1(){
serialNum++;
seriaNum2++;
studentID = serialNum;
studentID2 = serialNum;
}
public String getStudentName(){
return studentName;
}
public void setStudentName(String name){
studentName = name;
}
public static int getSerialNum() {
int i = 10; // i는 getSerialNum() 함수 내부의 '지역 변수'이므로 사용이 가능하다.
studentName = "aaa"; // studentName은 getSerialNum() 함수의 지역 변수도 아니고 클래스의 static 변수도 아니고
// 인스턴스가 생성될 때 선언된다.
// 따라서, 인스턴스가 생성되기 전에는 사용이 불가능하므로 오류가 난다.
return seriaNum2; // seriaNum2는 private static 변수라서 프로그램이 실행되자마자 인스턴스가 생성되기 전에
// 선언된 변수이고 private니깐 Student1 클래스 내부에서만 사용 가능함.
// 따라서, 인스턴스가 생성되기 전부터 클래스 함수에서 사용 가능함.
}
public static void setSerialNum(int serialNum) {
Student1.seriaNum2 = serialNum;
}
}
클래스 변수
public class StudentTest {
public static void main(String[] args) {
// getSerialNum() 함수는 static 함수이므로 인스턴스를 생성하기 전, 클래스 외부에서 호출 가능
System.out.println("클래스 외부 출력 : " + Student1.getSerialNum());
Student1 studentLee = new Student1();
studentLee.setStudentName("이지원");
System.out.println(studentLee.serialNum); // 일반적인 멤버 변수 출력
System.out.println(Student1.serialNum); // static 변수(클래스 변수)를 클래스 이름으로 참조할 수 있음
System.out.println(Student1.getSerialNum()); // private 멤버 변수를 static 멤버 함수(클래스 함수)로 간접 출력
System.out.println(studentLee.studentName + " 학번:"
+ studentLee.studentID);
Student1 studentSon = new Student1();
studentSon.setStudentName("손수경");
System.out.println(studentSon.serialNum); // 일반적인 멤버 변수 출력
System.out.println(Student1.serialNum); // static 변수(클래스 변수)를 클래스 이름으로 참조할 수 있음
System.out.println(Student1.getSerialNum()); // private 멤버 변수를 static 멤버 함수(클래스 함수)로 간접 출력
System.out.println(studentSon.studentName + " 학번:"
+ studentSon.studentID);
}
}
6.4 변수 유효 범위(지역 변수, 멤버 변수, static 변수)
지역 변수 : 함수 내부에서만 사용 가능
멤버 변수 : 인스턴스가 생성될 때 힙에 생성(인스턴스마다 각자 생성). 가비지 컬렉터가 메모리 수거할 때 소멸
static 변수 : 프로그램이 처음 시작할 때 데이터 영역에 생성(인스턴스가 하나의 static 변수 공유). 프로그램이 끝나고 메모리를 해제할 때 소멸
6.5 static 응용 - 싱글톤 패턴
싱글톤 패턴 : 클래스에서 딱 하나의 인스턴스만 생성하는 것
public class Company {
private static Company instance = new Company();
private Company(){}
public static Company getInstance() {
// 최초 getInstance() 함수 호출할 때 인스턴스 생성하고 그 이후엔 기존의 인스턴스 리턴
if(instance == null){
instance = new Company();
}
return instance;
}
}
public class CompanyTest {
public static void main(String[] args) {
// myCompany1 == myCompany2 이다.
Company myCompany1 = Company.getInstance();
Company myCompany2 = Company.getInstance();
System.out.println( myCompany1 == myCompany2 ); // 두 인스턴스가 같은 인스턴스니깐 true 출력
}
}
'Programming Language > 자바(JAVA)' 카테고리의 다른 글
Do it! 자바 프로그래밍 입문 / 9장 추상 클래스 (0) | 2023.01.04 |
---|---|
Do it! 자바 프로그래밍 입문 / 8장 상속 (2) | 2023.01.03 |
Do it! 자바 프로그래밍 입문 / 7장 배열과 ArrayList (0) | 2022.12.31 |
Do it 자바 프로그래밍 입문 연습문제 6장 (0) | 2022.12.30 |
Do it! 자바 프로그래밍 입문 / 5.5 생성자 ~ 5.7 정보 은닉 (0) | 2022.12.29 |