변수와 메서드

2025. 2. 20. 16:15Java/객체지향

변수

변수 유형

선언 위치 메모리 영역 기본값 특징
지역 변수

메서드 내부 스택
(Stack)
메서드 호출시 생성
메서드 종료시 소멸
멤버 변수 인스턴스 변수 클래스 내부
(static 없음)

(Heap)
O 객체당 개별로 존재
인스턴스 생성시 생성
참조되지 않을시 GC가 제거
클래스 변수 클래스 내부
(static 있음)
메서드 영역 O 모든 객체가 공유
프로그램 시작시 생성
프로그램 종료시 소멸 
매개변수

메서드의 () 내부 스택(Stack) X 메서드 호출시 생성
메서드 종료시 소멸

 

1. 지역 변수 (Local Variable)

  • 선언 위치: 메서드, 생성자, 또는 블록 내부에서 선언됨.
  • 메모리 영역: 스택(Stack)에 저장됨.
  • 생명주기: 변수가 선언된 블록이 끝나면 사라짐.
  • 기본값: 자동으로 초기화되지 않으므로 반드시 값을 할당해야 함.
public class Example {
    void method() {
        int localVar = 10; // 지역 변수
        System.out.println(localVar);
    }
}

 

2. 멤버 변수 (Member Variable)

  • 선언 위치: 클래스 내부, 메서드 외부에서 선언됨.
  • 메모리 영역: 힙(Heap)에 저장됨.
  • 생명주기: 객체가 생성될 때 할당되고, 객체가 삭제될 때 사라짐.
  • 기본값: 자동으로 초기화됨 (숫자형은 0, boolean은 false, 참조형은 null).
  • 종류: 멤버 변수는 다시 인스턴스 변수와 클래스 변수로 나뉨.

2-1) 인스턴스 변수 (Instance Variable)

  • 정의: 객체(인스턴스)가 생성될 때 함께 만들어지는 변수.
  • 선언 위치: 클래스 내부, static 키워드 없이 선언.
  • 메모리 영역: 힙(Heap)에 저장됨.
  • 특징: 각 객체마다 개별적으로 존재.
public class Person {
    String name; // 인스턴스 변수
    int age;     // 인스턴스 변수
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Alice", 25);
        Person p2 = new Person("Bob", 30);
        
        System.out.println(p1.name); // Alice
        System.out.println(p2.name); // Bob
    }
}

 

2-2) 클래스 변수 (Class Variable, 정적 변수)

  • 정의: 클래스가 로드될 때 한 번만 생성되고, 모든 인스턴스가 공유하는 변수.
  • 선언 위치: 클래스 내부에서 static 키워드를 사용하여 선언.
  • 메모리 영역: 메서드 영역(Method Area, 또는 클래스 영역)에 저장됨.
  • 특징
    • 모든 객체가 같은 값을 공유함.
    • 클래스 이름으로 접근 가능 (클래스명.변수명)
public class Counter {
    static int count = 0; // 클래스 변수
   
    Counter() {
        count++; // 모든 인스턴스가 공유하는 변수
    }
}

public class Main {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        
        System.out.println(Counter.count); // 2
    }
}

 

3. 매개변수 (Parameter)

  • 정의: 메서드 호출 시 전달되는 변수.
  • 선언 위치: 메서드의 괄호 () 안에서 선언됨.
  • 메모리 영역: 스택(Stack)에 저장됨.
  • 특징: 메서드 실행이 끝나면 사라짐.
public class Example {
    void greet(String name) { // 매개변수 name
        System.out.println("Hello, " + name);
    }

    public static void main(String[] args) {
        Example ex = new Example();
        ex.greet("Hyunji"); // "Hello, Hyunji"
    }
}

 



메서드

1. 메서드(method)란?

  • 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
  • 기본적으로 수학의 함수 처럼 어떤 값을 입력하면 이 값으로 작업을 수행하여 결과를 반환한다. (그러나 함수와 달리 입력값 또는 출력값은 없을 수 있다.)
  • 메서드를 사용하는 이유
    • 높은 재사용성
    • 중복된 코드의 제거
    • 프로그램의 구조화

2. 메서드의 선언과 호출

//메서드 선언
[접근제어자] [static 여부] [반환타입] 메서드이름(매개변수) {
    // 실행할 코드
    return 반환값;  // 반환타입이 void면 생략 가능
}

//메서드 호출
메서드이름(매개변수1, 2, ..);

 

3. 메서드의 구성

1) 접근제어자 (Access Modifier)

메서드의 접근 범위를 지정한다. 

접근제어자 설명
public 어디서든 접근 가능
protected 같은 패키지 또는 상속받은 클래스에서 접근 가능
private 해당 클래스 내부에서만 접근 가능
(default) 같은 패키지 내에서만 접근 가능 (아무것도 안 쓰면 default)

 

2) 반환 타입 (Return Type)

  • 메서드가 어떤 데이터를 반환할지 지정.
  • void이면 반환값이 없음.
  • int, double, String, 객체 등의 자료형을 반환 가능.
  • 참조형 반환타입
    • 반환 타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다.
    • 참조형 타입의 값은 객체의 주소이므로 정수값이 반환됨

3) 매개변수 (Parameter)

  • 메서드가 실행될 때 전달받는 값.
  • 여러 개 사용 가능.
  • 기본 자료형, 객체, 배열 등 다양한 타입 사용 가능.
  • 매개변수 타입
    • 기본형 매개변수 (Call by value): 변수의 값을 읽기만 할 수 있다 (Read only)
    • 참조형 매개변수 (Call by reference): 변수의 값을 읽고 변경할 수 있다 (Read & Write)
 

4) static 키워드

  • static이 붙은 메서드는 객체를 생성하지 않고도 클래스 이름으로 호출 가능.
  • 주로 유틸리티 함수나 공통적으로 사용하는 기능을 정의할 때 사용.

 

4. 인스턴스 메서드 vs. 클래스 메서드

유형 선언 방식 호출 방식
인스턴스 메서드 static 없이 선언 객체 생성 -> 객체명.메서드명()
클래스 메서드 static 포함 클래스 이름으로 클래스명.메서드명()

 

1) 인스턴스 메서드

  • 인스턴스 변수와 관련된 작업을 하는 메서드.
  • 인스턴스 변수는 인스턴스를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출 할 수 있다.

2) 클래스 메서드

  • 인스턴스와 관계없는 메서드 (인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드)
  • 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  • 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다. (클래스가 메모리에 올라갈 때 이미 자동으로 생성되므로)
  • 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
  • 주로 유틸리티 함수나 공통적으로 사용하는 기능을 정의할 때 사용.
public class MathUtil {
    public static int square(int x) {
        return x * x;
    }
}

public class Main {
    public static void main(String[] args) {
        int result = MathUtil.square(5);
        System.out.println(result);  // 25 출력
    }
}

 


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

  • 클래스 멤버 -> 인스턴스 멤버 호출
    • 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.
    • 단, 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야한다.
    • 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있기 때문이다.
  • 인스턴스 멤버 -> 인스턴스 멤버 호출
    • 인스턴스 멤버간의 호출에는 아무 문제 없음.
    • 하나의 인스턴스 멤버가 존재한다는 것은 인스턴스가 이미 생성되어 있다는 것을 의미하며, 즉 다른 인스턴스 멤버들도 모두 존재하기 때문이다.