-
[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(); //클래스 메소드 호출 가능 } }
'Java > Basic' 카테고리의 다른 글
[Java_Basic]콘솔 입력과 출력(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.02 [Java_Basic]메소드의 오버로딩과 String 클래스(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.02 [Java_Basic]정보 은닉 그리고 캡슐화(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.02 [Java_Basic]패키지와 클래스 패스(윤성우의 열혈 Java 프로그래밍) (0) 2020.12.30 [Java_Basic]클래스와 인스턴스(윤성우의 열혈 Java 프로그래밍) (0) 2020.12.26