static 메서드 - 1
package static2;
public class DecoMain2 {
public static void main(String[] args) {
String s = "hello java";
String deco = DecoUtil2.deco(s);
System.out.println("before " + s);
System.out.println("after " + deco);
}
}
package static2;
public class DecoUtil2 {
public static String deco(String str) {
String result = "*" + str + "*";
return result;
}
}
DecoUtil2 는 메서드 앞에 static이 붙어있다. 이렇게 하면 정적 메서드를 만들 수 있다.
정적 메서드는 정적 변수처럼 인스턴스 생성 없이 클래스명을 통해서 바로 호출할 수 있다.
클래스 메서드
메서드 앞에도 static을 붙일 수 있다. 이것을 정적 메서드 또는 클래스 메서드라 한다. 정적 메서드라는 용어는 static이 정적이라는 뜻이기 때문이고, 클래스 메서드라는 용어는 인스턴스 생성 없이 클래스에 있는 메서드를 바로 호출하는 것처럼 느껴지기 때문이다.
인스턴스 메서드
static이 붙지 않는 메서드는 인스턴스를 생성해야 호출할 수 있다. 이것을 인스턴스 메서드라 한다.
static 메서드 - 2
- static 메서드는 static만 사용할 수 있다.
- 정적 메서드는 static이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.
- 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
- 모든 곳에서 static을 호출할 수 있다.
- 정적 메서드는 공용 기능이다. 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있다.
package static2;
public class DecoData {
private int instanceValue;
private static int staticValue;
public static void staticCall() {
//instanceValue++;
//instanceMethod();
staticValue++;
staticMethod();
}
public void instanceCall(){
instanceValue++; // 인스턴스 변수 접근
instanceMethod(); //인스턴스 메서드 접근
staticValue++; //정적 변수 접근
staticMethod(); //정적 메서드 저근
}
public void instanceMethod(){
System.out.println("instanceValue=" + instanceValue);
}
public static void staticMethod(){
System.out.println("staticValue=" + staticValue );
}
}
static 메서드 - 3
static import
정적 메서드를 사용할 때 해당 메서드를 자주 호출한다면 static import 기능을 추천한다.
DecoData.staticCall();
DecoData.staticCall();
DecoData.staticCall();
import static static2.DecoData.staticCall;
staticCall();
staticCall();
staticCall();
import static은 정적 메서드 뿐만 아니라 정적 변수에도 사용할 수 있다.
main() 메서드는 정적 메서드
인스턴스 생성 없이 실행하는 가장 대표적인 메서드가 바로 main() 메서드이다.
main() 메서드는 프로그램을 시작하는 시작점이 되는데, main() 메서드가 static이기 때문이다.
정적 메서드는 정적 메서드만을 호출할 수 있다. 따라서 main() 메서드가 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해서 사용해야한다.
package static2.ex;
public class test {
public static void main(String[] args) {
test1();
}
static void test1() {
}
}
Final
final 은 변수에 final 키워드가 붙으면 더는 값을 변경할 수없다.
final은 class, method를 포함한 여러 곳에 붙을 수 있다.
package final1;
public class FinalLocalMain {
public static void main(String[] args) {
final int data1;
data1 = 10; // 최초 한번만 할당 가능
//data1 = 20; // 컴파일 오류
//final 지역 변수2
final int data2 = 10;
//data2 = 20; //컴파일 오류
method(10);
}
static void method(final int parameter){
//parameter = 20; //컴파일 오류
}
}
final을 지역 변수에 설정할 경우 최초 한번만 할당할 수 있다. 이후에 변수의 값을 변경하려면 컴파일 오류가 발생한다.
매개변수에 final이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다. 메서드 호출 시점에 사용된 값이 끝까지 사용된다.
package final1;
public class ConstructInit {
final int value;
public ConstructInit(int value) {
this.value = value;
}
}
final을 필드에 사용할 경우 해당 필드는 생성자를 통해서 한번만 초기화 될 수 있다.
package final1;
public class FieldInit {
static final int CONST_VALUE = 10;
final int value = 10;
}
final 필드를 필드에서 초기화하면 이미 값이 설정되었기 때문에 생성자를 통해서도 초기화 할 수 없다.
상수
상수는 변하지 않고, 항상 일정한 값을 갖는 수를 말한다. 자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 상수라 한다.
자바 상수는 static final 키워드를 사용한다.
대문자를 사용하고 구분은 _(언더스코어)로 한다. - 일반적인 변수와 상수를 구분하기 위해
상수는 중앙에서 값을 하나로 관리할 수 있다는 장점도 있다.
상수는 런타임에 변경할 수 없다. 상수를 변경하려면 프로그램을 종료하고, 코드를 변경한 다음에 프로그램을 다시 실행해야 한다.
final 변수와 참조
package final1;
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data();
//data = new Data(); //final 변경 불가 컴파일 오류
//참조 대상의 값은 변경 가능
data.value = 10;
System.out.println(data.value);
data.value = 20;
System.out.println(data.value);
}
}
참조형 변수 data에 final이 붙었다. 변수 선언 시점에 참조값을 할당했으므로 더는 참조값을 변경할 수 없다.
참조 대상의 객체 값은 변경할 수 있다.
- 참조형 변수 data에 final이 붙었다. 참조 값을 다른 값으로 변경하지 못하지만, Data.value는 final이 아니기 때문에 값을 변경할 수 있다.
Reference
김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런
김영한 | , 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다? 이걸로는 안됩니다!전 우아한형제들 기술이사, 누적 수강생 40만 명 돌
www.inflearn.com
'JAVA' 카테고리의 다른 글
김영한의 실전 자바 기본편 - 5일차 (0) | 2025.04.20 |
---|---|
김영한의 실전 자바 기본편 - 4일차 (0) | 2025.04.13 |
김영한의 실전 자바 기본편 - 3일차 (0) | 2025.04.06 |
김영한의 실전 자바 기본편 - 2일차 (0) | 2025.03.30 |
김영한의 실전 자바 기본편 - 1일차 (0) | 2025.03.27 |