[JAVA]변수와 메서드

진섭·2023년 5월 11일
0
post-thumbnail

변수와 메서드

자바의 정석 책과 안드로이드 앱스쿨에서 공부한 내용을 정리한 내용입니다.

 

선언위치에 따른 변수의 종류

자바에서 변수는 선언된 위치에 따라 변수의 종류가 3가지로 나뉜다고 합니다. 첫 번째로 지역변수는 멤버변수를 제외한 나머지 변수이며, 클래스변수는 static이 붙은 변수이며, 인스턴스 변수는 붙지 않는 것이다.

class Tv{
	String color; // 인스턴스 변수
	boolean power; // 인스턴스 변수
	static int channel; //클래스 변수
	
	void method(){
		int in =0;//지역변수
	}
}
  1. 인스턴스 변수는 독립적인 저장공간을 가지며 서로 다른 값을 가질 수 있다.인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 인스턴스 변수로 선언한다.
  2. 클래스변수는 독립적인 저장공간을 갖는 인스턴스변수와 달리 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유하고 있으며 클래스 변수는 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다. .연산자로 클래스이름.클래스변수 이런식으로 사용할 수 있다.
    3.지역변수메서드 내에 선언되어 메서드 내에서만 사용 가능하며 메서드가 종료되면 소멸되어 사용할 수 없다.

 

JVM의 메모리 구조

image

자바의 정석 책에서 나오는 사진을 구글에서 쳐서 가져온 사진이다.
이 사진이 어떤 의미를 가지고 있냐면 응용프로그램이 실행되면. JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역을 나누어 관리를 하게 된다.
크게 3가지 영역으로 나뉘는다. 사진에서 보여지는 대로 Method Area,Call Stack, Heap으로 나뉘게 된다.

  1. Method Area 메서드 영역은 프로그램 실행 중 어떤 클래스가 사용이 되면 JVM은 해당 클래스의 클래스 파일을 읽어서 분석하여 클래스에 대한 정보를 이곳에 저장하게 된다.

  2. Call Stack 메소드의 작업에 필요한 메모리 공간을 제공하며 메소드가 호출이 되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업이 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다.

  3. Heap 인스턴스변수들이 생성되는 공간이다.

 

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

메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 념겨준다.매개변수의 타입이 기본형일 때는 기본형 값이 복사되겠지만,참조형이면 인스턴스의 주소가 복사된다.

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.
  • 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.
class Data{int x;}
public class MainClass {

	public static void main(String[] args) {
		Data d = new Data();
		d.x =10;
		System.out.println("main() : x = "+d.x);
		
		change(d.x);
		System.out.println("After change main() x =" + d.x);
	}

	static void change(int x) {
		x = 1000;
		System.out.println("change() x =" + x);
	}
}
//실행결과
main() : x = 10
change() x =1000
After change main() x =10

이 코드를 실행해 보면 Data의 인스턴스 변수를 만들어 x의 멤버 변수의 값을 10을 넣어줬습니다.그리고 클래스 메서드인 change안에서 x의 값을 1000으로 변경 후 출력을 해 1000이 출력되는 것을 확인을 하였고 인제 change 메서드를 빠져나와 다시 인스턴스 변수 d를 출력을 했는데 값이 바뀌지 않고 10이 출력이 되었습니다.

d.x값이 바뀌지 않는 이유는 change 메서드 안에서만 x의 값이 변경이 되어서 입니다. 쉽게 말해 매개변수에서 d.x값의 복사본을 가져와 변경을 한 셈이다.그런 이유로 change 메서드를 빠져나왔을때 값이 바뀌지 않았습니다.

그럼 어떻게 값을 바꿀수가 있을까? 그 방법은 값이 저장된 주소change 메서드에게 넘겨주면 변경이 가능합니다. 코드를 아래 코드처럼 변경을 하면 값을 바꿀 수 있게 됩니다.

class Data{int x;}
public class MainClass {

	public static void main(String[] args) {
		Data d = new Data();
		d.x =10;
		System.out.println("main() : x = "+d.x);
		
		change(d);
		System.out.println("After change main() x =" + d.x);
	}

	static void change(Data d) {
		d.x = 1000;
		System.out.println("change() x =" + d.x);
	}
}
//실행결과
main() : x = 10
change() x =1000
After change main() x =1000

0개의 댓글