[Java] Static

임혜정 ·2021년 5월 16일
0

Java

목록 보기
7/16
post-thumbnail

static (O)

  • 클래스변수, 클래스메소드가 된다
  • class 소속 (붕어빵틀 소속)

static (X)

  • instance 이다.
  • Object 소속이다. (붕어빵 소속) : object 마다 다름
  • instance 변수 : 특정 instance(object)에 속해있다.
  • instance 메서드 : class의 instance(object)를 통해 실행된다.


static 변수


  • 인스턴스의 생성과 상관없이 사용할 수 있다.

  • 클래스 이름으로 참조된다. ex) 클래스이름.static변수명

  • class의 모든 instance들에 의해 공유된다.

  • heap에 메모리가 잡힌다(라고 설명들었지만 heap이 아닌 데이터 영역에 메모리가 생성된다)

  • static 변수의 함수도 static이다.

public class Student {
	
	private static int serialNum =1000; // 기준점 
	private int studentID;
	public String studentName;
	
	public Student(String name) {
		studentName = name;
		serialNum++;
		studentID=serialNum;
	}
	
	//private으로 선언한 studentID, serialNum을 읽기위한 get 메서드  
	
	public int getStudentID() {
		return studentID;
	}
	
	public static int getSerialNum() {
		return serialNum;
	}
}
public class Main {
	public static void main(String[] args) {
		
		Student s1 = new Student("Lee");
		System.out.println(Student.getSerialNum()); //1001 
		
		Student s2 = new Student("Son");
		System.out.println(Student.getSerialNum()); //1002  
		
		System.out.println(s2.getStudentID()); //1002  
		System.out.println(s1.getStudentID()); //1001 

	}
}

static 메서드


  • 클래스 이름으로 참조된다. ex) 클래스이름.메서드이름

  • 인스턴스 생성여부에 상관없다.

  • static변수는 사용가능하다.

  • 지역변수는 사용가능하다. (함수안에서만 사용하고 소멸되는 변수이기때문에)

  • 멤버변수는 사용가능하지않다.

    • 멤버변수는 인스턴스 생성이 필수다.
    • 그래서 !! static 메서드를 사용하는 순간 인스턴스가 없다면 오류가 날 수 밖에 없는 변수이기 때문에 사용 불가하다.

public static int getSerialNum() {
	int i=0; // 지역변수
    studentName = "Lee"; // 멤버변수
	return serialNum;
}

클래스 안에 main 메서드가 포함된 경우


main 메서드가 선언된 class 안에서 선언된 class method는 main method에서 호출시, 클래스명 없이 메서드 명으로만 호출 가능하다
ex) classMethod();

main method 안에서 선언된 변수들은 로컬 변수로 인식되어 main method 사용 할때만 stack 메모리에 생성된다

일반적으로 main method는 public class에 사용된다.

public class Main {
	
	public static void classMethod() {
		System.out.println("클래스 메소드 호출  ");
	}
	
	public void instanceMethod() {
		System.out.println("인스턴스 메서드 호출 ");
	}
	
	public static void main(String[] args) {
		classMethod();
		Main.classMethod();
		Main m = new Main();
		m.instanceMethod();
		

	}
}

진짜 주의해아할 부분

main이 static 이라고 모든 메서드에 static을 붙여주면 안된다. 🤥

  • 1번)
    • main 이 static 이다.
    • getArea() 메서드를 호출할 경우, static 메서드가 아니기 때문에 오류가 발생한다.
    • 이때 절대로 getArea()에 static을 붙여서 해결하면 안된다
    • 기본적으로 getArea() 의 의미를 살펴보면 이 값은 객체마다 다를 수 있다(붕어빵마다 다른값을 가진다)
  • 2번)
    • 그렇기 때문에 하나의 값을 공유하는 의미인 static을 붙여주면 의미가 아예 달라진다
    • 객체를 생성하고 그 객체를 지정하여 불러줘야한다.

public class Circle {
	double radius;
	static int numberOfObjects=0;
	
	static int getNumberOfObjects() {
		return numberOfObjects;
	}
	
	double getArea(){
		return radius*radius*Math.PI;
	}

	public static void main(String[] args){
		Circle c1 = new Circle();
		c1.radius = 9;
		
		int m =getNumberOfObjects();
		//1번 
		// getArea(); -> static 메서드가 아니기때문에 이건 오류  
		
        	//2번
		double a =c1.getArea();
		
		System.out.println(m+","+a);
		
		
	}
}
profile
포기하지 않고 끝까지 🐥

0개의 댓글

관련 채용 정보