본문 바로가기
프로그래밍/java

java static, final 정리

by 뜨끔쓰 2019. 4. 23.
728x90
728x90

안녕하세요


오늘은 java의 static 과 final에 대하여 알아보려고 합니다.


갑자기 static, final이라고 하니까 상당히 당황 스럽죠??


그런데 왜 static이랑 final을 같이 정리한다고 했을까요?? 그 이유는 static과 final을 함께 사용하면 상수로 사용 할 수 있기 때문이기 같이 정리를 하게 되었습니다. (딱히 큰 이유는 없음)


일단 java의 static이라는 것 부터 먼저 알아 보도록 하겠습니다.






static이란?

아주 간단하게 설명하자면, static이란 객체를 생성하지 않고, 변수 또는 함수를 사용 할 수 있게 만들어주는 키워드라고 생각하면됩니다.

일단 사용예를 한번 봐보도록할께요.


public class Test {
    static int staticNum;
    int basicNum;
}


우선 이렇게 Test라는 클래스를 정의 했습니다. Test 클래스 안에는 static 키워드를 사용한 int형 변수 staticNum이 있고, int형 변수 basicNum이라는 2개의 변수가 있습니다.


이제 Main 클래스를 봅시다.


public class Main {
    public static void main(String[] args) {

        Test test1 = new Test();
        Test test2 = new Test();
        
        test1.staticNum = 10;
        test1.basicNum = 20;
        System.out.println(test1.staticNum);
        System.out.println(test2.staticNum);
        
        System.out.println(test1.basicNum);
        System.out.println(test2.basicNum);
        
    }
}


보시면 Main에서 test1과 test2라는 인스턴스를 2개 생성하였습니다.


그리고 아래의 코드를 보면 test1의 변수 staticNum과 basicNum에 각각 10과 20을 값으로 넣어주었습니다.


그다음 System.out.println(test1.staticNum), System.out.println(test2.staticNum) 두개를 통하여 test1과 test2의 staticNum 값을 출력해주고 있습니다


과연 이값은 얼마가 나올까요?? 정답은 둘다 10이 출력됨을 볼 수있습니다. 여기서 생각해보시면 저는 분명 test1의 staticNum에만 10이라는 값을 저장해주었는데 test2의 staticNum도 10이 출력되는것을 볼 수 있습니다. 


왜 그런것일까요? 바로 static이라는 키워드 때문에 생기는 현상인데요, static이라는 키워드를 사용하면 데이터 영역에 속하게 되므로 항상 메모리에 상주해 있게 됩니다. 그렇기 때문에 사실 인스턴스를 생성하지 않고, 바로 클래스에 접근하여 변수를 호출하여 사용하실 수도 있습니다.


그렇다면 변수뿐만아니라 메소드도 static으로 선언하여 인스턴스를 생성하지 않고 사용 가능할까요?

네 정답입니다.  우리는 이미 흔하게 사용하고 있었습니다. 어디냐구요? 바로 main 메소드입니다. main 메소드 앞에보시면 public static이라고 되어있죠?


그렇기에 우리는 인스턴스를 생성도 하지 않고 바로 사용하고 있습니다. 한가지 예를 들어볼께요 Math라는 클래스를 import하여 사용해봅시다.


import java.lang.Math;

public class Mathematics {
    public static void main(String[] args) {
        System.out.println((int)(Math.random() * 6) + 1);   // 0 ~ 6까지의 랜덤 값
    }
}


Math라는 클래스의 random이라는 메소드를 사용하여 0 ~ 6 사이의 랜덤값을 출력해주는 소스코드입니다.


보시다시피 random()이라는 메소드를 사용하기 위해 인스턴스를 생성하지 않았는데도 사용이 가능하죠?? 바로 이런 예가 static을 이용하여 메소드를 선언했을때 이런식으로 인스턴스를 생성하지 않고 사용 할 수 있게 되는 편리한 방법입니다.


지금까지 static에 대해 알아 봤는데 정리가 잘 되었을까요?


한가지만 기억하시면 됩니다. static은 객체를 생성하지 않고, 변수 또는 메소드를 사용 할 수 있다.!!




이번에는 final에 대하여 알아보도록 하겠습니다.


final 이란?

java에서는 final이라는 키워드가 존재합니다. 이 final이 대체 무엇이냐? 어디다 쓰이느냐 간단히 설명하면 final이라는 단어의 뜻처럼 선언한 그대로 사용하라는 의미입니다.

예를 들자면 사용법은 여러가지가 있는데 우선 변수에 사용 할때를 봅시다.

1.변수에 final을 사용할때

변수를 정의할 때 final 키워드를 함께 작성해주시면 됩니다. 그렇게 하면 상수가 됩니다. 한 번 정의 하면 값을 변경 할 수 없습니다.


final double PI = 3.14;


대체로 상수의 의미를 두고 final 키워드를 사용하여 변수를 생성할때에는 변수의 이름을 대문자로 생성합니다. 대체로 원주율  파이[π]를 사용할때는 3.14를 사용하는데 값이 변할 일은 없다고 봐도 무방하죠? 그렇기 때문에 final 키워드를 사용하여 한번 선언해놓으면 언제든 사용 할 수 있게 되며, 값이 변할 걱정도 하지 않아도 되죠? 이럴때 final을 이용합니다. 


만약 여기서 static과 함께 쓰신다면 전역상수로 사용이 가능합니다. 


final static double PI = 3.14;


바로 이런식으로 static 키워드와 final 키워드를 함께 쓰시면 전역상수처럼 사용하실 수 있습니다.

(C언어에서의 #define처럼 생각하시면 됩니다. 위에서 말했듯이 상수는 모두 대문자로 작성한다고 보시면 됩니다.)


2.메소드에 final을 사용할때

메소드를 정의할 때 final 키워드를 함께 작성해주시면 됩니다. 그렇게 하면 상속관계에 있는 상위 클래스나 하위 클래스에서 오버라이딩(Overriding)이 불가능하며, 상송받은 그대로 사용해야 합니다.

class Test{
    public final testMethod() {
    }
}


이런식으로 사용하시면 됩니다.


3.클래스에 final을 사용할때

클래스를 정의할 때 final 키워드를 함께 작성해주시면 됩니다. 그렇게 하면 클래스의 상속이 불가능하게 됩니다. 대체로 작성한 클래스를 
상속받아서 사용하지 못하게 금지하고 싶을때 사용하시면 됩니다.


final class TestClass {
}


이런식으로 사용하시면 됩니다.


final 키워드의 여러 사용방법을 알아보았는데요. 잘 정리가 되었을까요??


final 키워드를 한마디로 정리하자면 아래와 같습니다.


클래스나 메소드의 재정의를 막기 위하여 사용하며, 변수에 사용할 시에는 변수의 초기화 이후에 값의 변경을 막는 용도로 사용한다.




오늘은 java의 static, final에 대하여 정리를 해보았는데요. 최대한 쉽게 작성해본다고 작성은 해보았으나, 내용적으로 부족한부분이 있을수도 있을 것 같아요.


하지만 기본적인 개념부분은 정리가 될거라고 생각합니다.


한가지 팁을 드리자면 그날그날 공부하고 배웠던 부분을 짧게나마 직접 코딩을하거나, 간단한 프로그램을 만들어 본다고 생각하고, 프로그래밍 공부를 한다면 머릿속에도 기억이 오래남고, 나중에 까먹었을때 지금 사용했던 소스들을 한번 되짚어본다면, 도움이 많이 되는 것 같습니다.

(사실 저도 이걸 잘 하지 못해서 다시 처음부터 공부할때가 많아요.)


저도 java를 공부하고 정리하는 입장에서 작성하는 글이라, 혹 잘못된 부분이나 문제가 있는 부분은 댓글로 지적해주시면 언제든 감사히 받고 수정하도록 하겠습니다.


다음시간에는 java의 예외처리(try-catch)에 대하여 공부하며 정리하려고 합니다.


부족하지만 이글을 봐주셔서 감사합니다.



728x90
반응형

댓글