본문 바로가기
개발 새발/JAVA

[Java] 자바 객체지향 - 클래스 멤버/인스턴스 멤버

by recordari 2025. 4. 7.

클래스 변수와 인스턴스 변수

인스턴스 변수는 클래스 영역에서 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다. 그래서 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 한다.

class Dog {
    String name; // 인스턴스 변수
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.name = "바둑이";
        System.out.println(myDog.name); // 바둑이
    }
}

 

클래스 변수는 static 키워드를 붙여 선언하며, 모든 인스턴스가 공통된 저장공간(변수)를 공유한다. 인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와 달리, 클래스 변수는 메모리를 하나만 차지한다.

class Dog {
    static int dogCount = 0; // 클래스 변수
    String name;

    Dog(String name) {
        this.name = name;
        dogCount++;
    }
}

public class Main {
    public static void main(String[] args) {
        Dog a = new Dog("초코");
        Dog b = new Dog("콩이");
        System.out.println(Dog.dogCount); // 2
    }
}

 

지역 변수는 메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸된다.

public void printName() {
    String name = "홍길동"; // 지역 변수
    System.out.println(name);
}

 

 

기본형 매개변수와 참조형 매개변수

  • 기본형 매개변수는 변수의 값을 읽기만 할 수 있다. 즉, 메서드로 값을 전달해도 원본에는 영향을 주지 않는다.
public void increase(int x) {
    x++;
}

public static void main(String[] args) {
    int a = 10;
    increase(a);
    System.out.println(a); // 10
}
  • 참조형 매개변수는 변수의 값을 읽고 변경할 수 있다. 참조형으로 메서드의 매개변수를 설정하면 값이 저장된 곳의 주소를 전달하므로, 원본 객체의 상태를 바꿀 수 있다.
public void changeName(Dog d) {
    d.name = "멍멍이";
}

public static void main(String[] args) {
    Dog dog = new Dog("초코");
    changeName(dog);
    System.out.println(dog.name); // 멍멍이
}

참조형 반환타입

메서드가 객체를 반환하는 것도 가능하다. 반환 타입이 참조형이라는 것은 반환되는 값이 객체의 주소라는 뜻이다.

public Dog createDog() {
    Dog d = new Dog("해피");
    return d;
}

 

 

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

메서드 앞에 static이 붙으면 클래스 메서드, 붙지 않으면 인스턴스 메서드이다.

  • 클래스 메서드는 객체를 생성하지 않고도 '클래스이름.메서드이름' 형식으로 호출할 수 있다.
  • 인스턴스 메서드는 반드시 객체를 생성해야 호출할 수 있다.
class Calculator {
    static int add(int a, int b) { // 클래스 메서드
        return a + b;
    }

    int multiply(int a, int b) { // 인스턴스 메서드
        return a * b;
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Calculator.add(3, 5)); // 클래스 메서드 호출

        Calculator c = new Calculator();
        System.out.println(c.multiply(3, 5)); // 인스턴스 메서드 호출
    }
}

클래스는 '데이터(변수)'와 '데이터에 관련된 메서드'의 집합이므로, 클래스 내의 메서드와 멤버 변수는 아주 밀접한 관련이 있다.

  • 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 수행하며, 인스턴스가 생성되어야만 사용 가능하다.
  • 클래스 메서드는 인스턴스와 관계없는 작업을 할 때 정의하며, 인스턴스 변수는 사용할 수 없다.
  • 반대로, 인스턴스 메서드에서는 클래스 변수나 클래스 메서드를 자유롭게 사용할 수 있다.
인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다. 하지만 인스턴스 멤버간의 호출에는 아무런 문제가 없다. 하나의 인스턴스멤버가 존재한다는 것은 인스턴스가 이미 생성되어있다는 것을 의미하기 때문이다.

 

클래스 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 한다면 static을 붙여 클래스 변수로 만든다. 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에는 static을 붙여 클래스 메서드로 만드는 것이 성능상 이점이 있다.

 

(자바의 정석을 보고 정리한 내용)