클래스 메서드와 인스턴스 메서드

hongxeob·2022년 11월 11일
0

Java

목록 보기
1/7
post-thumbnail

✅ 변수의 스코프

프로그램상에서 사용되는 변수들은 사용 가능한 범위를 가진다. 그 범위를 변수의 스코프라고 한다.

// 변수가 선언된 블럭이 그 변수의 사용 범위이다.
public class ValableScopeExam{

        int globalScope = 10;   // 인스턴스 변수 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope);
            System.out.println(localScpe);
            System.out.println(value);
        }
    }
  • 클래스의 속성으로 선언된 변수 globalScope의 사용범위는 클래스 전체 이다.
  • 매개변수로 선언된 int value는 블럭 바깥에 존재하기는 하지만,메서드 선언부에 존재하므로 사용범위는 해당 메소드 블럭 내이다.
  • 메서드 블럭내에서 선언된 localScope 변수의 사용범위는 메서드 블럭내이다.

✔️ main 메소드에서 사용하기

  • 같은 클래스 안에 있는데 globalScope 변수를 사용할 수 없다.
  • main은 static한 메소드이다. static한 메소드에서는 static 하지 않은 필드를 사용할 수 없다.
public class VariableScopeExam {
        int globalScope = 10; 

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  // 오류
            System.out.println(localScope);   // 오류
            System.out.println(value);        // 오류  
        }   
    }

✔️ static

  • 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
  • main 메소드는 static 이라는 키워드로 메소드가 정의되어 있다. 이런 메소드를 static한 메소드 라고 한다.
  • static한 필드(필드 앞에 static 키워드 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.
public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7; // -> static화

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      //사용가능 
        }
    }

static한 변수는 공유 된다.

  • static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
public class VariableScopeExam {
    int globalScope = 10; 
    static int staticVal = 7; // -> static화
    //----위 같은 조건 이라면----//
    
    VariableScopeExam v1 = new VariableScopeExam();
    VariableScopeExam v2 = new VariableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20이 출력된다. 
    System.out.println(v2.golbalScope);  //30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  //20 이 출력된다. 
    System.out.println(v2.statVal);  //20 이 출력된다. 
    
    // static이 들어간 클래스 변수는 위 코드 처럼 레퍼런스.변수명 보다
    // 클래스명.변수명이 더 바람직하다 (아래 코드 참조)
    System.out.println(VariableScopeExam.staticVal);
  • glboalScope같은 변수(필드)는 인스턴스가 생성될 때 생성되기 때문에 인스턴스 변수라고 한다.
  • staticVal 같은 static한 필드를 클래스 변수라고 한다.
  • 클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는 것이 더 바람직 하다.
    ex) VariableScopeExam.staticVal

🔥 정리 하자면!!!

  • 인스턴스 메서드는 static을 붙이지 않고 선언한 메서드이고, 그 클래스형의 개별 인스턴스에 속한다.
    간단히 말해 개별 인스턴스에 포함되면 인스턴스 메서드
  • 클래스 메서드는 static을 붙여 선언한 메서드 이고, 특정 인스턴스에 속하지 않는다.
    클래스 전체에 대한 처리 or 클래스의 개별 인스턴스와 관계없는 처리를 할 때 사용

참조 사이트
https://school.programmers.co.kr/learn/courses/5/lessons/231#

profile
걍 하자 저스트 뚜잇

0개의 댓글