⚙️ Backend/JAVA

JAVA(자바) - 인스턴스 변수와 클래스 멤버 변수

코너(Corner) 2020. 11. 13.
반응형

인스턴스 변수와 클래스 멤버 변수

 

 


스태틱 멤버 변수 static -> 빌드 단계 중에서 로더 단계에서 올려준다.(메소드 영역)
인스턴스 변수  -> 클래스에 있는 객체를 생성하면서 쓰는 변수 (객체화, 인스턴스화를 할 때 사용)

ex)

화면이 바뀌어도 내 스코어 점수가 유지 되려면, 공통의 변수를 써야하기 때문에 static을 쓰는 것이 이롭다.
== 정적이다. 정적 필드, 정적 메소드 등등

임시적으로 교환하고 사용해야하는 느낌이면, Heap 메모리에 쓰는 변수를 사용하는 것이 좋다.
== 동적이다.


인스턴스 변수 : 인스턴스 변수는 클래스에 선언 된 변수를 말한다.
일반적으로 [자료형 변수명;] 으로 선언하고 사용할 수 있다.
인스턴스 변수는 Heap Memory에 올라간다.

인스턴스 변수는 class에서 일반적인 변수 선언 방식을 하고 Main Method안에서
인스턴스화(==객체화)를 하여 객체 변수를 통해 인스턴스 변수를 사용할 수 있다.

 스태틱 멤버 변수 : [static 자료형 변수명]으로 선언하고 사용한다.
Heap Memory에 바로 올라가지 않고 컴파일하면서 Build 단계 중에서 Loader 단계에서 메소드 영역 메모리를 사용을 하기 때문에 Static 변수는 Main Method안에 선언을 하게 되면 에러가 날 뿐더러, 컴파일 자체가 되지 않을 것이다.


static 변수는 공통적으로 사용한다는 의미를 두고 있으며, 
static 변수는 메소드에 올라간다. Main Method 안에서 선언할 수 없으며,
Class안에 static 변수를 선언하고 나야 Main에서 사용할 수 있다.

static 메소드는 static 변수를 가지고 있어야만 사용할 수 있으며, 인스턴스 변수를 쓸 수 없다.
(즉, static 메소드에서는 instance 변수는 물론, instance method안에 인스턴스 변수가 사용되고 있다면 당연하게도 호출 할 수 없다.)

<->

반대로 인스턴스 메소드에서는 인스턴스 변수와 static 변수를 사용 할 수 있다.
(즉, 인스턴스 메소드에서는 static 메소드를 호출하여 사용 가능)


static void main 에서 인스턴스, 클래스 멤버 변수를 사용하려면

인스턴스는 인스턴스화(=객체화)를 하고 
클래스명 변수명 = new 클래스명();

메소드 호출은 객체변수명.메소드명(=함수명)();
객체변수명.인스턴스변수명; 이런 식으로 사용하며 

static 메소드는 클래스명.메소드명();
클래스명.static변수명 = 값;
지정을 통해 사용한다.

차이점은 객체명을 쓰는 인스턴스 메소드 및 클래스,변수, 
클래스명을 쓰는 static 메소드,클래스,변수 인 것이다.


아래 코드를 보고 실습 예제를 풀어보자. 아래 코드의 오류들이 나지 않도록 수정 해보고

맨 하단 소스코드의 정답을 확인해볼 것.

public class StaticInstanceEx {
	
	public static void main(String[] args) {
		static int publicVar = 100;
		
		Student.kor = 100;
		Student.eng = 80;
		
		Student.total(); 
		
		
		Student s = new Student("이경희","음악과");
		 
		System.out.println(s.name);
		System.out.println(s.dept);

		
	}
	
	static void sum() {
		System.out.println(publicVar);
	}
	static void rank() {
		publicVar++;
	}
}

 


 


소스 코드

package Instance_Variable;

public class Instance_Demo2 {

	public static void main(String[] args) {
		
		// 인스턴스 변수 2개
		String nameMain;
		int ageMain;
		
		/*
		 * Main안에 클래스 변수를 선언할 경우 에러 발생 
		 * 하나의 메소드 안에 인스턴스 변수는 힙 메모리에 올라가고 static 변수는 메소드에
		 * 올라가기 때문에 실행 위치가 달라 에러 발생한다. 
		 * 값을 지정하거나, Main 메소드 위 클래스에 지정해야 한다. 
		 * legal modifier for parameter; only final is permitted.
		static String telMain;
		static int deptMain; 
		 */
		// 클래스의 클레스 멤버(static)를 사용하려면 
		Instance_Demo.tel = "21428025"; 
		Instance_Demo.dept = "정보통신보안";
		// class명.멤버변수 = 값;
		System.out.println(Instance_Demo.tel+", "+Instance_Demo.dept);
		
		// 클래스의 인스턴스 멤버를 사용하기. , 참조변수
		Instance_Demo demo = new Instance_Demo(); // Heap 메모리에 올라간 것이다.
		// 객체화, 인스턴스화 ---> Heap 메모리에 올라감
		// 즉, 인스턴스 변수는 객체화 하게 되면 Heap메모리에 올라가야 쓸 수 있는 것이다.
		demo.name = "corner";
		demo.age = 26;
		demo.tel = "01073501234"; 
		// 원래는 안되는 것인데 버전이 올라가면서 편의적으로 정상적인 출력이 가능하다.
		demo.dept = "수원"; 
		
		demo.outputSt();
		
		// 클레스 메소드 사용하기
		Instance_Demo.outputSt(); // 클래스 메소드
		// 클래스를 통해서 바로 접근! 노빠꾸 직진 메소드
		
		
		// 인스턴스 메소드 사용하기 , 힙 메모리에 있는 것, 참조 변수를 만들고 접근 
		demo.output();
		
	}

}

 

package Instance_Variable;
/*
클래스 멤버 변수 static -> 빌드 단계에서 로더 단계에서 올려준다.(메소드 영역)
인스턴스 변수  -> 클래스에 있는 객체를 생성하면서 쓰는 변수 (객체화, 인스턴스화 한다고도 한다.)

ex)

화면이 바뀌어도 내 스코어 점수가 유지 되려면, 공통의 변수를 써야하기 때문에 static을 쓰는 것이 이롭다.
== 정적이다. 정적 필드, 정적 메소드 등등

임시적으로 교환하고 사용해야하는 느낌이면, Heap 메모리에 쓰는 변수를 사용하는 것이 좋다.
== 동적이다.

*/
public class Instance_Demo {
	// 인스턴스 변수 2개 선언
	String name;
	int age;
	
	// class 변수 2개 선언,
	static String tel;
	static String dept;
	
	// 메소드
	
	//인스턴스 메소드
//	인스턴스 메소드 안에 넣을 수 있는 멤버들은 클래스 멤버와 인스턴스 멤버를 다 넣을 수 있다.
	void output() {
		name = "corner";
		age = 26;
		tel = "112";
		dept = "정보통신보안";
		
		System.out.println("Method of Instance");
		System.out.println("이름 : "+name+"\n나이 : "+age+"세\n번호 : 82-"+tel+"\n지역 : "+dept);
		outputSt();  // 인스턴스 메소드는 static(클래스 멤버 변수)도 호출 할 수 있기 때문에 사용 가능
		
	}
	
	
	// 클래스 메소드 static
//	클래스 메소드 안에 넣을 수 있는 것은 static으로 된 변수만 넣을 수 있다.

	static void outputSt() {
//		name = "corner";
//		age = 26; 
		// don't use , 빌드단계 즉, 로더 단계에서 집어 넣을 공간이 없기 때문에 에러 발생
//		클래스 변수는 인스턴스 변수보다 뒤로 들어갈 수 없다.
		
		tel = "112";
		dept = "정보통신보안";
		
		System.out.println("Method of Class Member");
		System.out.println("번호 : 82-"+tel+"\n지역 : "+dept);
//		output(); //output 메소드에는 인스턴스 변수가 들어가기 때문에 호출 불가능!
	}

}

 

 

실습 예제의 코드

package 멤버_인스턴스_변수_예제;

class Student {
	String name;
	String dept;
	static int kor;
	static int eng;
	Student (String name, String dept){
		this.name=name; this.dept=dept;
	}
	
	static void total() {
		System.out.println("총 합 :"+(kor+eng));
	}
	
}
public class StaticInstanceEx {
	
	static int publicVar; // 지역변수 
	
	public static void main(String[] args) {
		 publicVar = 100; // 지역변수를 만들어야 사용할 수 있다.
		
		Student.kor = 100; // 클래스명.변수 기 때문에 static
		Student.eng = 80;
		
		Student.total(); // 얘도 static 함수
		
		
		Student s = new Student("이경희","음악과");
		// 객체화 한거기 때문에 인스턴스화, 인스턴스 변수 
		// 생성자가 필요 
		System.out.println(s.name);
		System.out.println(s.dept);

		
	}
	
	static void sum() {
		System.out.println(publicVar);
	}
	static void rank() {
		publicVar++;
	}
}

 

반응형

'⚙️ Backend > JAVA' 카테고리의 다른 글

Java.time Package  (0) 2020.12.03
JAVA - Clone에 관하여..  (0) 2020.11.30
return **; 이란 무엇인가.  (0) 2020.11.11
JAVA(자바) - 매개변수 / 생성자  (0) 2020.11.11
JAVA(자바) - 상속(Inheritance)  (0) 2020.11.09

댓글