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(); //클래스 메소드 호출 가능
}
}