새로운 메서드를 만들어서 실행하려고하면,
자꾸 스테틱 메서드 안에서는 스테틱만 가능하다고 뜬다.
뭔지도 모르고 막 써서 그런듯..
대체 스테틱이 뭔지 궁금해서 구글 뒤져봄.
https://www.geeksforgeeks.org/static-keyword-java/
static keyword in java - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
위 사이트 보고 정리함.
// java program to demonstrate execution
// of static blocks and variables
class Test
{
// static variable
static int a = m1();
// static block
static {
System.out.println("Inside static block");
}
// static method
static int m1() {
System.out.println("from m1");
return 20;
}
// static method(main !!)
public static void main(String[] args)
{
System.out.println("Value of a : "+a);
System.out.println("from main");
}
}
위 코드를 보고 출력을 미리 예상해보자.
출력
>> from m1
>> Inside static block
>> Value of a : 20
>> from main
스테틱 variables, method 등 스테틱 멤버은 딱 한 번 실행된다.
언제? 해당 클래스가 처음 로드되어 질 때.
가장 흔한 스테틱 메서드의 예는 main() 메서드이다.
즉, 자바 프로그램을 run하면 main메서드가 한 번 실행되는 것과 같다.
new 생성자 등을 통해 생성하지 않고, static method를 직접 불러온다.
스테틱 변수가 선언되어질 때, 하나의 카피가 만들어 지고, 클래스 레벨에서 모든 객체들과 공유된다.
즉, 글로벌 변수이다.
해당 클래스의 모든 instances는 같은 스테틱 변수를 공유한다.
스테틱 멤버는 해당 클래스의 어떤 객체가 생성되어 지기도 전에,
어떤 객체의 참조없이 접근이 가능하다.
스테틱으로 정의된 메서드들은 다음과 같은 제한을 가진다.
1. 오직 다른 스테틱 메서드들만 직접 불러올 수 있다.
: main()에서 non-static method사용이 불가능한 이유
2. 오직 스테틱 데이터들만 직접 접근이 가능하다.
3. this, super 등을 사용할 수 없다.(컴파일 에러)
언제 사용하나?
모든 객체들이 공통으로 가진 속성을 위해 static variable을 사용해라.
ex) Student클래스 에서 학생1, 학생2, ,,, 학생100 을 차례로 만든다.
각각 학생의 이름을 입력받는다.
그리고 학생에게 학번을 부여한다.
학번은 고유번호이며, 입력된 학생의 순서대로 부여된다. (학생1의 학번은 1, 학생97의 학번은 97)
학번을 static변수로 설정하고,
학번을 +1시키고, 부여하는 static 메서드를 사용한다.
static 학번은 학생 클래스 레벨에서 모든 객체들에서 공유되므로,
객체가 바뀌어도 하나의 변수로서 데이터를 저장한다.
코드를 보면 이렇다.
// A java program to demonstrate use of
// static keyword with methods and variables
// Student class
class Student
{
String name;
int rollNo;
// static variable
static String cllgName;
// static counter to set unique roll no
static int counter = 0;
public Student(String name)
{
this.name = name;
this.rollNo = setRollNo();
}
// getting unique rollNo
// through static variable(counter)
static int setRollNo()
{
counter++;
return counter;
}
// static method
static void setCllg(String name){
cllgName = name ;
}
// instance method
void getStudentInfo(){
System.out.println("name : " + this.name);
System.out.println("rollNo : " + this.rollNo);
// accessing static variable
System.out.println("cllgName : " + cllgName);
}
}
//Driver class
public class StaticDemo
{
public static void main(String[] args)
{
// calling static method
// without instantiating Student class
Student.setCllg("XYZ");
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
s1.getStudentInfo();
s2.getStudentInfo();
}
}
출력결과
name : Alice
rollNo : 1
cllgName : XYZ
name : Bob
rollNo : 2
cllgName : XYZ
( 위 사이트에서 가져온 예시코드를 보면, static 메서드가 학번을 증가시킨다.
하지만 static 메서드로 굳이 선언한 이유를 모르겠다.
static을 삭제해도 동작 순서와 결과가 똑같다. 그냥 예시를 위한 예시인 것인가..
왜 굳이 static으로 정의하였는지 이유가 추측되는 분들은 댓글을 남겨주길 바랍니다!)
스테틱 정리 끝~~
머리속에 떠다니던 지식이 잘 정리된 것 같다.
'Computer Science' 카테고리의 다른 글
[자바스크립트] 함수 splice vs slice 차이점 (0) | 2021.08.10 |
---|---|
컴퓨터공학 개발공부 트리 (0) | 2021.07.04 |
[JAVA] 입출력 예제 - 백준 2558 (0) | 2021.06.15 |
[JAVA] 입출력 예제 - 백준 2557 (0) | 2021.06.15 |
[JAVA] 입출력 예제 - 백준 11022 (0) | 2021.06.15 |