2022.09.02 Java 객체지향 프로그래밍 기초(2)
1. 생성자
- 생성자의 개요
인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드
생성자는 메서드와 비슷한 구조를 가지고 있지만 크게 두 가지 부분에서 큰 차이가 있다.
- 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
- 생성자는 리턴 타입이 없다.
클래스명(매개변수) { // 생성자 기본 구조
...생략...
}
생성자도 메서드의 일부이기 때문에 오버로딩이 가능하다 따라서, 한 클래스 내에 여러 개의 생성자가 존재할 수 있다.
- 기본 생성자 vs 매개변수가 있는 생성자
- 기본 생성자(Default Constructor)
모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 합니다.
따로 생성자를 만들지 않아도 정상적으로 인스턴스 생성이 되는 것은 자바 컴파일러가 자동으로 생성자를 만들기 때 문입니다.
- 매개변수가 있는 생성자
매개변수가 있는 생성자를 사용하게 되면 인스턴스를 만든 후에 인스턴스의 필드값을 일일이 설정해줄 필요 없이 생 성과 동시에 원하는 값으로 설정해줄 수 있어서 굉장히 편리합니다.
매개변수가 있는 경우에는 개수와 타입에 알맞게 생성자를 호출해주어야 합니다.
- this vs this()
- this()
같은 클래스 안에 메서드들끼리 서로 호출할 수 있었던 것처럼 생성자도 상호 호출이 가능합니다. 이를 위해서
사용하는 것이 바로 this() 메서드입니다.
this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용합니다.
this() 메서드를 사용하귀 위한 조건
- this() 메서드는 반드시 생성자의 내부에서만 사용할 수 있다.
- this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.
- this 키워드
인스턴스의 변수와 매개변수를 이름만으로 구분하기가 어려워지는 문제를 해소해주기 위해 주로 사용되는 방법이
this 키워드이다
this는 인스턴스 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this를 통해서
인스턴스 자신의 변수에 접근할 수 있다.
2. 내부 클래스
내부 클래스는 클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용합니다.
class Outer { // 외부 클래스
class Inner {
// 인스턴스 내부 클래스
}
static class StaticInner {
// 정적 내부 클래스
}
void run() {
class LocalInner {
// 지역 내부 클래스
}
}
}
위의 코드를 보면 알 수 있듯이 내부 클래스의 종류는 인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스로 구분할 수 있습니다.
선언 위치에 따른 내부 클래스 구분
종류 | 선언 위치 | 사용 가능한 변수 |
인스턴스 내부 클래스(instance inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 인스턴스 변수, 외부 전역 변수 |
정적 내부 클래스(static inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 전역 변수 |
지역 내부 클래스(local inner class) | 외부 클래스의 메서드나 초기화블럭 안에 선언 | 외부 인스턴스 변수, 외부 전역 변수 |
익명 내부 클래스(anonymous inner class) | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 | 외부 인스턴스 변수, 외부 전역 변수 |
- 멤버 내부 클래스
인스턴스 내부 클래스와 정적 내부 클래스를 하나로 묶어 멤버 내부 클래스라 통칭
- 인스턴스 내부 클래스
인스턴스 내부 클래스는 객체 내부의 멤버의 형태로 존재하며, 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.
인스턴스 내부 클래스는 외부 클래스의 내부에 위치해 있으며, private 접근 제어자를 사용하고 있음에도 내부에서 외부 클래스의 인스턴스 변수와 정적 변수에 각각 접근하여 해당 값을 사용할 수 있다.
주의사항으로 인스턴스 내부 클래스는 반드시 외부 클래스를 생성한 이후에 사용해야 한다.
- 정적 내부 클래스
내부 클래스가 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있게 하려고 사용하는 클래스
인스턴스 내부 클래스와 동일하게 클래스의 멤버 변수 위치에 정의하지만, static 키워드를 사용한다는 점에서 차이가 있다. - 지역 내부 클래스
지역 내부 클래스는 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스
지역 내부 클래스도 지역 변수와 유사하게 메서드 내부에서만 사용가능하기 때문에 일반적으로 메서드 안에서 선언 후에 바로 객체를 생성해서 사용