일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java Programming
- 이진법
- 부스트코스
- 삼성청년SW아카데미
- java
- 모두를 위한 컴퓨터 과학
- 객체지향
- Compute Science
- 예외처리
- SSAFY 9기
- w3schools
- 면접을 위한 CS 전공지식 노트
- til
- 관계형 데이터베이스
- CS기초지식
- 기초프로그래밍
- SW
- ssafy
- CS 기초지식
- 모두를 위한 컴퓨터 과학(CS50)
- 상속
- CS50
- ERD
- CS 기초
- Computer Science
- edwith
- 데이터베이스 모델링
- exception
- WebProgramming
- 알고리즘
- Today
- Total
Joslynn의 하루
대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 - 5일차 노트 정리_지역변수와 전역변수, static, OverLoading_220722 본문
대용량 웹서비스를 위한 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 메소드는 제공하고 있지 않음;