Skip to main content

[Java] 클래스 메서드 vs. 인스턴스 메서드

·2 mins· loading · loading ·
CS Java
Soeun Uhm
Author
Soeun Uhm
problem-solving engineer, talented in grit.
Table of Contents

우테코 1주차를 진행하면서, 내가 static method 를 남발하고 있었다. 따라서 언제 static method 와 instance method 를 구분해서 사용할지, 딱 정리해보고자 한다.

메서드 종류
#

클래스 메서드
#

메서드 앞에 static 이 붙어 있으면, 클래스 메서드이다. 클래스 메서드도 클래스 변수 처럼, 객체(인스턴스) 를 생성하지 않고도 클래스이름.메서드이름 으로 호출 가능하다. 클래스는 ‘데이터(변수)와 관련된 메서드의 집합’ 이다. 따라서 인스턴스와 관계없는 (인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드로 정의한다.

클래스 메서드는 Override 될 수 없다.

인스턴스 메서드
#

메서드 앞에 static 이 붙어있지 않으면 인스턴스 메서드이다. 반드시 인스턴스를 생성한 후에야, 접근 가능하다. 인스턴스 메서드는 인스턴스 변수와 관련된 작업으르 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.

인스턴스 메서드는 클래스의 객체에 속해있는 것이지, 클래스 자체에 속해있는 것이 아니다. 인스턴스 메서드라고 해서, 인스턴스 메서드가 생성될 때 자동으로 생성되는 것이 아니다. 메모리에 한 번 할당이 되고, 각 생성된 객체들은 그 메서드가 메모리의 어느 위치에 존재하는지 알 뿐이다. 객체가 메모리가 할당된 주소를 담고 있어 메서드를 호출하면 메모리 주소를 통해 메서드를 호출하게 된다.

class Person{
    String personName;
    public void changeName(String name){ //인스턴스 메서드
        this.personName = name;
    }
}

class Application{
    public static void main(String[] args){
        Person james = new Person(); // 새로운 객체 생성
        james.changeName("James B.") // 객체를 통해 인스턴스 메서드에 접근
        System.out.println(james.personName); //James B.
    }
}

아래에서, 클래스와 인스턴스 변수 / 메서드를 정의할 때 고려할 사항에 대해 보자.

  1. 클래스를 설계할 때, 멤버변수 중 인스턴스에 공통으로 사용하는 것을 static 이라 한다.
  2. 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다. 왜냐하면, 인스턴스 변수는 인스턴스가 생성되어야지만 사용할 수 있는데, 클래스 메서드는 인스턴스의 생성과 관계 없이 호출 가능하다. 따라서 클래스 메서드가 있는 시점에 인스턴스가 존재하지 않을 수 있다. 반면에, 인스턴스변수나 인스턴스메서드가 static 이 붙은 멤버들을 사용하는 것은 언제나 가능하다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static 을 붙이는 것을 고려한다.

클래스 멤버와 인스턴스 멤버 간의 호출
#

  • 클래스 멤버 -> 인스턴스 멤버 호출 : 불가능
  • 인스턴스 멤버 -> 클래스 멤버 호출 : 가능

Reference
#

Related

[Java] 생성자(Constructor)
·2 mins· loading · loading
CS Java
인스턴스 초기화 메서드인 생성자
[Java] 클래스 변수 vs. 인스턴스 변수 vs. 로컬 변수
·3 mins· loading · loading
CS Java
Java 3가지 변수의 종류
[Java] Enum
·3 mins· loading · loading
CS Java
관련된 상수의 집합인 Enum