JAVA(자바) - 인스턴스 변수와 클래스 멤버 변수
인스턴스 변수와 클래스 멤버 변수
스태틱 멤버 변수 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 |
댓글