1. 개요

1.1. 값을 하드 코딩하지 않는다!

  • 문자열, 숫자 등의 값을 하드 코딩하지 마라. 상수(static final)를 만들고 이름을 부여해 이 변수의 역할이 무엇인지 의도를 드러내자.
    • 우테코 2주차 웹 백엔드 피드백 내용
  • 매직넘버 사용을 피하자.
    • 매직 넘버(magic number)란?
      코드 내에서 사용된 숫자 또는 값으로, 해당 숫자가 코드 내에서 직접 사용되는데 별다른 설명이나 의미가 분명히 주석이나 상수로 나타나지 않는 경우를 가리킵니다.

1.2. 하드코딩이란?

  • 하드코딩은 소프트웨어 개발에서 값이나 조건을 코드에 직접 입력하는 것을 가리킵니다. 이는 프로그램 내에서 값을 하드코딩하면 그 값을 변경하거나 업데이트할 때 문제가 발생할 수 있는 것을 의미합니다.

  • 값을 하드코딩하는 것은 코드 내에서 직접 숫자, 문자열 또는 기타 값들을 사용하는 것을 의미합니다.

2. 상수

2.1. 상수란?

  • 상수(constant)란, 프로그래밍에서 변하지 않는 값을 가리키며, 그 값이 한 번 할당되면 그 이후에 변경되지 않는 변수를 의미합니다.

2.1.1 목적

  • 상수를 사용함으로써 값의 의미를 명확하게 하고, 코드 내에서 사용된 값들을 일일이 찾아 수정하는 일을 피할 수 있습니다. 이것은 코드를 읽기 쉽게 만들어주며, 잠재적인 오류를 줄여줍니다.

2.1.2 특징

  • 상수를 사용하면 코드의 유지보수가 용이해지며, 값을 변경해야 할 때 해당 값을 참조하고 있는 모든 곳에서 일일히 변경하지 않아도 되기 때문에 실수를 줄일 수 있습니다.
  • 예를 들어, 프로그램에서 에러가 난 경우 에러코드/에러메시지를 보여줄 때, 프로그램의 기본적인 환경설정정보(DB정보, IP주소정보 등)를 설정할 때 상수를 사용해줍니다.
  • 프로그램이 실행되고 끝날 때까지 변하지 않는 값일 경우, 상수를 사용하면 다른 개발자가 보았을 때 가독성도 높여줍니다.
  • 값을 일관되게 사용하여 프로그램 전체에서 일관성을 유지합니다.

2.2. final

  • 변수이기는 하지만 마치 상수처럼 정해진 값 이외의 다른 값을 가질 수 없도록 하기 위하여 변수명 앞에 final 을 써줍니다.

final의 위치 : 아래 항목 이름 앞에 위치

  1. 변수명: 변수이지만 값을 바꿀 수 없는 상수로 사용할 때,
  2. 메소드명: 오버라이딩 금지
  3. 클래스명: 상속 금지

특징

  1. 값의 불변성(Immutability): 상수는 한 번 할당되면 값을 변경할 수 없습니다.
  2. 대문자 및 밑줄 사용: 상수의 관례는 대문자를 사용하고, 여러 단어가 결합된 경우 밑줄(_)로 단어를 구분합니다.
  • 보통 'static' 키워드를 함께 사용하여 클래스 수준의 변수로 만들어 여러 곳에서 접근할 수 있도록 할 수 있습니다.
    • 어차피 값 변경 불가능하기 때문에 굳이 객체마다 별도의 메모리 확보할 필요 없음.

2.3. static

  • static 키워드는 클래스 수준의 변수로 만들어 여러 곳에서 접근 가능하도록 합니다. 이러한 상수를 사용하면 프로그램의 여러 부분에서 동일한 값을 사용할 때 일관성을 유지하고 유지보수를 쉽게 할 수 있습니다.
  • static: static 키워드는 변수나 메서드를 클래스 수준에 바인딩시키는 데 사용됩니다. 즉, 해당 변수는 클래스에 속하며, 인스턴스가 생성되지 않아도 클래스명을 통해 접근 가능합니다. 또한, static 키워드가 지정된 변수는 프로그램이 시작될 때 메모리에 할당되며, 프로그램이 종료될 때까지 유지됩니다.

2.3.1 보충 설명 : <인스턴스가 생성되지 않아도 클래스명을 통해 접근 가능합니다.>의 의미

인스턴스가 생성되지 않아도라는 부분는 static으로 지정된 변수나 메서드가 클래스 자체에 속하며, 해당 클래스의 인스턴스(객체)를 생성하지 않아도 클래스명을 통해 직접 접근 가능하다는 것을 의미합니다.

일반적으로 클래스를 사용하여 객체(인스턴스)를 생성하고, 이 객체를 통해 클래스 내의 변수나 메서드에 접근합니다. 하지만 static 키워드가 지정된 변수나 메서드는 클래스 수준에 속하기 때문에 객체(인스턴스)를 생성하지 않고도 클래스명을 통해 직접 접근할 수 있습니다.

예를 들어, 다음과 같이 static으로 선언된 변수를 사용한 클래스가 있다고 가정해봅시다:

public class Example {
	public static int count = 0;
}

이 경우 count 변수는 static으로 선언되었기 때문에, Example.count와 같이 클래스명을 통해 직접 변수에 접근할 수 있습니다. 객체(인스턴스)를 생성하지 않고도 Example.count로 변수에 접근할 수 있습니다.

int currentcount = Example.count; // 클래스명을 통해 직접 접근

따라서, static으로 지정된 변수나 메서드는 객체(인스턴스) 생성과는 무관하게 프로그램 시작과 동시에 메모리에 할당되며, 프로그램이 종료될 때까지 존재하는 특성을 가지고 있습니다.

인스턴스를 생성해야 하는 경우

자바에서는 new 키워드를 사용하여 클래스의 생성자를 호출하여 인스턴스를 만듭니다.

클래스에는 생성자(Constructor)라는 특별한 메서드가 존재하며, 이 생성자를 사용하여 클래스의 객체(인스턴스)를 생성합니다. 보통 생성자는 클래스와 같은 이름을 가지고 있습니다.

아래는 클래스의 인스턴스를 생성하는 방법입니다:

public class MyClass {
    // 클래스 내용
}

// 클래스 외부에서 인스턴스 생성
MyClass myObject = new MyClass();

위 예시에서 MyClass는 클래스의 이름이고, myObject는 클래스 MyClass의 새로운 인스턴스를 참조하기 위한 변수입니다. new 키워드를 사용하여 MyClass() 생성자를 호출하여 myObject라는 인스턴스를 생성합니다.

이렇게 생성된 myObject는 클래스 MyClass의 특성을 갖는 새로운 개별 객체(인스턴스)입니다. 이제 myObject를 사용하여 해당 클래스에 정의된 변수, 메서드 등을 활용할 수 있습니다.

// 예시: 인스턴스 변수에 접근
myObject.someVariable = 10;

// 예시: 인스턴스 메서드 호출
myObject.someMethod();

인스턴스를 생성하면, 해당 클래스의 특성을 가진 객체가 메모리에 할당되며, 해당 객체를 통해 클래스 내부의 변수나 메서드에 접근할 수 있습니다.


3. 정리

finalstatic를 함께 사용하여 상수를 정의할 때, final 키워드는 값을 변경할 수 없도록 하고, static 키워드는 클래스 수준에 변수를 배치하여 인스턴스마다 별도의 값이 아닌 클래스 전체에서 동일한 값으로 사용할 수 있도록 합니다.

예를 들어, 자바에서 상수를 정의할 때 :

public class Constants {
	public static final double PI = 3.14159;
}

여기서 PIfinal 키워드로 값이 변경되지 않는 상수이고, static 키워드로 클래스 수준에 있어 인스턴스와 관계없이 Constants.PI로 접근할 수 있습니다.

이와 같이 finalstatic를 함께 사용하여 정의된 상수는 값이 변하지 않고 클래스 수준에서 사용 가능하므로 일반적으로 상수를 나타내는 데 사용됩니다.


4. 연관

4.1. 인터페이스

  • 인터페이스는 완전 추상의 개념으로 추상 메서드와 상수만으로 구성됩니다.
  • 완전 추상이기 때문에 abstract 이라는 키워드를 생략해도 자동 abstract 입니다.
  • 또, final 을 생략해도 자동 final 입니다.
  • 자바에서는 클래스의 다중 상속이 금지 되어있습니다.
  • 다중 상속의 효과를 기대할 목적으로 “인터페이스”를 이용합니다.

참고

profile
Developer

0개의 댓글