Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

구마찌의 이진수 여행기

[Java]인스턴스변수, 클래스변수, 멤버변수 본문

JAVA/Java

[Java]인스턴스변수, 클래스변수, 멤버변수

구마찌 2018. 10. 3. 23:32

1. 변수


 변수는 간단하게 '변할 수 있는 수'라고 정의를 내렸다. 휘발성이 있는 변수도 있고, 메모리에 할당 됐을 때 부터

프로그램이 끝날 때까지 지워지지 않는 변수도 있다.



2. 인스턴스변수


 java의 객체지향 안에서 인스턴스란 객체를 의미하기도 한다. 

객체 생성이 가능하기 때문에 각 객체마다 다른 값 할당 가능하다.

public class Test { String name; int age; String address; public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); Test t3 = new Test(); t1.name = "최혜지"; t1.age = 20; t1.address = "서울"; System.out.println("T1의 이름 : " + t1.name + ", 나이 : " + t1.age + ", 사는 곳 : " + t1.address); t2.name = "양채원"; t2.age = 21; t2.address = "인천"; System.out.println("T2의 이름 : " + t2.name + ", 나이 : " + t2.age + ", 사는 곳 : " + t2.address); t3.name = "김대원"; t3.age = 27; t3.address = "부산"; System.out.println("T3의 이름 : " + t3.name + ", 나이 : " + t3.age + ", 사는 곳 : " + t3.address); } }


 예제를 만들어 보았다. t1,t2,t3의 객체를 만들어서, 그 객체가 인스턴스 변수에 참조하게끔 했다.



> 작성한 예제에 대한 결과



> 인스턴스에 대한 이해를 돕기위한 참고 자료


 위 그림과 같이 각각의 객체들은 분리된 저장공간을 가지고 있다.


> 코드

Test t1 = new Test(); 

-> Test형 t1이라는 변수가 생성되었다. -> Test()라는 생성자가 새로 만들어졌다. ( 새로운 값 삽입 가능 )

-> Test()라는 기본 생성자는 변수가 새로 생성될 때마다 new 키워드에 의해 동적할당을 새로 받기 때문에

변수가 새로 만들어질 때마다 새로운 객체가 생성된다. -> 생성된 참조형변수는 인스턴스가 생성 되었을 때 생성된다.

Test t1; t1 = new Test(); 와 동일하다.


 인스턴스변수의 특징은 인스턴스를 생성했을 때만 참조가능하다는 것이다.


> 직접 참조 불가능 Error.


 위 사진과 같이 인스턴스 변수를 직접 참조 하게되면 static으로 바꾸게 된다.

이러한 에러가 나는 이유는 메소드 외부에 있는 변수는 클래스 변수가 아니면 직접 참조를 못하기 때문에

클래스 변수로 바꾸어야 한다. 클래스 변수의 특징은 조금 있다가 작성할 것이다.



3. 클래스 변수

 객체를 생성할 때마다 다른 저장공간이 생기는 인스턴스 변수와는 달리, 

클래스 변수는 "공통된 하나"의 저장공간만을 가진다. 

여기서 말하는 클래스 변수는 키워드 static이 붙은 모든 종류의 변수를 말하고

공통된 저장 공간이라는 것은 클래스가 메모리에 올라가고 나서 프로그램이 종료될 때까지 유효성이 있는 공간이다.


public class staticTest { static int height; String name; int age; String address; public static void main(String[] args) { staticTest t1 = new staticTest(); t1.name = "김대원"; t1.age = 27; t1.address = "부산"; t1.height = 165; System.out.println("T1의 정보"); System.out.println("이름 : " + t1.name + ", 나이 : " + t1.age); System.out.print(", 사는 곳 : " + t1.address + ", 키 : " + height + "\n"); height = 176; System.out.println("변경된 키 : " + t1.height); } }



> 예제 결과


 위의 예제와 같이, 클래스 변수는 (1)객체 생성한 뒤 접근, (2)직접 접근의 두가지 방법이 있다.

코드의 마지막에 보면, height 값을 165에서 176으로 바꾸어 주었는데, 생성된 객체로 

간접 접근에 의해 바꿔주지 않고, 변수 직접 접근으로 간단하게 바꿔줄 수 있다는 장점이 있다.


> 클래스변수 접근에 대한 이해를 돕기 위한 자료



4. 지역 변수

 클래스 영역(클래스 안, 메소드 밖)이외의 영역에 선언된 모든 변수들을 칭한다.

 = 지역변수라고 함은 메소드, 생성자 그리고 초기화 블럭 안에서 선언된 변수들을 칭한다.

변수 선언이 되면 동적할당 및 메모리에 올라가는 클래스 영역의 변수들과는 달리

JVM 메모리 구조의 stack 영역에 쌓이게 되고, 해당 블럭이 끝나게 되면 휘발한다.

따라서, 지역 변수의 이용은 사용 범위가 좁으면 유용하다.


public class memberTest { static void printName() { // 자바에서는 지역 변수를 굳이 초기화 안해도 JVM에서 알아서 초기화 시켜줌 // 하지만 초기화 하는 습관을 기르자 String name = ""; name = "최혜지"; System.out.println(name); } public static void main(String[] args) { printName(); } }


> 소스 결과 화면


 위 코드에서 인스턴스를 생성하지 않기 위해서 메소드를 static으로 선언 해주었다.


> 멤버변수 접근 Error.


 main함수(printName()메소드와 다른 영역)에서 printName() 메소드 안에 있는 name을 호출하려고 하니

name cannot be resolved to a variable 이라는 에러가 뜬다.

이 에러는 변수에 대한 선언이 없을 때 생긴다. 

이 에러를 통해 지역변수는 다른 범위에서 호출하려고 하면 휘발되어 없어졌다는 것을 알 수 있다.



5. 정리

 인스턴스 변수, 클래스 변수 등의 멤버 변수와, 사용 범위가 아주 좁은 지역 변수에 대해 이제 정리를 해보았다.

사실 접근에 대해서 많이 알아보지 않았기 때문에 코드를 짤 때에도 많은 제약사항이 있었다.

변수의 접근을 마음대로 해버린다던지, 에러가 뜸에도 불구하고 왜 뜨는지 모르는 상황도 있었다.

이 기회를 이용해서 객체와 메소드를 연결하여 공부하고싶다.



'JAVA > Java' 카테고리의 다른 글

제어문의 모든 것 ( For문, While문)  (0) 2018.08.15
제어문의 모든 것 ( If문과 Switch-case 문 )  (0) 2018.08.15
기초 교재 및 진행 방향  (2) 2018.08.14
Comments