[Java] 클래스(class) - 인스턴스 메소드 (instance method), this 문법
 
클래스 - 인스턴스 메소드


예제)


class Student {
  String name;
  int[] scores = new int[3];
  int total;
  float aver;
  // 이렇게 클래스 블록 안에 묶여서 호출할 때마다 클래스 이름으로
  // 호출해야 하는 메서드를 "클래스 메서드(=스태틱 메서드)"라 부른다.
  public void init(Student s, String name, int kor, int eng, int math) {
    s.name = name;
    s.scores[0] = kor;
    s.scores[1] = eng;
    s.scores[2] = math;
  }
  public void compute(Student s) {
    s.total = s.scores[0] + s.scores[1] + s.scores[2];
    s.aver = s.total / 3f;
  }
 
  public void print(Student s) {
    System.out.printf("%s, %d, %d, %d, %d, %f \n",
        s.name, s.scores[0], s.scores[1], s.scores[2], s.total, s.aver);
  }

}



=> class Student 안에 static이 붙지 않은 init(), compute(), print()과 같은 메서드를 "인스턴스 메서드"라 부른다.

ex) 위 클래스에서 init 메서드를 호출하는 코드
Student s1 = new Student();
Student.init(s1, "홍길동", 100, 100, 100);

=> init(), compute(), print() 함수는 모두 Student 인스턴스(s)를 파라미터로 넘겨서 그 인스턴스에 값을 저장해 사용하고 있다. 그러나 이런 Student 인스턴스를 쓰지 않고 사용할 수 있는 문법이 있는데, 그것이 바로 this 문법이다.


=> 메서드 앞에 놓은 인스턴스 주소를 메서드 안에서 어떻게 사용할까?
- 인스턴스 주소가 그 메서드의 내장 변수 this에 자동 저장된다.




위 예제를 다음과 같이 바꿀 수 있다!





클래스 - this의 사용


예제)


class Student {
  String name;
  int[] scores = new int[3];
  int total;
  float aver;
 
  // => static이 붙지 않은 메서드를 "인스턴스 메서드"라 부른다.
  // => 인스턴스 메서드는 호출할 때 반드시 인스턴스 주소를 줘야 한다.
  //    예) 인스턴스주소.메서드명();
  // => 이렇게 메서드를 호출할 때 앞에 놓인 인스턴스의 주소는
  //    그 메서드의 내장 변수 this에 자동 보관된다.
  public void init(String name, int kor, int eng, int math) {
    this.name = name;
    this.scores[0] = kor;
    this.scores[1] = eng;
    this.scores[2] = math;
  }
  public void compute() {
    this.total = this.scores[0] + this.scores[1] + this.scores[2];
    this.aver = this.total / 3f;
  }
 
  public void print(Student2 s) {
    System.out.printf("%s, %d, %d, %d, %d, %f \n",
        this.name, this.scores[0], this.scores[1], this.scores[2],            this.total, this.aver);
  }
}



=> 이렇게 클래스에 정의한 인스턴스 메소드를 호출할 때는  main () 에서
Student s1 = new Student();

s1.init("홍길동", 100, 100, 100)



무엇이 변화했는가?



Student s1 = new Student();
Student.init(s1, "홍길동", 100, 100, 100);


위 코드가


Student s1 = new Student();

s1.init("홍길동", 100, 100, 100)


이렇게 직관적이고 간결하게 바뀌었다. 

블로그 이미지

필로그래머

,