Joslynn의 하루

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 - 5일차 노트 정리_지역변수와 전역변수, static, OverLoading_220722 본문

MSA Full-Stack 개발자 양성과정/Java

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 - 5일차 노트 정리_지역변수와 전역변수, static, OverLoading_220722

Joslynn 2022. 7. 22. 16:16

지역변수와 전역변수

 

1) 지역변수

: method 내부에 선언된 변수

: 선언된 method 내에서만 접근 가능

: 지역변수는 사용전에 반드시 초기화 해야 함

ex) int a =0;

 

2)전역변수

:class 내부에서 선언된 변수

: 모든 method에서 접근 가능

: 지역변수와 전역변수의 이름이 같을 수 있음 = this.변수이름;하면 전역변수를 의미 // 현재 객체 안에 들어있는 전역변수를 호출하는 명령어

: 전역변수 앞에서는 접근 제한자(public, protected, 생략, private) 사용 가능 ↔ 지역변수는 불가능

: 전역변수는 객체가 생성되는 시점에 자동 초기화

   (1) 정수형: 0 / 실수형: 0.0 / char: \u0000 / 논리형: false

   (2) 객체형: String - null

 

예시)

class Test {
	String addr; //전역변수, 초기값: null; 같은 폴더에 있다면 addr에 접근 가능
	public int age; // 전역변수, 초기값: 0; 어디서든 아무데서나 접근 가능
	private int aa; // 같은 클래스 내부에서만 접근 가능 

	public void aa (int i) {//지역변수
		System.out.println("i= " + i);
		String name = "희정";
		System.out.println("name= " + name);

		System.out.println(addr);
		System.out.println(age);
	
	}

	public void bb () {//지역변수
		int i=100; //지역변수는 사용전에 반드시 초기화 필수
		System.out.println("i= " + i);

		// public String addr = "서울"; 지역변수 앞에는 제한자 올 수 없음

		String addr = "서울";
		int age = 45;

		System.out.println("addr= " + addr);
		System.out.println("age= " + age);

		System.out.println("this.addr= " + this.addr); // 지역변수와 이름이 같을 경우, 반드시 this.을 붙여야 함
		System.out.println("this.age= " + this.age); // this. 붙이면 무조건 전역변수
	}

}

class VariableScopeExam {
	public static void main (String [] args) {
		System.out.println(); // 다른 메소드에서 선언된 변수는 사용 불가능

		Test t= new Test();
		t.aa(4); // 객체가 생성되는 시점에 맴버필드가 자동 초기화된다.
		t.bb();
		System.out.print(t.addr); // t안에 있는 addr 맴버필드에 접근 가능
		//System.out.print(t.aa); private으로 접근 제한
		
	}
}

static

1) class

class 앞에는 올 수 없음 (단 inner class에는 사용 가능)

2) variable

전역변수 앞에만 사용 가능 

객체생성없이 외부에서 class이름.변수이름 호출 가능

static변수는 같은 class들이 공유하는 공유 변수

3) Method

: 객체생성없이 class이름.method이름(); 호출 가능

: static method는 static method끼리만 어울림; 일반 method 호출 안됨; static method는 static method만 호출 가능

: static method안에서 this 키워드 사용 불가; non-static method안에서는 사용 가능

: 같은 class 내에 static method 호출 - method이름(); 

 

main method 전에 메모리 static 공간이 자동으로 만들어짐; 딱 한 공간에서 이루어짐;  - 싱글톤 패턴 작업 시 유리

main메소드가 종료되어야만 가비지 콜렉션이 이뤄짐; 

 

class Test{
	int i = 5;
	static int j=10;

	public void aa(){ // non-static 영역에서는 static, non-static 모두 접근 가능하다.
		System.out.println(i);
		System.out.println(this.i);

		System.out.println(j);
		System.out.println(this.j);
		
		System.out.println(Test.j); // 권장하는 방식

//--------------------------------------------------------------------------

		bb();
		this.bb();
		dd();
		this.dd();
		Test.dd(); // 권장


	}
	public void bb(){
	
	}
	
	public static void cc(){ // static메소드 내에서 static만 접근 가능, this 키워드 사용 불가

		//System.out.println(i);
		//System.out.println(this.i);

		System.out.println(j);
		//System.out.println(this.j);
		
		System.out.println(Test.j);

//--------------------------------------------------------------------------

		//bb();
		//this.bb();
		dd();
		//this.dd();
		Test.dd(); // 권장
	}

	public static void dd(){
	
	}

}
/**
static 영역 내에 저장
Test.j;
Test.cc;
Test.dd;

*/

class StaticExam {
	public static void main(String [] args) {
	}
}

/**필기
<non static은 접근 가능 but static은 접근 불가능한 이유>

Test.cc();는 static 영역에 저장 == cc 호출 시 static 영역에서 호출;
Test라는 객체가 생성됐는지 모름;
Test 객체 안에 있는 non-static 및 this사용 불가 ;

non static이 일하려면 Test 객체가 생성되어야 함;
static 변수 및 메소드는 static 영역에서 참조해서 사용
static도 non-static도 사용 가능

*/

/**필기

< 공유 변수 >

Test t1 = new Test();

Test t2 = new Test();

Test t3 = new Test();

t1, t2, t3의 주소는 모두 다름 (ex) 주소가 다른 똑같은 모양의 집 3채

 

ex) non-static

t1.i = 50;

t1의 i값만 변경

 

ex) static

t1.j = 50

: t1, t2, t3의 j값이 모두 변경

: because, static 영역 내의 j 값이 변경 및 이 값을 모두 공유

 

 

인스턴스화: 객체별 다른 값 가질 수 있음 (클래스의 현재 생성된 오브젝트)

공유변수: 객체가 아무리 많이 생성되어도, 한 가지 값을 가짐

 

4) statoc 블록

static{
	기능 구현;
}

: class 내부에 선언되어 main method보다도 먼저 실행된다. (main보다 먼저 해야할 일이 있을 때,)

: 호출하지 않아도 실행됨

: method, 생성자 등의 영역 안에서는 선언될 수 없다. 

: main 시작 전 환경 세팅, 데이터를 초기화 및 로딩, DB 세팅, 점검해야 하는 작업들을 static 블럭에서 많이 한다.

 

class StaticInitExam{
	public static void main(String [] args) {
	
		System.out.println("메인 시작합니다....");
	}

//환경 세팅, 데이터를 초기화 및 로딩, DB 세팅, 점검해야 하는 작업들을 static 블럭에서 많이 한다.
	static{
		//기능작성
		System.out.println("메인보다 먼저 실행됩니다....");
	}

}

// 실행값: 메인보다 먼저 실행됩니다.... 선출력

OverLoading

: 이름은 같은데 인수가 다른 method

:하나의 class 내부에 동일한 이름의 method가 여러 개 있는 것;

: method 이름은 무조건 같되, 인수가 무조건 달라야 함; (인수의 순서 or Type or 개수 (셋 중 하나))가 달라야 한다.

: 하나의 method 이름을 가지고 기능을 다르게 구현하는 것 ==> method를 호출하는 사용자 편의를 위해

class Test{
	public void aa(){ //1번
    }
    
    int aa(int i){ //2번
    return 4;
    }
    
    public void aa(String s, int i){ //3번
    }
}

/**
        t.aa(); //1번호출
        t.aa("A", 4) //3번 호출
        t.aa(4) //2번 호출
*/

대표적인 OverLoading

1) 출력 

System.out.println(); //인수 없는

System.out.println(5); // int형

System.out.println(4.3); // double형

System.out.println("안녕"); // String

System.out.println(true); // boolean형



? System.out.println(5, 10, 3.4); // 인수 3개 받는 메소드가 필요; 개발자가 인수의 개수를 예상하기 어려움;

// Systme.out.println(5+ "," +10+ ","+ 3.4); //인수를 1개짜리로 만듦;



public void bb(Object ... i){  } // variable arguments

System.out.println();

//System.out.println();

class System{

          public static PrintStream out;

}


class PrintStream{

    println(){  }

    println(int i){  }

    ....

}

System.out.print (); // 불가

인수 없는 print 메소드는 제공하고 있지 않음;

 

 

Comments