this

  • 객체 자신을 가리킨다

    • 인스턴스 자신의 메모리를 가리킨다
      -> 인스턴스를 생성하면 힙 메모리에 생성이 되는데 그 때 생성되는 주소값이 참조변수, 참조값, reference value라고 한다
      변수 자체는 그 인스턴스의 외부에 해당한다
    • 인스턴스 내부에서 자기 자신의 주소값(인스턴스 메모리)을 갖는 것이 this
    • 생성자에서 또 다른 생성자를 호출할 때 사용
    • 자신의 주소(참조값)를 반환할 때 사용
  • 생성된 인스턴스 메모리의 주소를 갖는다

    main함수 내에서 참조변수로 새로운 인스턴스가 new 되었을 때
    heap 메모리에는 new된 인스턴스들이 생성되고
    stack 메모리에는 사용된 함수와 메서드의 지역변수들이 생성된다
    stack 메모리에서 new할 때 생성된 지역변수는 heap메모리의 주소를 갖는다
    set~ 메서드를 사용하면 그 함수에 해당하는 stack 메모리가 생성이 되고 그 안에 this라는 키워드가 갖게 되는 값은 heap 메모리의 인스턴스들을 가리킨다

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

  • 클래스에서 생성자가 여러 개일 경우, this를 이용하여 생성자에서 다른 생성자를 호출할 수 있다
  • 생성자에서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없다

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);
    }
}

객체 간의 협력 - Collaboration

  • 객체 지향 프로그래밍에서는 객체 간에 협력이 이루어진다
    협력에 필요한 기능이 구현되어야 한다
  • 매개변수로 객체가 전달되는 경우가 발생

협력 실습

  • 버스타고 학교 가는 학생의 과정을 객체 지향 프로그래밍으로 구현하기

    James와 Tomas는 각각 버스와 지하철을 타고 학교에 갑니다.
    James는 5000원을 가지고 있었고, 100번 버스를 타면서 1000원을 지불합니다.
    Tomas는 10000원을 가지고 있었고, 초록색 지하철을 타면서 1200원을 지불합니다.

  1. 학생 클래스 - Student

    학생의 이름, 가진 돈으로 생성자
    버스를 타면 -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 + "원 입니다.");
    }
}
  1. 버스 클래스 - 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. 지하철 클래스 - Subway

    지하철 호선으로 생성자, 승객 수, 수입
    승객 수 +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 + "원입니다.");
    }
}
  1. 테스트 클래스 - TakeTransTest

    학생의 이름, 가진 돈을 입력해서 학생 생성
    버스의 번호를 입력해서 버스 생성, 지하철의 호선 입력해서 지하철 생성
    학생별로 버스를 타면 버스 비용 지불, 지하철타면 지하철 비용 지불
    학생 정보 출력, 버스 지하철 정보 출력

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();
    }
}

협력 실습 2

  • 앞의 예제에서 'Edward'는 지각을 해서 택시를 탔습니다
    20000원을 갖고 있었는데 10000원을 택시비로 사용했습니다
    택시는 '잘나간다 운수'회사의 택시를 탔습니다

  • 츨력 결과
    Edward님의 남은 돈은 10000원 입니다.
    잘 나간다 운수 택시 수입은 10000원 입니다.

  1. 학생 클래스 - Student

    학생의 이름, 가진 돈
    택시를 타면 택시를 호출해서 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 + "원 입니다.");
    }
}
  1. 택시 클래스 - Texi

    회사 이름, 수입으로 생성자
    수입을 + 들어온 돈 하는 메서드
    정보를 출력하는 메서드

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 + "원 입니다.");
    }
}
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글