객체 자신을 가리킨다
- 인스턴스 자신의 메모리를 가리킨다
-> 인스턴스를 생성하면 힙 메모리에 생성이 되는데 그 때 생성되는 주소값이 참조변수, 참조값, reference value라고 한다
변수 자체는 그 인스턴스의 외부에 해당한다- 인스턴스 내부에서 자기 자신의 주소값(인스턴스 메모리)을 갖는 것이 this
- 생성자에서 또 다른 생성자를 호출할 때 사용
- 자신의 주소(참조값)를 반환할 때 사용
생성된 인스턴스 메모리의 주소를 갖는다
main함수 내에서 참조변수로 새로운 인스턴스가 new 되었을 때
heap 메모리에는 new된 인스턴스들이 생성되고
stack 메모리에는 사용된 함수와 메서드의 지역변수들이 생성된다
stack 메모리에서 new할 때 생성된 지역변수는 heap메모리의 주소를 갖는다
set~ 메서드를 사용하면 그 함수에 해당하는 stack 메모리가 생성이 되고 그 안에 this라는 키워드가 갖게 되는 값은 heap 메모리의 인스턴스들을 가리킨다
this()에서 삽입된 데이터들의 타입을 이용해 인스턴스를 생성하는데 그 부분이 다음에 나온다면 그 생성자까지 마무리되어야 완전히 생성된 것이므로 this() 이전에 다른 statement를 사용할 수 없는 것이다
Person.java
public class Person {
String name;
int age;
public Person(){
//int num = 10; 이렇게 하면 안된다. 아래가 아직 완료되지 않았기 때문
this("noname", 1);
int num1 = 11; //이거는 가능하다.
}
public Person(String name, int age){
this.age = age;
this.name = name;
}
public Person getPerson(){
return this;
}
public void showPerson(){
System.out.println(name + "," + age);
}
public static void main(String[] args) {
Person person = new Person();
person.showPerson();
System.out.println(person);
Person person2 = person.getPerson();
System.out.println(person2);
}
}
James와 Tomas는 각각 버스와 지하철을 타고 학교에 갑니다.
James는 5000원을 가지고 있었고, 100번 버스를 타면서 1000원을 지불합니다.
Tomas는 10000원을 가지고 있었고, 초록색 지하철을 타면서 1200원을 지불합니다.
학생의 이름, 가진 돈으로 생성자
버스를 타면 -1000하는 메서드(+버스 호출해서 그쪽으로 돈 보냄) 지하철을 타면 1200하는 메서드(+지하철 호출해서 그쪽으로 돈 보냄), 정보를 출력하는 메서드
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 + "원 입니다.");
}
}
- 버스 클래스 - Bus
버스 번호로 생성자, 버스 승객, 버스 수입
승객 수 + 1, 들어온 돈을 +하는 메서드, 정보를 출력하는 메서드
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 + "원입니다.");
}
}
지하철 호선으로 생성자, 승객 수, 수입
승객 수 +1, 들어온 돈을 +하는 메서드, 정보를 출력하는 메서드
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);
Bus bus500 = new Bus(500);
Subway greensubway = new Subway(2);
studentJ.takeBus(bus100);
studentT.takeSubway(greensubway);
studentJ.showInfo();
studentT.showInfo();
bus100.showBusInfo();
greensubway.showSubwayInfo();
bus500.showBusInfo();
}
}
앞의 예제에서 'Edward'는 지각을 해서 택시를 탔습니다
20000원을 갖고 있었는데 10000원을 택시비로 사용했습니다
택시는 '잘나간다 운수'회사의 택시를 탔습니다
츨력 결과
Edward님의 남은 돈은 10000원 입니다.
잘 나간다 운수 택시 수입은 10000원 입니다.
학생의 이름, 가진 돈
택시를 타면 택시를 호출해서 10000원을 보내고 가진 돈 -10000하는 메서드
public class Student {
String studentName;
int money;
public Student(String studentName, int money) {
this.studentName = studentName;
this.money = money;
}
public void takeTexi(Texi texi) {
texi.take(10000);
this.money -= 10000;
}
public void showInfo() {
System.out.println(studentName + "님의 남은 돈은 " + money + "원 입니다.");
}
}
회사 이름, 수입으로 생성자
수입을 + 들어온 돈 하는 메서드
정보를 출력하는 메서드
public class Texi {
String texiName;
int money;
public Texi(String texiName){
this.texiName = texiName;
}
public void take(int money){
this.money += money;
}
public void showTexiInfo(){
System.out.println(texiName + "택시 수입은 " + money + "원 입니다.");
}
}