생성자 함수는 객체가 생성될 때 호출되는 특별한 메서드로, 객체의 초기화를 담당.
클래스 이름과 동일한 이름을 가지며, 객체 생성 시에 new 키워드와 함께 호출된다.
생성자 함수는 리턴 타입을 가지지 않고, 심지어 void도 사용하지 않는다.
생성자 함수는 중복으로 정의(overload) 할 수 있다. 이를 통해 여러 개의 생성자를 만들어 다양한 초기화 방법을 제공할 수 있다. 이러한 기능을 중복 정의라고 하며, 이것은 메서드 이름은 동일하지만 매개변수의 타입, 개수, 순서가 다른 형태로 가능하다.
클래스를 정의할 때 생성자를 명시적으로 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 이를 "default constructor"라고 부른다.
하지만 사용자가 생성자 함수를 직접 정의하면 기본 생성자는 자동으로 만들어지지 않는다. 사용자가 생성자 함수를 재정의하는 경우, 기본 생성자의 기능은 상실되며, 필요하다면 명시적으로 정의해주어야 한다.
public class MyClass {
// 기본 생성자 (자동으로 생성됨)
public MyClass() {
System.out.println("기본 생성자 호출됨.");
}
// 중복 정의된 생성자 1
public MyClass(int value) {
System.out.println("중복 정의된 생성자 1 호출됨. 값: " + value);
// 객체를 제공된 값으로 초기화
}
// 중복 정의된 생성자 2
public MyClass(String name, int age) {
System.out.println("중복 정의된 생성자 2 호출. 이름: " + name + ",
나이: " + age); // 객체를 제공된 이름과 나이로 초기화
}
// 소멸자 (Java에는 명시적인 소멸자가 없음)
public static void main(String[] args) {
// 기본 생성자 사용
MyClass obj1 = new MyClass();
// 중복 정의된 생성자 1 사용
MyClass obj2 = new MyClass(42);
// 중복 정의된 생성자 2 사용
MyClass obj3 = new MyClass("John", 25);
// 객체는 자바 가비지 컬렉션에 의해 자동으로 소멸됨.
}
}
현재 객체를 가리키는 특별한 참조 변수
인스턴스 변수와 지역 변수 구분
: 메서드나 생성자 내에서 파라미터 이름이나 지역 변수의 이름이 인스턴스 변수와 동일할 경우, this를 사용하여 구분
public class MyClass {
private int myValue;
public void setMyValue(int myValue) {
// this를 사용하여 인스턴스 변수와 지역 변수를 구분
this.myValue = myValue;
}
}
다른 생성자 호출
: 한 생성자에서 다른 생성자를 호출할 때 사용할 수 있다. 이 때, this 키워드는 현재 클래스의 다른 생성자를 호출한다.
public class MyClass {
private int myValue;
// 첫 번째 생성자
public MyClass() {
this(0); // 다른 생성자 호출
}
// 두 번째 생성자
public MyClass(int myValue) {
this.myValue = myValue;
}
}
메서드 체이닝
: 메서드 호출을 연결하여 쓸 수 있도록 한다.
public class MyClass {
private int myValue;
public MyClass setMyValue(int myValue) {
this.myValue = myValue;
return this; // 메서드 체이닝을 위해 자기 자신을 반환
}
}
인스턴스 메서드 내에서 다른 메서드 호출
: 같은 객체의 다른 메서드를 호출할 때 사용
public class MyClass {
private int myValue;
public void process() {
// 다른 메서드 호출
doSomething(); // 여기서 this를 명시적으로 사용하지 않음
}
private void doSomething() {
// 작업 수행
}
}
Java에서 여러 컨텍스트에서 사용되는 키워드로, 변수, 메서드, 클래스 등에 적용된다. final 키워드가 사용되면 해당 요소는 변경될 수 없다.
final은 주로 안정성과 보안을 강화하며, 코드의 의도를 명확하게 전달하기 위해 사용됩니다.
public class Example {
// final 변수 선언
final int MAX_VALUE = 100;
public void display() {
// MAX_VALUE는 이제 상수로 값 변경이 불가능
System.out.println(MAX_VALUE);
}
}
public class Parent {
// final 메서드 선언
public final void display() {
System.out.println("Parent class");
}
}
public class Child extends Parent {
// 오류: display()를 오버라이드할 수 없음
// 컴파일 오류 발생
// public void display() {
// System.out.println("Child class");
// }
}
// final 클래스 선언
final public class FinalClass {
// 클래스의 내용
}
// 오류: FinalClass를 상속할 수 없음
// 컴파일 오류 발생
// public class SubClass extends FinalClass {
// // 클래스의 내용
// }
특별한 종류의 클래스로, 연관된 상수 집합을 정의할 때 사용
코드를 더 읽기 쉽고 유지보수하기 쉽게 만들어주며, 상수의 값이 변경되지 않도록 보장
Enum의 특징
상수의 집합
: Enum은 연관된 상수들의 집합을 정의한다.
예를 들어, 요일을 나타내는 Enum은 일요일, 월요일, 화요일, ..., 토요일과 같은 상수들을 가진다.
타입 안전성(Type Safety)
: Enum은 컴파일 시점에서 타입 안전성을 제공한다. 잘못된 상수 값을 사용하는 오류를 컴파일 단계에서 발견할 수 있다.
고정된 값
: Enum 상수들은 고정된 값이므로, 다른 코드에서 변경되지 않고 안전하게 사용될 수 있다.
코드 가독성 향상
: Enum을 사용하면 코드의 가독성이 향상된다. 의미 있는 상수명을 사용하여 코드를 작성할 수 있다.
Enum 선언 및 사용
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
public class EnumExample {
public static void main(String[] args) {
// Enum 상수 사용
Day today = Day.MONDAY;
// Enum 상수 비교
if (today == Day.MONDAY) {
System.out.println("Today is Monday!");
}
// Enum의 values 메서드로 모든 상수 순회
for (Day day : Day.values()) {
System.out.println(day);
}
}
}
값과 메서드 추가
: Enum은 필요에 따라 각 상수에 값을 할당하거나 메서드를 추가할 수 있다. SMALL("S"), MEDIUM("M"), LARGE("L");
private String abbreviation;
Size(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
}
Enum의 메서드 활용
: Enum 상수의 값을 가져오거나, 특정 Enum 상수에 대한 작업을 수행할 수 있다.
public class EnumMethodExample {
public static void main(String[] args) {
Size size = Size.MEDIUM;
// Enum의 메서드 호출
System.out.println("Size: " + size);
System.out.println("Abbreviation: " + size.getAbbreviation());
}
}