Java/Basic

[Java_Basic]클래스 변수와 클래스 메소드(윤성우의 열혈 Java 프로그래밍)

bangle0621 2021. 1. 2. 04:01

static 변수 (클래스 변수)

선언된 클래스의 모든 인스턴스가 공유한다.

class InstCnt{
	static int instNum = 0;	//클래스 변수

	InstCnt(){ 	//생성자
		instNum++; 	//static 으로 선언된 변수의 값 증가
		System.out.println("인스턴스 생성: " + instNum);
	}
}

class ClassVar{
	public static void main(String[] args){
		InstCnt cnt1 = new InstCnt();
		InstCnt cnt2 = new InstCnt();
		InstCnt cnt3 = new InstCnt();
	}
}

결과 

static 선언된 변수 instNum 을 모두 공유하고 있음을 알 수가 있다.

 

클래스 변수의 접근 방법

class AccessWay{
	static int num = 0;

	AccessWay(){
		incrCnt();
	}
	void incrCnt(){
		num++;
	}
}

class ClassVarAccess{
	public static void main(String[] args){
		AccessWay way = new AccessWay();
		way.num++;	//외부에서 인스턴스의 이름을 통한 접근
		AccessWay.num++;	//이처럼 클래스 이름을 통한 접근이 클래수 변수라는 것을 알려주기 좋다
		System.out.println("num = " + AccessWay.num);
	}
}

클래스 내부 접근 : 변수의 이름을 통해 직접 접근

클래스 외부 접근 : 클래스 또는 인스턴스의 이름을 통해 접근

클래스 변수 num 은 defaulf로 선언되어있기에 동일한 패키지에서는 접근이 가능하다.

 

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

class InstCnt{
	static int instNum = 100;	//클래스 변수의 정상적인 초기화 방법

	InstCnt(){
		instNum++; 	//이곳에서 초기화 하게 되면 해당 부분이 불릴때마다 초기화하게 된다
		System.out.println("인스턴스 생성: " + instNum);
	}
}

class OnlyClassNoInstance{
	public static void main(String[] args){
		InstCnt.instNum -= 15;
		System.out.println(InstCnt.instNum);
	}
}

 

클래스 변수를 사용할 때

인스턴스 간에 데이터 공유가 필요한 상황에서 클래스 변수를 선언한다.

참조를 목적으로만 존재하는 값은 final 선언이 된 클래스 변수에 담는다.

외부에서 참조해도 되는 경우는 public 으로 선언해도 괜찮다.

class Circle{
	static final double PI = 3.1415;	//변하지 않는, 참조가 목적인 값
	private double radius;

	Circle(double rad){
		radius = rad;
	}
	void showPerimeter(){
		double peri = (radius * 2) * PI;
		System.out.println("둘레 : " + peri);
	}
	void showArea(){
		double area = (radius * radius) * PI;
		System.out.println("넓이 : " + area);
	}
}

class CircleConPI{
	public static void main(String[] args){
		Circle c = new Circle(1.2);
		c.showPerimeter();
		c.showArea();
	}
}

 

클래스 메소드의(static 메소드) 정의와 호출

인스턴스 생성 이전부터 접근이 가능하다. 

어느 인스턴스에도 속하지 않는다.

class NumberPrinter{
	private int myNum = 0;
	static void showInt(int n){	//클래스 메소드 (static 메소드)
		System.out.println(n);
	}
	static void showDouble(double n){	//클래스 메소드
		System.out.println(n);
	}

	void setMyNumber(int n){		//인스턴스 메소드
		myNum = n;
	}
	void showMyNumber(){		//인스턴스 메소드
		showInt(myNum);		//클래스 내부에서 클래스 메소드 호출
	}
}

class ClassMethod{
	public static void main(String[] args){
		NumberPrinter.showInt(20);		//클래스 이름을 통한 클래스 메소드 호출
	
		NumberPrinter np = new NumberPrinter();
		np.showDouble(3.15);		//인스턴스 이름을 통한 클래스 메소드 호출
		np.setMyNumber(75);
		np.showMyNumber();
	}
}

 

클래스 메소드로 정의하기 좋은 경우

class SimpleCalculator{
	static final double PI = 3.1415;

	double add(double n1, double n2){
		return n1 + n2;
	}
	double min(double n1, double n2){
		return n1 - n2;
	}
	double calCircleArea(double r){
		return PI * r * r;
	}
	double calCirclePeri(double r){
		return PI * (r * 2);
	}
}

class UseCalculator{
	public static void main(String[] args){
		SimpleCalculator sc = new SimpleCalculator();
		System.out.println("3 + 4 = " + sc.add(3,4));
		System.out.println("반지름 2.2, 원의 넓이 : " + sc.calCircleArea(2.2) + "\n");

		System.out.println("15 - 7 " + sc.min(15,7));
		System.out.println("반지름 5.0, 원의 둘레 : " + sc.calCirclePeri(5.0) + "\n");
	}
}

외부에 기능을 제공하기 위한 메소드일 경우

인스턴스 변수의 값을 참조하거나 수정하지 않을 경우

class SC{
	static final double PI = 3.1415;

	static double add(double n1, double n2){
		return n1 + n2;
	}
	static double min(double n1, double n2){
		return n1 - n2;
	}
	static double calCircleArea(double r){
		return PI * r * r;
	}
	static double calCirclePeri(double r){
		return PI * (r * 2);
	}
}

class UseCalculatorCMVer{
	public static void main(String[] args){
		System.out.println("3 + 4 = " + SC.add(3,4));
		System.out.println("반지름 2.2, 원의 넓이 : " + SC.calCircleArea(2.2) + "\n");

		System.out.println("15 - 7 " + SC.min(15,7));
		System.out.println("반지름 5.0, 원의 둘레 : " + SC.calCirclePeri(5.0) + "\n");
	}
}

이렇게 변형해서 사용할 수 있다.

 

클래스 메소드에서 인스턴스 변수에 접근은 할 수 없다

class AAA{
	int num = 0;
    static void addNum(int n){
    	num += n;			//접근이 불가하다.
    }
}

해당 int num 과 static은 다른 곳에 존재한다.

밑에와 같이 변수를 static 변수도 변경해주면 접근이 가능하다.

class AAA{
	static int num = 0;
    static void showNum(){
    	System.out.println(num);	//클래스 변수 접근 가능
    }
    static void addNum(int N){
    	num += n;			//클래스 변수 접근 가능
       	showNum();			//클래스 메소드 호출 가능
    }
}