jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • JavaScript
  • 덧칠하기 javascript
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 자바스크립트 배열의 특수함
  • 백준 17406 nodeJS
  • 자바스크립트 모듈 시스템
  • 병합정렬 자바스크립트
  • 25632 소수 부르기 게임
  • 자바스크립트 이벤트 위임
  • 1753 최단경로 javascript
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 자바스크립트 커링
  • 13460 javascript nodejs
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 자바스크립트 sort는 왜 그모양일까
  • javascript use strict
  • safari Date format NaN
  • 계수정렬 자바스크립트
  • 자바스크립트 채팅방 스크롤
  • 억억단을 외우자 javascript
  • 리액트 프로젝트 디버깅하기
  • 퀵정렬 자바스크립트
  • 리코쳇 로봇 javascript
  • fetch 취소하기
  • 프로그래머스 숫자카드나누기 javascript
  • 외벽 점검 javascript
  • 가사 검색 자바스크립트
  • safari invalid date error
  • 대충만든자판 javascript
  • 백준 자바스크립트 입력 템플릿

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

Java

[Java] static, final, static final의 차이

2020. 12. 8. 09:09

static = 고정된

final = 최종적인

final static = 상수?

 

이론을 공부하면서 세 가지 개념에 대해 모호했던 기억이 있다.

 

이번에 학습한 내용을 바탕으로 정리하였다.

 

 

 

1. Static

 

static은 "고정된" 이라는 의미

객체 생성 없이 사용할 수 있는 필드와 메소드를 생성하고자 할 때 활용한다.

 

필드나 메소드를 객체마다 다르게 가져야 한다면 인스턴스로 생성하면 되고

공용 데이터에 해당하거나 인스턴스 필드를 포함하지 않는 메소드를 선언하고자 할 때 이용한다.

 

사용하기 위해선 클래스 내에서 필드나 메소드 선언 시 static 키워드를 붙여주기만 하면 된다.

 

public class PlusClass{
  static int field1 = 15;

  static int plusMethod(int x, int y){ return x+y; } 
}

다음과 같이 선언하고

 

int ans1 = PlusClass.plusMethod(15,2);
int ans2 = PlusClass.field1 + 2;

다음과 같이 바로 "클래스이름.필드" 로 사용할 수 있다.

 

물론, 아래와 같이 객체 참조 변수를 이용할 수 있지만 추천되진 않는다.

PlusClass pc = new PlusClass();
int ans1 = pc.plusMethod(15,2);

 

또한, 정적 메소드는 객체 참조 없이 바로 사용할 수 있는 특징 때문에

인스턴스 필드나 메소드, 그리고 this 키워드를 사용할 수 없다.

public class PlusClass{
  static int field1 = 15;
  int field2;

  void method1(){}
  static void method2(){}
  static int plusMethod(int x, int y){
    this.field2 = 10; // <-- x
    this.method1(); // <-- x
    field1 = 10; // <-- o
    method2(); // <-- o
  } 
}

간단하게 말하면, 인스턴스 성질은 객체 생성 후 사용할 수 있으므로

객체 참조 없이 사용하는 정적 메소드에는 사용할 수 없는 것이다.

 

 

2. Final

 

final은 "최종적인" 이라는 의미

즉 해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능하다는 의미이다.

 

final 필드에 값을 저장하는 방법은 다음 두 가지가 있다.

public class Shop{

  final int closeTime = 21;
  final int openTime;

  public Shop(int openTime){
    this.openTime = openTime;
  }
}

하나는 closeTime과 같이 선언과 동시에 값을 주는 방법이 있고

openTime과 같이 생성하고, 객체를 생성할 때 생성자 public Shop에 의해 값을 주는 방법이 있다.

 

모든 가게가 오픈 시간은 자유롭지만 한 번 정한 오픈 시간을 바꿀 수 없고, 21시에는 모두 닫아야 할 때

위와 같이 final 키워드를 이용하면, 오픈 시간은 객체마다 다르게 설정이 가능하지만, 닫는 시간은 고정되도록 코딩이 가능하다.

 

 

3. static final

 

static + final = "고정된 + 최종적인"의 의미로, 상수를 선언하고자 할 때 사용된다.

final만으로 충분히 상수가 되지 않느냐? 라는 질문에는 위에서 충분히 답이 됐을 거라고 본다.

 

상수란, fixed로 변하지 않는 값을 뜻하는데

위의 예시에서, closeTime은 21로 변하지 않지만, openTime은 객체마다 다를 수 있음을 보였으므로 final 자체만으로는 상수를 의미할 수 없다.

 

상수의 선언 방법 또한 간단하다.

static final double PI = 3.141592;

static + final로 선언된 PI 값은 3.141592라는 불변의 값을 가진다. 

해당 값은 객체마다 저장될 필요가 없으며(static의 성질) + 여러 값을 가질 수 없다(final의 특징).

 

 

정리하면, 다음과 같다.

static 객체마다 가질 필요가 없는 공용으로 사용하는 필드 혹은 인스턴스 필드를 포함하지 않는 메소드
final 한 번 값이 정해지고 나면 값을 바꿀 수 없는 필드
static final 모든 영역에서 고정된 값으로 사용하는 상수

 

'Java' 카테고리의 다른 글

[Java] public, protected, private의 차이  (0) 2020.12.08
[Tomcat/Mac] 톰캣 설치하고 실행하기  (0) 2020.11.24
    'Java' 카테고리의 다른 글
    • [Java] public, protected, private의 차이
    • [Tomcat/Mac] 톰캣 설치하고 실행하기
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바