-프로그래밍을 하다 보면, 다양한 변수가 존재한다.
전역 변수, 매개 변수, 인스턴스 변수, 클래스 변수, 멤버 변수 등등 이 변수들이 어떤 것을 정확하게 지칭하는 것인지 혼동이 온다.
혼동이 온다는 건 내가 완벽히 각 변수의 개념을 이해하지 못하고 있다는 반증이라 생각하여, 다시 '변수'라는 것에 대해 되짚어 보고 가려한다.
1. 데이터 타입 (메모리에 저장되는 방식) 에 따른 분류
1) 기본 자료형 (기본형 변수 Primitive variable)
- 프로그래밍 언어에서 미리 만들어 둔 타입(가장 많이 쓰이는 데이터 타입을 쉽게 사용하기 위함)
- 변수에 할당된 메모리에 직접 값이 저장된다.
- 비교적 단순 데이터
- 예) int, double, boolean, char 등
2) 객체 자료형 (참조 변수 )
- 여러 데이터들이 복합적으로 모여있는 데이터
- 변수에 할당된 메모리에 데이터의 ‘레퍼런스’(주소값)가 저장된다.
- 비교적 복합적인 데이터
- 예) String, System, ArrayList 등
- 사용자가 얼마든지 새로운 클래스(데이터 타입)를 만들어 낼 수 있기 때문에 무한하다
public class Main {
public static void main(String[] args) {
// 기본형 변수 예제
int a = 10;
int b = a; // b에 a의 값을 복사
b = 20;
System.out.println("a: " + a); // a는 여전히 10
System.out.println("b: " + b); // b는 20
// 참조형 변수 예제
String str1 = "Hello";
String str2 = str1; // str2가 str1이 참조하는 객체를 참조
str2 = str2 + " World";
System.out.println("str1: " + str1); // str1은 여전히 "Hello"
System.out.println("str2: " + str2); // str2는 "Hello World"
}
}
*기본형 변수는 데이터를 그대로 저장하고,
참조형 변수는 객체의 메모리 주소를 저장한다.
** 대원칙 : JAVA는 항상 변수의 값을 복사해서 대입한다. **
기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을,
참조형이면 변수에 들어있는 참조값을 복사해서 대입한다.
2. 선언 위치에 따른 분류
1) 멤버변수 (필드)
- 클래스 영역에 선언된 변수로, ‘클래스변수, 인스턴스변수’를 통틀어 칭한다.
- 객체가 가지고 있는 속성과 기능을 그 객체의 ‘멤버’라 하는데,
이중 속성은 ‘멤버변수’라고 칭하고, 기능은 ‘메소드’라고 칭함.
1-1) 클래스변수
- 인스턴스 변수 앞에 static 을 붙이기만 하면 된다.
- 인스턴스 변수는 인스턴스마다 고유한 값을 가지지만, 클래스 변수는 모든 인스턴스가 공통된 값을 공유하게 된다.
- 클래스 로딩될 때 생성된다(따라서 메모리에 딱 한 번만 올라간다)
- public을 붙이면 같은 프로그램 내에 어디서든 접근할 수 있는 ‘전역 변수’가 된다.
- 인스턴스 변수의 접근법(new 연산자를 이용하여 인스턴스 생성)과 달리,
인스턴스 생성 없이 ‘클래스이름.변수이름’을 통해 접근 가능.
1-2) 인스턴스 변수
- 클래스 영역에 선언되고 인스턴스 생성 시 만들어진다.
- 따라서 인스턴스 변수의 값을 읽어오거나 저장하려면 인스턴스를 먼저 생성해야 한다. (new 연산자 활용)
- 인스턴스 별로 다른 값을 가질 수 있기 때문에, 각각의 인스턴스마다 고유의 값을 가져야할 때 인스턴스 변수 선언한다.
- 인스턴스 접근법
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; // [설명 1]
t = new Tv(); // [설명 2]
[설명 1] : Tv 클래스 타입의 참조변수 t를 선언
→ 메모리에 참조변수 t를 위한 공간이 마련되었으나, 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무 것도 할 수 없다.
[설명 2] : Tv 인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
→ 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 이때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화된다.
→ 이때, 참조형 변수는 null, 기본형 변수 중 boolean은 false, int는 0으로 초기화된다.
대입연산자(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다. 이제는 참조변수 t를 통해 Tv인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해선 참조변수가 반드시 필요하다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
2) 지역변수
- 메소드 내에 선언되며 메소드 안에서만 사용 가능한 변수
- 메소드 실행 시 생성(메모리 할당)되며, 메소드가 종료되면 사라져서 사용할 수 없게 된다.
- 매개변수
흔히 ‘파라미터’라고 불리며, 메소드에서 입력값을 받을 때 사용되는 변수.
인자(파라미터)값은 호출 시 메소드 입력부의 넣는 값이며 이 값은 매개변수에 복사되어 대입된다.
매개변수도 매소드 내에 선언된 것으로 간주하므로 지역변수이다
'Language > ☕ Java' 카테고리의 다른 글
[Java] 상속 (0) | 2024.08.12 |
---|---|
[Java] 반복문(for) (2) | 2024.08.08 |
[Java] 메모리 구조 & static (2) | 2024.08.07 |
[Java] 접근 제어자 (0) | 2024.08.07 |
자주 나오는 프로그래밍 용어 정리 (클래스, 객체, 메서드, 인스턴스, 생성자.. etc) (0) | 2024.04.25 |