KDT/Java

231206 Java

001cloudid 2023. 12. 6. 17:40
728x90

This 예약어

자신의 메모리를 가리키는 this

package thisEx;

//자신의 메모리를 가리키는 this

class BirthDay{

int day;

int month;

int year;

 

//태어난 연도를 지정하는 메서드

public void setYear(int year){

this.year = year; //b.Day.year = year;과 같음

}

 

public void printThis() {

System.out.println(this);

}

 

 

}

 

 

public class ThisEx {

 

public static void main(String[] args) {

BirthDay bDay = new BirthDay();

bDay.setYear(2000);

System.out.println(bDay);

bDay.printThis();

 

}

 

}

그림 1. 자신의 메모리를 가리키는 this

bDay.printThis()메서드를 호출하여 출력한 this 값이 참조 변수 bDay를 출력한 값과 같음.

즉, 클래스 코드에서 사용하는 this는 생성된 인스턴스 자신을 가리키는 역할을 함

this.year = year; 문장으로 참조하면 동적 메모리에 생성된 인스턴스의 year 변수 위치를 가리키고 그 위치에 매개변수 값을 넣어주는 것

 

생성자에서 다른 생성자를 호출하는 this

this를 사용해 클래스의 생성자에서 다른 생성자를 호출할 수 있음

package thisEx;

 

class Person{

String name;

int age;

 

Person(){

this("이름 없음",1); this를 사용해 Person(String, int) 생성자 호출

}

 

Person(String name, int age){

this.name = name;

this.age = age;

}

}

 

 

public class CallAnotherConst {

 

public static void main(String[] args) {

Person noName = new Person();

System.out.println(noName.name);

System.out.println(noName.age);

 

}

 

}

그림 2. this로 다른 생성자 호출

this를 사용하여 생성자를 호출하는 코드 이전에 다른 코드를 넣을 수 없음. 만약 다른 코드를 넣으면 오류메세지가 나타남

생성자는 클래스가 생성될 때 호출되므로 클래스 생성이 완료되지 않은 시점에 다른 코드가 있다면 오류가 발생할 수 있음

즉, 디폴트 생성자에서 생성이 완료되는 것이 아니라 this를 사용해 다른 생성자를 호출하므로, 이때 this를 활용한 문장이 가장 먼저 와야함.

 

자신의 주소를 반환하는 this

생성된 클래스 자신의 주소값을 반환할 수 있음. 인스턴스 주소 값을 반환할 때는 this를 사용하고,

반환형을 클래스 자료형을 사용

package thisEx;

 

class Person{

String name;

int age;

 

Person(){

this("이름 없음",1);

}

 

Person(String name, int age){

this.name = name;

this.age = age;

}

 

//반환형은 클래스형

Person returnItSelf() {

return this; //this 반환

}

 

}

 

 

public class CallAnotherConst {

 

public static void main(String[] args) {

Person noName = new Person();

System.out.println(noName.name);

System.out.println(noName.age);

 

 

Person p = noName.returnItSelf(); //this 값을 클래스 변수에 대입

System.out.println(p); //noName.returnItSelf()의 반환 값 출력

System.out.println(noName); //참조 변수 출력

 

}

 

}

그림 3. 자신의 주소를 반환하는 this

this를 반환하는 메서드를 사용할 일이 흔하지 않지만, 클래스 자료형과 상관없이 클래스 내에서 this를 사용하면 자신의 주소 값을 반환할 수 있음

 

객체 간 협력

//231206

package test6_1;

 

class Bus{

int busNumber;

int passengerCount;

int money;

 

//버스 번호를 매개변수로 받는 생성자

public Bus(int busNumber) {

this.busNumber = busNumber;

}

 

//승객이 버스에 탄 경우 버스 요금을 지불하는 메서드 → 버스 수입 증가

public void take(int busMoney) {

this.money += busMoney;//지불 받은 요금을 가지고 있는 busMoney 매개변수 값을 멤버 변수 this.money에 저장

}

 

public void show() {

System.out.println("버스번호 : " + this.busNumber + ", 승객이 지불한 요금 : " + this.money);

}

 

}

 

class Subway{

int lineNumber;

int passengerCount;

int money;

 

//지하철 노선을 매개변수로 받는 생성자

public Subway(int lineNumber) {

this.lineNumber = lineNumber;

}

 

public void take(int subMoney) {

this.money += subMoney;

}

 

public void show1() {

System.out.println("지하철 라인 : " + this.lineNumber + ", 승객이 지불한 요금 : " + this.money);

}

}

 

class Student{

String studentName;

int money;

 

//객체 생성 시 이름과 가진 돈을 곡 넣어주지 않으면 객체가 생성되지 않음.

//이름과 가진 돈을 매개변수로 받는 생성자

public Student(String studentName, int money) {

this.studentName = studentName;

this.money = money;

}

 

//학생이 버스를 타면 3100원을 지불하는 기능을 구현하는 메서드. 학생 -3100, 버스 수익 +3100

public void takeBus(Bus bus) //Bus 클래스 객체

{

this.money -= 3100; //Student 클래스의 멤버 변수 money: 학생이 가지고 있는 돈에서 감소

}

 

//학생이 지하철을 타면 3000원이 지불하는 기능을 구현하는 매서드. 학생 -3000, 지하철 수익 +3000

public void takeSubway(Subway subway) //Subway 클래스 객체

{

this.money -= 3000; //Student 클래스의 멤버 변수 money;

}

 

public void showInfo() {

System.out.println(studentName + "의 남은 돈 : " + money);

}

 

 

}

 

 

public class takeTrans {

 

public static void main(String[] args) {

Bus bus100 = new Bus(100); //버스 객체 생성

bus100.show();

 

bus100.take(3100);//버스 요금 메서드

bus100.show();

 

 

Subway subway1 = new Subway(1);//지하철 객체 생성

subway1.show1();

 

subway1.take(3000); //지하철 요금 메서드

subway1.show1();

 

Student James = new Student("James",100000); //학생 객체 생성

James.showInfo();

 

bus100.take(3100);

bus100.show();

subway1.take(3000);

subway1.show1();

 

James.takeBus(bus100); //takeBus메서드에 매개변수는 객체형. Bus 클래스로 생성한 객체만 매개변수로 넘겨 줄 수 있음

James.showInfo();

 

James.takeSubway(subway1); //takeSubway 메서드에 매개변수는 객체형. Subway 클래스로 생성한 객체만 매개변수로 넘겨 줄 수 있음

James.showInfo();

 

 

 

}

 

}

그림 4. 객체 간 협력

 

728x90

'KDT > Java' 카테고리의 다른 글

231211 Java  (0) 2023.12.11
231207 Java  (0) 2023.12.07
231204 Java  (0) 2023.12.04
231130 Java  (0) 2023.11.30
231129 Java  (0) 2023.11.29