2021년 2회 정보처리기사 실기 문제 중 접근제한자에 관련된 문제가 있었다. 깊게 생각 안하고 같은 클래스에서 사용가능..?
그러면 public private protected 모두 가능한거 아닌가?
하다가 그냥 private 찍고 넘어간 문제...
조금만 더 고민해봤으면 맞을 수 있었을텐데...😂
[문제] 자바-Static 메소드: 클래스 내에서 객체 생성 없이 사용할 수 있는 메소드
[코드]
public class Test {
public static void main(String[] args) {
System.out.print(check(1));
}
( ) String check(int num) {
return (num >= 0) ? "positive" : "negative";
}
}
static 변수란 다른 용어로 정적 변수
라고도 한다.
static 변수는 다른 멤버 변수처럼 클래스 내부에 선언한다.
예시
static int serialNum ;
static 변수는 프로그램이 실행되어 메모리에 올라갔을 때 딱 한번 메모리 공간이 할당된다. 그리고 그 값은 모든 인스턴스가 공유한다.
다시말해 일반 멤버 변수는 인스턴스가 생성될 때 마다 새로 생성되어 각각 다른 변수로 존재하지만, static 으로 선언한 변수는 인스턴스 생성과 상관없이 먼저 생성되어 그 값을 모든 인스턴스가 공유하게 되는 것이다.
static 변수를 클래스에 기반한 변수라 하여 클래스변수
라고도 한다.
static 변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다. 그러므로 인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다.
public class Student {
public static int serialNum = 1000;
public int studentId;
public int grade;
public Student(){
serialNum ++;
studentId = serialNum;
}
}
public static void main(String args[]){
Student std = new Student();
System.out.println(std.serialNum); -> 인스턴스 이름 (std) 로 참조
System.out.println(Student.serialNum); -> 클래스이름 (Student) 로 참조
static으로 선언된 메소드는 new() 할당과 관계 없이 호출이 가능하다
public static void main(String[] args){
//class.method();
publicMethod();
MethodTest01.protectedMethod();
//같은 클래스 내부에 있는 메소드를 호출할 때는, class 생략 가능! (MethodTedst01. < 이거를 생략 가능)
defaultMethod();
privateMethod();
}
// method: 기능. 명령문들의 집합.
// 접근제한자 메모리영역 리턴타입 메소드명(파라미터) {} < 중괄호 이름을 body , block 이라고 함
// public : 어디서나 접근, 참조 가능 (+)
public static void publicMethod() {
System.out.println("public method 호출!");
}
//protected : 상속일 경우 상속된 곳에서, 상속이 아닌 경우 같은 패키지 내에서 (#)
protected static void protectedMethod() {
System.out.println("protected method 호출!");
}
//(default) : 같은 패키지 내에서만 (~)
static void defaultMethod() {
System.out.println("defaultMethod 호출!");
//non-static method : 객체 필요 , new() 를 통해 호출 가능하다
public void nonStaticMethod() {
System.out.println("MethodTest01의 non-static method 호출!");
}
public class MethodTest02 {
public static void main(String[] args) {
//method 호출 방법
new() 연산자가 필요없다
// 1. static method : class.method();
MethodTest01.publicMethod();
MethodTest01.protectedMethod();
MethodTest01.defaultMethod();
//MethodTest01.privateMethod();not visible
MethodTest01 staticmet = new MethodTest01();
staticmet.publicMethod();
//2.non-static method
//class (참조타입) 변수= new class();
//변수.method();
MethodTest01 nonstatic= new MethodTest01();// < 값(객체)
nonstatic.nonStaticMethod();
//objectaid
//UML : Unified Modeling Language
}
}