자바 기초 문법 중 실무와 협업 환경에서 코드의 안정성과 재사용성을 높이는 데 필수적인
5가지 핵심 개념(상수, 오버로딩, 생성자, this 생성자, 가변인자)을 정리했습니다.
1. 상수 (final)
final 키워드는 변수를 선언할 때 할당된 값을 더 이상 변경할 수 없도록 고정합니다.
왜 사용하는가?
협업 시 절대 변경되어서는 안 되는 설정값이나 기준값을 정의할 때 사용합니다.
누군가 값을 수정하려고 시도하면 컴파일 단계에서 에러가 발생하므로, 런타임 이전에 코드의 훼손을 방지할 수 있습니다.
예시 코드
도서 관리 시스템에서 도서의 '최대 대여 가능 일수'는 모든 책에 동일하게 적용되며, 로직 내에서 임의로 변경되어서는 안 됩니다.
public class Book {
// 1. final을 활용한 상수 선언
// 네이밍 관례에 따라 대문자와 언더스코어(_)를 사용하여 명확히 구분합니다.
public static final int MAX_BORROW_DAYS = 14;
public void tryToChangePolicy() {
// 2. 상수에 새로운 값을 할당하려는 시도
// MAX_BORROW_DAYS = 21;
// 컴파일 에러 발생: Cannot assign a value to final variable 'MAX_BORROW_DAYS'
}
}
비즈니스 로직상 절대 변하면 안 되는 설정값(예: 타임아웃, 최대 접속 횟수 등)을 정의할 때 사용합니다.
런타임 환경에서 발생할 수 있는 데이터 오염을 코드 작성 단계(컴파일 타임)에서 완벽하게 차단할 수 있습니다.
2. 메서드 오버로딩 (Method Overloading)
동일한 클래스 내에서 메서드 이름이 같더라도 파라미터의 개수나 타입이 다르면 자바 컴파일러는 이를 서로 다른 메서드로 인식합니다.
예시 코드
하나의 목적(예: 정보 설정)을 가진 메서드들을 같은 이름으로 묶어냅니다.
public class Product {
public void setInfo() { ... } // 파라미터 없음
public void setInfo(String title) { ... } // 파라미터 1개 (String)
public void setInfo(int price) { ... } // 파라미터 1개, 타입 다름 (int)
public void setInfo(String title, int price) { ... } // 파라미터 2개
}
메서드 호출자는 파라미터의 조합이 달라도 setInfo라는 하나의 일관된 메서드 이름만 기억하면 됩니다.
이는 API 설계 시 사용자 편의성을 높이고 인터페이스의 일관성을 유지하는 데 크게 기여합니다.
3. 생성자 (Contstructor)
생성자는 객체(인스턴스)가 메모리에 생성되는 순간 최초로 단 한 번만 호출되는 특수한 메서드입니다.
일반 메서드와 달리 임의로 계속 호출할 수 없습니다.
클래스 내에 생성자가 하나도 없다면, 컴파일러가 내용이 없는 '기본 생성자'를 자동으로 만들어줍니다.
단, 생성자 역시 오버로딩이 가능하기 때문에 파라미터가 있는 생성자를 하나라도 명시적으로 정의했다면,
컴파일러는 더 이상 기본 생성자를 자동으로 제공하지 않습니다.
예시 코드
public class User {
private String name;
// 파라미터가 있는 생성자를 명시적으로 정의
public User(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
// 컴파일 에러 발생: Expected 1 arguments but found 0
// 컴파일러가 기본 생성자를 지워버렸기 때문에 에러가 발생합니다.
// User user1 = new User();
// 정상적인 객체 생성
User user2 = new User("홍길동");
}
}
객체가 생성될 때 반드시 필요한 필수 값(위 예제에서는 name)을 강제로 주입받도록 설계하여,
속성값이 비어있는 불완전한 상태의 객체가 생성되는 것을 구조적으로 방지합니다.
만약 프레임워크나 라이브러리 사용 등의 이유로 파라미터가 없는 기본 생성자도 함께 필요하다면,
public User() {} 형태로 반드시 직접 명시해 주어야 합니다.
4. this() 생성자
this() 키워드는 클래스 내부의 한 생성자에서 자신의 또 다른 생성자를 호출할 때 사용합니다.
파라미터의 개수와 타입에 일치하는 다른 생성자를 찾아 실행합니다.
예시 코드
public class BookData {
private String title;
private int price;
public BookData(String title) {
// 제목만 입력받을 경우, 가격을 기본값 10000원으로 고정하여 아래 생성자 호출
this(title, 10000);
}
public BookData(String title, int price) {
this.title = title;
this.price = price;
}
}
여러 생성자에서 공통으로 처리해야 하는 초기화 로직을 하나의 생성자에 몰아두고 this()로 호출합니다.
이는 코드의 중복을 제거하고, 추후 로직 변경 시 수정 포인트를 하나로 줄여 유지보수성을 극대화합니다.
5. 가변인자
'타입... 변수명' 형태로 선언하며, 파라미터로 전달받는 인자의 개수가 몇 개이든 동적으로 모두 수용할 수 있는 문법입니다.
내부적으로는 배열 형태로 안전하게 처리됩니다.
예시 코드
public class Logger {
public void printLogs(String... messages) {
for (String msg : messages) {
System.out.println(msg);
}
}
public void run() {
printLogs("Error Code: 404"); // 1개 전달
printLogs("Start", "Loading", "Done"); // 개수 제한 없이 쉼표로 나열하여 전달
}
}
호출 시 전달할 데이터의 개수가 유동적일 때, 번거롭게 배열을 따로 생성해서 넘길 필요 없이
쉼표(,)를 통해 직접 값들을 나열할 수 있어 유연하고 깔끔한 API를 설계할 수 있습니다.
'language study > java | 문제풀이' 카테고리의 다른 글
| [Java] 알고리즘 기초 : 배열과 리스트, 언제 무엇을 쓸까? (1) | 2026.05.11 |
|---|---|
| [Java] 메서드 파라미터 전달 방식 : Call by Value - 값과 주소값 전달 차이 (0) | 2026.05.11 |
| [Java] 객체지향 기초: this와 static (클래스 변수와 클래스 메서드) (1) | 2026.05.06 |
| [Java] 객체지향 기초 : 클래스와 메서드 (0) | 2026.05.06 |
| [Java] 기본 문법 학습 정리 (1) | 2026.05.05 |