static 개념정리

차차·2021년 8월 17일
0

Java

목록 보기
11/11

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 변수란 다른 용어로 정적 변수 라고도 한다.
static 변수는 다른 멤버 변수처럼 클래스 내부에 선언한다.

예시  
	static int serialNum ; 

static 변수는 프로그램이 실행되어 메모리에 올라갔을 때 딱 한번 메모리 공간이 할당된다. 그리고 그 값은 모든 인스턴스가 공유한다.
다시말해 일반 멤버 변수는 인스턴스가 생성될 때 마다 새로 생성되어 각각 다른 변수로 존재하지만, static 으로 선언한 변수는 인스턴스 생성과 상관없이 먼저 생성되어 그 값을 모든 인스턴스가 공유하게 되는 것이다.
static 변수를 클래스에 기반한 변수라 하여 클래스변수 라고도 한다.

static 변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다. 그러므로 인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다.

[예시]

Student class 생성

	public class Student {
    	public static int serialNum = 1000; 
        public int studentId; 
        public int grade; 
        
        public Student(){
        serialNum ++; 
        studentId = serialNum; 
        }
        
    }

static 변수 참조하기 (인스턴스, 클래스)

public static void main(String args[]){
Student std = new Student();  
System.out.println(std.serialNum); -> 인스턴스 이름 (std) 로 참조
System.out.println(Student.serialNum); -> 클래스이름 (Student) 로 참조 

static메서드

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 
		
	}
	
}
profile
개발하는 돌멩이🙄🙄👻

0개의 댓글