ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java_Basic]클래스 변수와 클래스 메소드(윤성우의 열혈 Java 프로그래밍)
    Java/Basic 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();			//클래스 메소드 호출 가능
        }
    }

    댓글

Designed by Tistory.