오늘은 접근지정자의 두번째로 멤버 변수와 지역변수에 대해 복습하려고 합니다
《멤버 변수》
클래스안에 선언된 변수로 해당 클래스 안의 모든 메소드에서 사용 가능합니다
멤버변수는 초기화를 하지 않고 사용해도 해당 자료형의 기본값으로 초기화 됩니다.
ex)int:0,double:0.0 참조형:null, boolean:false로 등
멤버변수는 크게 정적멤버 변수와 인스턴스형 멤버변수로 나누어집니다.
또한 멤버 메소드도 정적 메소드와 인스턴스형 메소드로 나누어집니다
멤버 변수나 멤버 메소드 앞에는 static이라는 modifier가 붙으면 정적 멤버
즉, 정적 멤버 변수이거나 정적 메소드이다.
※정적 멤버(상수, 변수 혹은 메소드)의 메모르는 JVM에서 클래스를 로드할 시점에 생기고
인스턴스형 멤버는 JVM에서 인터프리터 할때 메모리가 생성됩니다.
즉, new연산자로 인스턴스화 할때 생깁니다
《지역 변수(Local Variable)》
특정 지역 안에서 선언되어 그 지역에서만 사용되는 변수
그 지역을 벗어나면 그 변수는 메모리에서 사라집니다.
메소드 안에서 선언된 변수 혹은 Block(if문,while문,for문,try문등) {}
안에서 선언된 변수를 지역변수라 하고 또한 매개변수도 마찬가지로 지역변수입니다.
지역변수는 선언된 곳을 벗어나면 메모리가 해제되고 사용시 반드시 초기화를 하고
사용해야 합니다.
즉, 지역변수는 자동으로 초기화가 안됩니다.
※ 지역변수앞에는 modifier중(final/abstract/static) final만 붙일 수 있습니다.
abstract는 클래스와 메소드앞에만 붙일 수 있습니다.
static는 붙일 수 없으며 또한 지역변수 앞에는 접근지정자를 붙일 수 없습니다.
《접근지정자의 멤버변수 예제》
public class GlobalNLocalVar {
//[멤버 변수]
private int mNoInit;
int mInit=100;//선언과 동시에 초기화.100으로
int[] mArray = new int[3];//선언과 동시에 메모리 할당(주소로 초기화)
//[멤버 메소드]
int getTotal(int start,int end) {
int sum;//지역변수는 자동으로 초기화 안됨.
//System.out.println(sum);//[x]
sum=0;
//지역변수 i는 for문 안에서만 사용가능
//지역변수 sum,start,end는 getTotal메소드 안에서는 어디든 사용가능.
for(int i=start;i <=end;i++) sum+=i;
//System.out.println("for문이 끝난 후 i:"+i);//[x]
if(sum % 2==0) {
String strResult;
//System.out.println(strResult);//[x]초기화 안해서
strResult="총합은 짝수";
System.out.println(strResult);//[o]
}
else {
//strResult는 if블락 안에서만 사용 가능
//strResult="총합은 홀수";//[x]
String strResult="총합은 홀수";
System.out.println(strResult);//[o]
}
{
int block=100;
System.out.println(block);
}
//System.out.println(block);//[x]block도 지역 변수
System.out.println("멤버변수(mNoInit):"+mNoInit);
return sum;
}/////getTotal
public static void main(String[] args) {
//GlobalNLocalVar클래스 인스턴스화/객체화/메모리 생성]
GlobalNLocalVar gnv = new GlobalNLocalVar();
System.out.println("멤버변수(mNoInit):"+gnv.mNoInit);
System.out.println("멤버변수(mInit):"+gnv.mInit);
System.out.println("멤버변수(mArray):"+gnv.mArray);
//[x]지역변수 앞에는 접근 지정자 붙일수 없다
//public int num;//[x]
System.out.println("[클래스의 멤버인 배열]");
for(int i=0; i < gnv.mArray.length;i++) System.out.printf("%d번방:%d%n",i,gnv.mArray[i]);
int[] lArray = new int[3];//로컬 배열
System.out.println("[지역에서 선언한 배열]");
for(int i=0; i < lArray.length;i++) System.out.printf("%d번방:%d%n",i,lArray[i]);
}////main
}///////class
※배열은 지역에서 선언된 배열이든 클래스의 멤버로 선언된 배열이든
해당 자료형으로 초기화 됩니다.
《지정자의 멤버변수 예제》
//static class StaticClass{}//[x]
//※static지정자는 클래스의 멤버(변수,상수,메소드등)에 붙인다]
class MyStatic{
//[멤버 변수]
/*
인스턴스형 멤버변수-반드시 클래스(MyStatic)를 인스턴스화(객체화,heap영역에 메모리 생성)
하여 인스턴스 변수로 접근
*/
int instanceVar;//인스턴스형 멤버변수]
/*
* 정적 멤버변수:인스턴스화(new) 할 필요 없이
* 클래스명으로 접근
* 왜냐하면 JVM에서 클래스를 로드할때
* 메모리가 이미 생성됨으로
*/
static int staticVar;//정적 멤버 변수]
//[멤버 메소드]
void instanceMethod() {//인스턴스형 메소드]
//인스턴스형 메소드 안에서는
//모든 멤버(인스턴스형 혹은 정적 멤버)를
//사용할 수 있다.
System.out.println(instanceVar);//[o]
System.out.println(staticVar);//[o]
}
static void staticMethod() {//정적 메소드]
//정적 메소드 안에서는
//인스턴스형 멤버(변수,메소드등)를
//사용할 수 없다.
//System.out.println(instanceVar);//[x]
System.out.println(staticVar);//[o]
}
}/////MyStatic
public class StaticModifier {
//인스턴스형 멤버]
int instanceVar;
void instanceMethod() {}
//정적 멤버]
static int staticVar;
static void staticMethod() {}
public static void main(String[] args) {
//MyStatic클래스의 정적 멤버 접근]-클래스명.정적 멤버
System.out.println(MyStatic.staticVar);
MyStatic.staticMethod();
//MyStatic클래스의 인스턴스형 멤버 접근]-인스턴스변수.인스턴스형 멤버
MyStatic ms1 = new MyStatic();
System.out.println(ms1.instanceVar);
ms1.instanceMethod();
//아래처럼 정적 맴버도 인스턴스 변수로
//접근 가능하나,인스턴스 멤버로 착각 할 수
//있기때문에 아래처럼 접근하지은 않는다.
System.out.println(ms1.staticVar);
MyStatic ms2 = new MyStatic();
/*
※정적 멤버는 인스턴스화된 객체마다 갖고 있는 멤버가 아니라
하나만 생성되서 모든 객체가 공유한다.
그래서 공통으로 사용하는 변수나 메소드에 주로 static을 붙인다.
※메소드는 멤버변수에 있는 데이타가 아닌 매개변수에 전달된
데이타로만 일을 처리하는 메소드에는 static을 붙이자
*/
//StaticModifier의 정적멤버:클래스명.멤버로 접근하나 자기 클래스 안에서
//접근하기 때문에 클래스명 보통 생략
System.out.println(staticVar);
staticMethod();
//StaticModifier의 인스턴스형 멤버:인스턴스화 후 접근
StaticModifier sm = new StaticModifier();
System.out.println(sm.instanceVar);
sm.instanceMethod();
}/////main
}////class
'IT의 다이어리 > JAVA' 카테고리의 다른 글
Java의 접근지정자1 (AccessModifier) (1) | 2024.12.27 |
---|---|
Java의 추상화(abstraction) (2) | 2024.12.26 |
Java의 메소드(Method) (0) | 2024.12.23 |
Java의 2차원 배열 (0) | 2024.11.27 |
Java의 1차원 배열 (0) | 2024.11.25 |