TIL#11-1

DuBu·2023년 6월 22일
0

일본IT JAVA 연수과정

목록 보기
17/61
post-thumbnail

static

클래스 변수

  • static 변수 = 공유 변수 = class 변수 = 정적 변수
  • 함수와 변수에만 사용된다.
  • static = 먼저(new 객체 생성보다 먼저) method area에 한번만 올려 공유
  • Class 변수의 접근 방법
    • class 내부에서 이름을 통한 접근
    • 외부에서 instance 객체의 이름을 통한 접근
    • 외부에서 class 이름을 통한 접근
class InstCnt {
	static int instNum = 0; 
	// class 변수의 접근 방법 
	
	InstCnt(){
		instNum++; // class 내부에서 이름을 통한 접근
		System.out.println("create an instance: " + instNum);
	}
}

public class CircleMain {

	public static void main(String[] args) {
		InstCnt cnt1 = new InstCnt(); // Class 선언할 때 class 내부의 변수와 함수를 읽어들일 때 static이 있는지 확인한다.
		InstCnt cnt2 = new InstCnt();
		InstCnt cnt3 = new InstCnt();
		
		cnt1.instNum++; // 외부에서 instance 객체의 이름을 통한 접근 -> 비추천 방법
		InstCnt.instNum++; // 외부에서 클래스의 이름을 통한 접근
		
		
	}

}

클래스 변수의 초기화 시점과 초기화 방법

  • 클래스 변수 활용의 예
    • 인스턴스 별로 가지고 있을 필요가 없는 변수
      • 값의 참조가 목적인 변수
      • 값의 공유가 목적인 변수
    • 활용 예시) main method, System.out.println(), Math.PI
    • 그리고 값이 외부에서도 참조하는 값이라면 public으로 선언한다. 메모리 절감 효과

Instance 변수 또는 함수가 static 함수에 못들어가는 이유

  • 메모리에 올라가는 순서가 다르기 때문에 없는 값을 참조할 수가 없다.
class NumberPrinter {
	private int myNum = 0;
	
	static void showInt(int n) {
		myNum = 10; // static이 먼저 method area에 올라가 있기 때문에 myNum을 인식할 수 가 없다. myNum은 객체 생성을 해야지만 메모리에 할당 되기 때문
		System.out.println(n);
	}
	
	static void showDouble(double n) {
		System.out.println(n);
	}
	
	void setMyNumber(int n) {
		myNum = n;
	}
	void showMyNumber() {
		showInt(myNum);
	}
}
  • 주의해서 사용해야 한다.

클래스 메소드

  • 단순 기능 제공이 목적인 메소드들, 인스턴스 변수와 관련 지을 이유가 없는 메소드들은 static으로 선언하는 것이 옳다. => 인스턴스 변수를 사용할 필요가 없을 때

Main method

public static void main(String[] arg){
	//Main method
}
  • 주체가 JVM
  • 다른 패키지에서도 호출할 수 있도록 public 선언
  • 다른 메소드를 호출해서 실행시켜야 하기 때문에 static으로 선언

Method Overloading

  • 호출된 메소드를 찾을 때 참조하게 되는 두 가지 정보
    • 메소드의 이름
    • 메소드의 매개변수 정보
      따라서 이 둘 중 하나의 형태가 다른 메소드를 정의하는 것이 가능하다.
  • 같은 이름의 함수를 사용하는 것
  • 대표적인 함수는 System.out.println();
//Method overloading = 같은 함수 이름을 사용할 수 있다. (매개 변수의 데이터 타입 또는 갯수 다르다면)
class A{
	public void a() {
		System.out.println("method a");
	}
	public void a(int a) {
		System.out.println("method a "+a);
	}
	public void a(double a) {
		System.out.println("method a double "+a);
	}
	public void a(int a, int b) {
		System.out.println("method a "+(a+b));
	}	
}

0개의 댓글