본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 15일차 (2023-06-13) 자바 기초 DAY13_인스턴스 메서드와 스태틱 메서드

by prometedor 2023. 6. 13.

인스턴스 메서드와 클래스 메서드

클래스 메서드 = static 메서드

ㄴ static 붙은 메서드

ㄴ 클래스 이름으로 호출할 수 있음

ㄴ 호출 시 => 클래스명.메서드명();

ㄴ "클래스 메서드"를 인스턴스 주소를 사용하여 호출할 수 있지만, 다른 개발자가 그냥 "인스턴스 메서드"인 줄 착각할 수 있기 때문에 이렇게 호출하지 말기를 권고


인스턴스 메서드 = non-static 메서드

ㄴ static 이 붙지 않은 메서드
ㄴ 인스턴스 주소가 있어야만 호출할 수 있음

ㄴ 인스턴스 메서드는 클래스 이름으로 호출할 수 없음

ㄴ 인스턴스 메서드는 반드시 인스턴스 주소를 사용하여 호출해야 함

 

// 인스턴스 메서드와 클래스 메서드

package com.eomcs.oop.ex03;

public class Exam0210 {
  static class A {
    //1) 클래스 메서드 = static 메서드
    //   => static 붙은 메서드
    //   => 클래스 이름으로 호출할 수 있음
    static void m1() {
      System.out.println("m1()");
    }

    //2) 인스턴스 메서드 = non-static 메서드
    //   => static 이 붙지 않은 메서드
    //   => 인스턴스 주소가 있어야만 호출할 수 있음
    void m2() {
      System.out.println("m2()");
    }
  }

  public static void main(String[] args) {

    // 클래스 메서드 호출
    // 문법) 클래스명.메서드명();
    A.m1(); // OK!

    // => 인스턴스 메서드는 클래스 이름으로 호출할 수 없다.
    //    A.m2(); // 컴파일 오류!

    A obj1 = new A();

    obj1.m1(); // OK! 그런데, 이렇게 하지 말기
    // 물론 "클래스 메서드"를 인스턴스 주소를 사용하여 호출할 수 있지만,
    // 다른 개발자가 그냥 "인스턴스 메서드"인 줄 착각할 수 있기 때문에
    // 이렇게 호출하지 말기를 권고
    obj1.m2(); // OK! 인스턴스 메서드는 반드시 인스턴스 주소를 사용하여 호출해야 함

    A obj2 = null;
    obj2.m2(); // 컴파일은 OK! 실행은 오류!
    // 왜? obj2 변수에 들어 있는 인스턴스 주소가 무효하기 때문이다.
  }
}

// 결론!
// 클래스 메서드(=스태틱 메서드)
//   => 인스턴스 변수를 사용하지 않을 경우 클래스 메서드로 선언하라!
// 인스턴스 메서드
//   => 인스턴스 변수를 사용할 경우 인스턴스 메서드로 선언하라!

// 실무
// => 일단 인스턴스 메서드로 무조건 만들라!
// => 인스턴스 변수를 완전히 사용하지 않음을 확신하면 
//    그 때 클래스 메서드로 전환하라!

 

ㄴ 인스턴스 변수를 사용하지 않을 경우 클래스 메서드(스태틱 메서드)로 선언하자

ㄴ 인스턴스 변수를 사용할 경웅 인스턴스 메서드로 선언하자

ㄴ 실무에서는 일단 인스턴스 메서드로 무조건 만들고 인스턴스 변수를 완전히 사용하지 않음을 확신하면 그 때 클래스 메서드(스태틱 메서드)로 전환하자

 

인스턴스 메서드 - 내장 변수 this

ㄴ 클래스 메서드(스태틱 메서드)는 인스턴스 주소 없이 호출되기 때문에 인스턴스 주소를 받는 내장 변수가 없음

=> this 사용하지 않음

ㄴ 인스턴스 메서드는 인스턴스 주소가 있어야만 호출되기 때문에 인스턴스 주소를 받을 변수가 내장되어 있음

=> this 를 사용함

ㄴ 인스턴스  변수를 사용할 때 this 를 생략할 수 있는데, 이럴 경우  컴파일 시 앞에 자동으로 this 가 붙음

ㄴ 로컬 변수의 이름이 인스턴스의 이름과 같을 경우 this 를 붙이지 않으면 로컬 변수를 가리키므로 로컬 변수가 아닌 인스턴스 변수를 가리키고 싶으면 this 를 붙여야 함

ㄴ 컴파일 결과 클래스 파일을 통해 인스턴스 메서드는 인스턴스 주소를 받을 this 라는 내장변수가 생성되는 것을 확인할 수 있음

 

// 인스턴스 메서드 - 내장 변수 this
package com.eomcs.oop.ex03;

public class Exam0220 {

  static class A {

    int value;

    static void m1() {
      // 클래스 메서드는 인스턴스 주소 없이 호출되기 때문에 
      // 인스턴스 주소를 받는 내장 변수가 없다.
      //      this.value = 100; // 컴파일 오류!
    }

    void m2() {
      // 인스턴스 메서드는 인스턴스 주소가 있어야만 호출되기 때문에
      // 인스턴스 주소를 받을 변수가 내장되어 있다.
      this.value = 100;
    }

    void m3() {
      // 인스턴스 변수를 사용할 때 this를 생략할 수 있다.
      //this.value = 200;
      value = 200; // 앞에 자동으로 this가 붙는다.
    }

    void m4(int value) {
      // 로컬 변수의 이름이 인스턴스 이름과 같을 경우 
      // this를 붙이지 않으면 로컬 변수를 가리킨다.
      value = 200; // 로컬 변수이다.

      this.value = 300; // 인스턴스 변수이다.
      // 따라서 로컬 변수가 아닌 인스턴스 변수를 가리키고 싶으면 this를 붙여야 한다.
    }
  }
  public static void main(String[] args) {
    // 클래스 메서드는 인스턴스 주소 없이 클래스 이름으로 호출한다.
    // 그래서 클래스 메서드는 this라는 내장 변수가 없는 것이다.
    A.m1();

    A obj1 = new A();

    // 인스턴스 메서드는 인스턴스 주소가 있어야만 호출할 수 있기 때문에
    // 인스턴스 메서드에는 인스턴스 주소를 받을 수 있는 내장 변수 this가 있다.
    obj1.m2();

    // 물론 클래스 메서드도 레퍼런스를 가지고 호출할 수 있지만,
    // 인스턴스 주소가 메서드에 전달되지 않는다.
    // 그래서 클래스 메서드는 내장 변수 this가 없다.
    obj1.m1();

    A obj2 = new A();

    // 인스턴스 메서드의 this 변수는 메서드를 호출할 때 전달한 인스턴스 주소 값을 가진다.
    // 그래서 메서드가 호출될 때 마다 this 변수의 값이 바뀐다.
    obj2.m2();
    obj2.m3();
    obj2.m4(100);

  }
}

ㄴ 클래스 메서드(스태틱 메서드)는 인스턴스 주소 없이 클래스 이름으로 호출하므로 클래스 메서드는 this 라는 내장 변수가 없는 것