티스토리 뷰

development/Java

[Java] final , static final

Happyoon ~ 2021. 11. 7. 02:12
728x90
반응형

final 예약어는 지역변수를 선언할 때 사용하면 해당 지역변수를 수정할 수 없도록 만든다. 

한번 값이 고정되면 값을 바꿀 수 없도록 하는 것으로, 모든 영역에서 상수로 사용되는 static final과 유사하지만 조금의 차이가 있다. 

 

식별자는 관례상 모두 대문자로 만드는 것이 일반적이다. 

 

사용 예시

final int num2 = 20;

final String MY_NAME = "김구라";

final Phone p1 = new Phone();

예시1

MainClass13.java - final을 다양한 type의 자료형에 사용해보기

package test.main;

import test.mypac.Phone;

public class MainClass13 {
	public static void main(String[] args) {
		int num1 = 10;
		/*
		 * final 예약어를 지역변수를 선언할 때 사용하면 수정불가
		 * 즉, 상수를 만드는 역할을 한다.
		 */
		final int num2 = 20;
		//변수는 저장된 값을 바꿀 수 있지만
		num1 = 999;
		//상수는 값이 한번 결정되면 바꿀 수가 없다.
		//num2 = 999;
		
		//상수의 식별자(상수의 이름)은 관례상 모두 대문자로 만드는 것이 일반적이다.
		final String MY_NAME = "김구라";
		//수정 불가
		//MY_NAME = "원숭이";
		
		final Phone p1 = new Phone();
		
		//p1에 담긴 참조값 수정 불가
		//p1 = new Phone();
	}

}

 


"특정 필드가 static final인 클래스 살펴보기"

 

문자열이나 숫자를 상수화 시키면 의미가 없거나 복잡한 문자열, 숫자에 "이름을 붙인 효과"를 얻을 수 있다.

 

 

예시2

Util.java - static final 필드와 이를 활용한 메소드 만들어보기

package test.mypac;

public class Util {
   //어떤 클래스의 특정 필드가 static final 로 만들어진 것들도 있다.
   
   //문자열을 상수화 시키면 의미가 없거나 복잡한 문자열에 이름을 붙인 효과를 볼수 있다. 
   public static final String PUSAN="pusan1234aaaa";
   public static final String INCHEON="Incheon1234aaaa";
   
   //숫자를 상수화 시키면 의미없는 숫자에 이름을 붙인 효과를 볼수 있다.
   public static final int LEVEL_1=1000;
   public static final int LEVEL_2=1100;
   public static final int LEVEL_3=1200;
   
   public void send(String dest) {
      if(dest.equals(PUSAN)) {
         System.out.println("부산으로 전송 합니다.");
      }else if(dest.equals(INCHEON)) {
         System.out.println("인천으로 전송합니다.");
      }
   }
   
   public void alter(int level) {
      if(level == LEVEL_1) {
         System.out.println("1 단계 1000 수준으로 변경합니다.");
      }else if(level == LEVEL_2) {
         System.out.println("2 단계 1100 수준으로 변경합니다.");
      }else if(level == LEVEL_3) {
         System.out.println("3 단계 1200 수준으로 변경합니다.");
      }
   }
}

MainClass14.java - Util 클래스를 활용하여 static final의 효과 알아보기

package test.main;

import javax.swing.JFrame;

import test.mypac.Util;

public class MainClass14 {
	public static void main(String[] args) {
		Util u = new Util();
		u.send("pusan1234aaaa");
		//같은 동작을 상수를 활용하면 좀 더 가동성도 좋고 편리하게 코딩할 수 있다.
		u.send(Util.PUSAN);
		
		u.alter(1000);
		//같은 동작을 상수를 활용하면 좀 더 가동성도 좋고 편리하게 코딩할 수 있다.
		u.alter(Util.LEVEL_1);
		
		//out은 static final이기 때문에 수정 불가
		//System.out = null;
		
		JFrame f = new JFrame();
		f.setBounds(100,100,500,500);
		f.setTitle("나의 프레임");
		f.setVisible(true);
		//프레임을 닫았을 때 기본 동작 설정 
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}

 

Util.PUSAN은 static final 필드로 상수이므로 값이 pusan1234aaaa와 동일하다.

따라서 둘다 "부산을 전송 합니다."의 동일한 출력이 나온다.

 

Util.LEVEL_1 역시 1000과 값이 동일하므로 "1단계 1000 수준으로 변경합니다."의 출력이 나온다. 

 

같은 동작을 이렇게 상수를 활용하면 가독성이 좋고 편리하게 코딩할 수 있다.

 

우리가 출력할 때 많이 보던 System.out은 static final이므로 수정이 불가하다. 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함