자바(Java) 프로그래밍, 클래스와 객체 Part 4
- 개발 스터디 / Java
- 2024. 4. 14.
1. this 예약어
1-1. this 출력해보기
this는 생성된 인스턴스 스스로를 가리키는 예약어이다.
this 출력 예제
package thisex;
public class BirthDay {
int day;
int month;
int year;
public void setYear(int year) {
this.year = year;
}
public void printThis() {
System.out.println(this);
}
}
외부 클래스 코드
package thisex;
public class ThisExample {
public static void main(String[] args) {
BirthDay bDay = new BirthDay();
bDay.setYear(2000);
System.out.println(bDay);
bDay.printThis();
}
}
출력 결과

출력 결과를 보면 bDay.printThis() 메서드를 호출하여
출력한 this 값이 참조변수 bDay를 출력한 값과 같다.
즉 클래스 코드에서 사용하는 this는 생성된 인스턴스 자신을
가리키는 역할을 한다. 따라서 this.year = year; 문장으로 참조하면
동적 메모리에 생성된 인스턴스의 year 변수 위치를 가리키고
그 위치에 메개변수 값을 넣어주는 것이다.
1-2. 생성자에서 다른 생성자를 호출하는 this
클래스에 생성자가 여러 개 있을 때 어떤 생성자에서
다른 생성자를 호출하는 경우가 종종 있다.
이때 this를 사용해 클래스의 생성자에서 다른생성자를 호출할 수 있다.
//내부 클래스
package thisex;
class Person {
String name;
int age;
Person( ){
this("이름 없음", 1); //this를 사용해 Person(Sting, int) 생성자 호출
}
Person(String name, int age){
this.name = name;
this.age = age;
}
}
//외부 클래스
package thisex;
public class CallAnotherConst {
public static void main(String[] args) {
Person noName = new Person();
System.out.println(noName.name);
System.out.println(noName.age);
}
}
Person 클래스에는 Person() 디폴트 생성자와 매개변수를 가지는
Person(String, int) 생성자가 있다. 클래스가 생성될 때 Person(String, int)가
호출되어 이름과 나이를 전달 받고, Person() 디폴트 생성자가 호출되는 경우에는
초깃값으로 "이름 없음"과 1 값을 대입하고자 한다.
디폴트 생성자 코드 안에 직접 써도 되지만, 이미 달느 생성자에 이 코드가
작성되어 있어서 8행처럼 this를 활용하여 다른 생성자를 호출 할 수 있다.
1-2. 자신의 주소를 반환하는 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;
}
}
//외부 클래스
package thisex;
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); //참조 변수 출력
}
}
2. 객체 간 협력
2-1. 학생이 타는 버스, 지하철 클래스 구현
학생 클래스 구현 코드
package cooperation;
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 showInfo() {
System.out.println(studentName + "님의 남은 돈은 " + money + "입니다.");
}
}
버스 클래스 구현
package cooperation;
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 showInfo() {
System.out.printf("버스 %d번의 승객은 %d명이고 수입은 %d입니다.\n",
busNumber, passengerCount, money);
}
}
지하철 클래스 구현
package cooperation;
public class Subway {
String lineNumber;
int passengerCount;
int money;
public Subway(String lineNumber) {
this.lineNumber = lineNumber;
}
public void take(int money) {
this.money += money;
passengerCount++;
}
public void showInfo() {
System.out.printf("%s의 승객은 %d명이고 수입은 %d입니다.\n",
lineNumber, passengerCount, money);
}
}
학생, 버스, 지하철 객체 협력 클래스 구현
package cooperation;
public class TakeTrain {
public static void main(String[] args) {
Student studentJames = new Student("James", 5000);
Student studentTomas = new Student("Tomas", 10000);
Bus bus100 = new Bus(100);
studentJames.takeBus(bus100);
studentJames.showInfo();
bus100.showInfo();
Subway subwayGreen = new Subway("2호선");
studentTomas.takeSubway(subwayGreen);
studentTomas.showInfo();
subwayGreen.showInfo();
}
}
출력 화면

두 개의 학생 인스턴스를 생성했다. studentJames 인스턴스에서
학생 이름은 James, 가진 돈은 5,000원으로 초기화하고,
studentTomas 인스턴스에서 학생 이름은 Tomas, 가진 돈은 10,000원으로
초기화 했다. 그리고 bus100 변수가 가리키는 버스와 subwayGreen이
가리키는 지하철 노선을 생성했다.
예제에서 객체 간 협력은 학생, 버스, 지하철 사이에 이루어 졌다.
학생이 버스나 지하철을 사면 학생의 돈은 줄어들지만 버스, 지하철의 수입은
올라간다. 객체를 클래스로 만들어 구현하면 이처럼 객체 사이에 서로 어떤 값을
주고받고 메서드를 호출하는 일이 발생한다.
'개발 스터디 > Java' 카테고리의 다른 글
자바(Java) 프로그래밍, 클래스와 객체 Part 5 (0) | 2024.04.14 |
---|---|
자바(Java) 프로그래밍, 클래스와 객체 Part 3 (0) | 2024.04.13 |
자바(Java) 프로그래밍, 클래스와 객체 Part 2 (0) | 2024.04.13 |
자바(Java) 프로그래밍, 클래스와 객체 Part. 1 (0) | 2024.04.13 |
자바(Java) 프로그래밍, 반복문 - while문, do while문, for문 (0) | 2024.04.08 |