[Java] chapter7

Ryong·2023년 12월 13일
0

Java

목록 보기
8/12
post-thumbnail

생성자함수

생성자 함수는 객체가 생성될 때 호출되는 특별한 메서드로, 객체의 초기화를 담당.

클래스 이름과 동일한 이름을 가지며, 객체 생성 시에 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

현재 객체를 가리키는 특별한 참조 변수

인스턴스 변수와 지역 변수 구분 : 메서드나 생성자 내에서 파라미터 이름이나 지역 변수의 이름이 인스턴스 변수와 동일할 경우, 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() {
        // 작업 수행
    }
}

final

Java에서 여러 컨텍스트에서 사용되는 키워드로, 변수, 메서드, 클래스 등에 적용된다. final 키워드가 사용되면 해당 요소는 변경될 수 없다.
final은 주로 안정성과 보안을 강화하며, 코드의 의도를 명확하게 전달하기 위해 사용됩니다.

  1. final 변수
  • final 키워드가 변수 앞에 사용될 경우, 해당 변수는 상수가 된다.
  • 상수는 한 번 초기화되면 값을 변경할 수 없다.
  • 관례적으로 상수 이름은 모두 대문자로 작성되며, 단어 간에는 언더스코어( _ )를 사용하여 구분된다.
public class Example {
    // final 변수 선언
    final int MAX_VALUE = 100;

    public void display() {
        // MAX_VALUE는 이제 상수로 값 변경이 불가능
        System.out.println(MAX_VALUE);
    }
}
  1. final 변수
  • final 키워드가 메서드 앞에 사용될 경우, 해당 메서드는 하위 클래스에서 오버라이드할 수 없다.
  • 이는 메서드의 구현을 변경하지 못하게 하여 메서드가 부모 클래스에서 정의된 대로 동작하도록 보장한다.
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");
    // }
}
  1. final 클래스
  • final 키워드가 클래스 앞에 사용될 경우, 해당 클래스는 더 이상 상속될 수 없다.
  • 이 클래스는 다른 클래스가 이를 확장(상속)하지 못하게 됩니다.
// final 클래스 선언
final public class FinalClass {
    // 클래스의 내용
}

// 오류: FinalClass를 상속할 수 없음
// 컴파일 오류 발생
// public class SubClass extends FinalClass {
//     // 클래스의 내용
// }

열거형(Enum)

특별한 종류의 클래스로, 연관된 상수 집합을 정의할 때 사용
코드를 더 읽기 쉽고 유지보수하기 쉽게 만들어주며, 상수의 값이 변경되지 않도록 보장

  1. Enum의 특징
    상수의 집합: Enum은 연관된 상수들의 집합을 정의한다.
    예를 들어, 요일을 나타내는 Enum은 일요일, 월요일, 화요일, ..., 토요일과 같은 상수들을 가진다.
    타입 안전성(Type Safety): Enum은 컴파일 시점에서 타입 안전성을 제공한다. 잘못된 상수 값을 사용하는 오류를 컴파일 단계에서 발견할 수 있다.
    고정된 값 : Enum 상수들은 고정된 값이므로, 다른 코드에서 변경되지 않고 안전하게 사용될 수 있다.
    코드 가독성 향상: Enum을 사용하면 코드의 가독성이 향상된다. 의미 있는 상수명을 사용하여 코드를 작성할 수 있다.

  2. 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);
        }
    }
}
  1. Enum의 추가 기능
    값과 메서드 추가 : 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());
    }
}
profile
새로운 시작. 그리고 도약

0개의 댓글