본문 바로가기
👨‍💻 프로그래밍/Java, Kotlin, Spring

자바 19 - static의 의미

by 개발자 진개미 2021. 5. 8.
반응형

새로운 프로그래밍 언어를 배울때 처음으로 하는게 바로 Hello World를 프린트하는 프로그램을 만드는 것이다. 자바에서 Hello World 프로그램은 다음과 같았다.

 

class Ex {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

 

여태까지의 내용을 잘 따라왔다면 이 프로그램이 가지는 의미가 조금은 보일 것이다. 하지만 static은 뭘까? 우선, static이 뭔지 설명하기 전에 객체지향 프로그래밍의 기초적인 내용을 알아야 한다. 객체지향 프로그래밍의 기초는 여기서 배울 수 있다.

 


static의 의미

static이 무슨 뜻인지 한 마디로 하자면 인스턴스를 만들지 않고 사용할 수 있는 변수/매소드이다. 자바에서 class를 사용해 객체를 정의하면, 그 객체를 바로 사용할 수 있는게 아니다. 자동차로 예를 들었듯이, class로 정의한 객체는 자동차의 설계도이고, 자동차를 이용하기 위해선 실제로 자동차를 만들어야 한다. 실제로 자동차를 만드는 과정을 인스턴스를 만든다고 한다. Ex라는 객체를 class로 정의하면, 아래와 같이 hello라는 인스턴스를 만들 수 있다.

 

Ex hello = new Ex();

 

이제 Ex에서 정의된 프로퍼티(변수)나 매소드를 사용하기 위해서는 인스턴스의 이름(hello)를 쓰고 점(.)을 적어 접근할 수 있다. 하지만, 모든 프로퍼티나 매소드가 반드시 인스턴스가 필요한건 아니다. 예를 들어, 단순히 배열을 받아와서 가장 큰 숫자를 돌려주는 매소드가 있다면, 굳이 배열 클래스를 정의하고 인스턴스를 만들 필요는 없다. 이럴 경우에 static을 쓰면, 인스턴스를 만들지 않고 프로퍼티나 매소드를 사용할 수 있다.

 

예를 들어, 아래와 같이 Array 클래스와 그 안에 max 매소드가 있다고 하자.

 

class Array {
    public static int max(int[] arr) {
    //구현 생략
    }
}

 

max 매소드는 static으로 정의했기 때문에 아래와 같이 인스턴스를 만들지 않고 사용할 수 있다.

 

int[] arr = [1, 2, 3, 4];

Array.max(arr);

static인 매소드와 아닌 매소드

여태까지 많은 클래스와 매소드를 사용했는데, 어떤것이 static이고 어떤 것이 아닐까?

 

1. System.out.println

print 함수는 static일까? 우선 print 함수의 형식을 보자. 

 

class Ex {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

 

프린트 함수는 System 클래스에 있다고 볼 수 있는데, System 함수의 인스턴스를 만들지 않고 사용했기 때문에 static이 아니다.

 

2. Scanner

Scanner 클래스는 어떨까? 우선 Scanner 함수의 형식을 보자. 

 

import java.util.Scanner;

class Ex {
    public static void main(String[] args) {
        Scanner stdin = new Scanner(System.in);
        int var = stdin.nextInt();
    }
}

 

Scanner 함수를 사용하기 전에 쓴 코드를 주목해보자.

 

Scanner stdin = new Scanner(System.in);

 

이 코드는 Scanner 클래스의 인스턴스를 만드는 코드이다. Scanner 클래스는 인스턴스를 만들어야만 사용할 수 있기 때문에 static이다.

 

3. Math

Math 클래스는 static일까? Math 클래스 사용법을 생각해보자. 기억이 나지 않는다면 여기를 참고하면 된다.

 

Math.PI;
Math.sin();

 

Math 클래스에 있는 매소드들은 위와 같이 사용한다. 여기서도, Math 클래스의 인스턴스를 만들지 않았기 때문에 static한 매소드이다.


 

반응형