language study/java | 문제풀이

[Java] 객체지향 기초: this와 static (클래스 변수와 클래스 메서드)

지그농 2026. 5. 6. 14:00

지난 글에서는 클래스와 객체의 생성에 대해 알아봤습니다.

 

[Java] 객체지향 기초 - 클래스와 메서드

객체지향 프로그래밍(OOP)은 현대 소프트웨어 개발의 표준입니다.오늘은 자바에서 객체지향을 구성하는 2가지 핵심 요소를 한 페이지에 정리해 보려 합니다.1. 클래스2. 메서드1.클래스(Class)객체(

jignonne.tistory.com

 

이어서 객체 내부에서 자기 자신을 가리키는 this의 역할과, 모든 객체가 공유하는 static(클래스 변수/메서드)의 차이점을 학습하여 정리해 보았습니다.


1. 메서드와 this

this 키워드가 필요한 이유

메서드를 작성하다 보면 매개변수(파라미터)와 인스턴스 변수의 이름이 동일한 경우가 발생할 수 있습니다.

이 경우 자바는 기본적으로 가장 가까운 범위의 변수(지역 변수, 매개변수) 를 우선적으로 사용합니다.

 

class Book {
    int price; // 인스턴스 변수

    void setPrice(int price) { // 매개변수
        // 여기서 price는 둘 다 매개변수를 가리키게 되어 
        // 실제 객체의 price 필드값은 변하지 않는 논리 오류가 발생합니다.
        
        Sytem.out.println(price); // 매개변수 price가 출력됨
        return;
    }
}

 

따라서 별도의 구분 없이 사용할 경우, 개발자가 의도한 인스턴스 변수가 아닌 매개변수 값이 사용되는 문제가 발생할 수 있습니다.

이러한 문제를 해결하기 위해 사용되는 키워드가 this 입니다.

 


this 키워드의 역할

this는 현재 인스턴스(자기 자신)의 메모리 주소를 가리키는 참조 변수입니다. 

즉, this를 사용함으로써 현재 객체의 변수에 접근하고 있다는 것을 명확하게 표현할 수 있습니다.

 

this.price라고 쓰면 "이 객체가 가진 price 필드"라는 의미가 되어 외부에서 들어온 매개변수와 명확히 구분됩니다.

void printPrice(int price) {
    System.out.println(price);        // 매개변수
    System.out.println(this.price);   // 인스턴스 변수
}

 

이처럼 동일한 이름의 변수가 존재할 경우, this를 통해 두 변수를 명확하게 구분할 수 있습니다.

 

뿐만 아니라 해당 객체의 변수값을 수정하는 메서드에서도 this는 활용될 수 있습니다.

class Book {
    String title;
// 책 이름 수정 메서드
    void setTitle(String title) {
        this.title = title;
    }
}

 

이 메서드는 다음과 같은 흐름으로 동작합니다:

  • 외부에서 전달받은 title 값을
  • 현재 객체의 title 변수에 저장

이처럼 this는 객체 자신의 상태를 변경할 때 필수적으로 사용되는 키워드입니다.


2. static : 클래스 변수와 클래스 메서드

클래스 변수란 무엇인가?

클래스 변수는 static 키워드를 사용하여 선언된 변수로,

객체마다 개별적으로 존재하는 것이 아니라 모든 객체가 공유하는 클래스에 속하는 변수를 말합니다.

 

class Book {
    static float tax;
}

 

위와 같이 인스턴스 변수 앞에 static을 붙이면, 해당 변수는 특정 객체가 아닌 클래스 자체에 속하는 변수가 됩니다.

 

따라서 클래스 변수는 인스턴스 생성과 관계없이 클래스 이름을 통해 직접 접근할 수 있습니다.

// Book 객체 생성 전 접근 가능 

Book.tax = 1.2f;

클래스 변수가 필요한 이유

객체를 여러 개 생성할 때, 모든 객체에 동일하게 적용되어야 하는 값이 존재할 수 있습니다.

 

이러한 값을 인스턴스 변수로 관리할 경우,

객체마다 따로 값을 설정해야 하는 불편함이 발생합니다.

 

반면 클래스 변수를 사용하면 하나의 값을 모든 객체가 공유하기 때문에,

한 번의 설정으로 전체 객체에 동일한 값을 적용할 수 있습니다.

class Book {
    int price;
    static float tax;

    float taxPrice() {
        return this.price * tax;
    }
}

Book.tax = 1.2f; // 인스턴스 생성 전 설정

Book b1 = new Book();
b1.price = 10000;

System.out.println(b1.taxPrice()); // 12000

 

 

위 예시에서 tax는 클래스 변수이기 때문에
객체 생성 이전에 값을 설정할 수 있으며, 이후 생성된 모든 객체에서 동일하게 사용됩니다.

 

따라서 b1은 별도로 세율을 설정하지 않아도 공통으로 정의된 tax 값을 활용하여 계산할 수 있습니다.

 

이러한 구조는 공통 값을 한 곳에서 관리할 수 있기 때문에
유지보수 측면에서도 효율적인 장점을 가집니다.


어떻게 생성 전에 접근할 수 있는가? 

클래스 변수는 인스턴스 변수와 메모리 동작 방식이 다릅니다.

  • 인스턴스 변수 : 객체 생성 시 생성되어 Heap 영역에 저장
  • 클래스 변수 : 프로그램 실행 시 생성되어 Data 영역에 저장

인스턴스 변수는 객체 생성시 Heap 영역에 저장됩니다. 

이와 반대로 클래스 변수는 프로그램 실행시 생성되어 Data 영역에 저장됩니다.

 

즉, 클래스 변수는 객체가 만들어지기 전에 이미 메모리에 올라가 있기 때문에

인스턴스 생성 이전에 값에 접근할 수 있게 됩니다.


클래스 메서드란 무엇인가? 

클래스 메서드는 클래스 변수와 마찬가지로

메서드 앞에 static 키워드를 붙여 선언한 메서드로, 객체가 아닌 클래스에 속하는 메서드입니다.

 

class Book {
    static int generateBookNo() {
        return (int)(Math.random() * 10);
    }
}

 

 

 

클래스 메서드도 마찬가지로 인스턴스를 생성하지 않아도 

클래스 이름을 통해 바로 호출할 수 있습니다.

 

int number = Book.generateBookNo();

 

즉, 클래스 메서드는 객체 상태와 관계없이 동작하는 기능을 정의할 때 사용됩니다.

 


클래스 메서드 사용시 제한 사항

클래스 메서드 내부에서는 인스턴스 변수와 인스턴스 메서드를 직접 사용할 수 없습니다. 

 

이러한 제한은 메서드의 생성 시점과 관련이 있습니다.

  • 클래스 메서드 → 프로그램 실행 시 Data 영역에 생성
  • 인스턴스 변수 → 객체 생성 이후 Heap 영역에 생성

따라서 클래스 메서드가 실행되는 시점에는 참조할 인스턴스가 존재하지 않을 수 있기 때문에,
인스턴스에 속한 값이나 기능에 접근할 수 없습니다.

 


3. 참고 링크

 

Java this Keyword - GeeksforGeeks

Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.

www.geeksforgeeks.org

 

 

Understanding Class Members (The Java™ Tutorials > Learning the Java Language > Classes and Objects)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag

docs.oracle.com

 

 

 

[지금 무료]비전공자를 위한 자바| 이신만 - 인프런 강의

현재 평점 4.9점 수강생 944명인 강의를 만나보세요. 비전공자, 초보 개발자들이 자바 문법을 쉽게 배울 수 있습니다. 예제를 분석하며 문법을 배우는 방식입니다. 자바 문법, 객체지향, 자료구조,

www.inflearn.com