변수와 메서드
2025. 2. 20. 16:15ㆍJava/객체지향
변수
변수 유형 |
선언 위치 | 메모리 영역 | 기본값 | 특징 | |
지역 변수 |
메서드 내부 | 스택 (Stack) |
X | 메서드 호출시 생성 메서드 종료시 소멸 |
|
멤버 변수 | 인스턴스 변수 | 클래스 내부 (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 출력
}
}
클래스 멤버와 인스턴스 멤버간의 참조와 호출
- 클래스 멤버 -> 인스턴스 멤버 호출
- 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.
- 단, 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야한다.
- 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있기 때문이다.
- 인스턴스 멤버 -> 인스턴스 멤버 호출
- 인스턴스 멤버간의 호출에는 아무 문제 없음.
- 하나의 인스턴스 멤버가 존재한다는 것은 인스턴스가 이미 생성되어 있다는 것을 의미하며, 즉 다른 인스턴스 멤버들도 모두 존재하기 때문이다.