TIL
TIL_20220905
번잔중
2022. 9. 5. 20:07
오늘 할 일
🌊 코드스테이츠 12일차
- 생성자
- 내부 클래스
- 심화 학습
- 1일 1커밋
- 코드업 100제 1059-1088
오늘 배운 것
🌪 생성자(Constructor)
생성자
객체를 생성하는 역할을 하는 클래스의 구성 요소이다. 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드라고 볼 수 있다.
new 키워드로 객체를 생성할 때, 호출되는 것이 생성자이다. 생성자는 인스턴스 변수들을 초기화하는 데에 사용되는 특수한 메서드이다.
특징
언뜻 비슷한 구조를 가진 것 같지만 차이가 있다.
- 생성자의 이름은 클래스와 같아야 한다. 만약 클래스 이름과 생성자 이름이 다르다면 생성자의 기능을 수행할 수 없다.
- 생성자는 리턴 타입이 없다. void 키워드도 사용하지 않는다. 그냥 리턴 타입 자체가 없기 때문이다.
- 생성자도 오버로딩이 가능하다.
생성자 또한 오버로딩이 가능하기 때문에 한 클래스 내에 여러 개의 생성자가 존재할 수 있다.
클래스명(매개변수) { // 생성자 기본 구조
...생략...
}
public class ConstructorExample {
public static void main(String[] args) {
Airplane ap = new Airplane("F-18", "Silver", 1400);
Airplane ap1 = new Airplane();
System.out.println("저 비행기는 " + ap.getModelName() + "이고, 컬러는 " + ap.getColor() + "입니다.");
}
}
class Airplane {
private String modelName;
private String color;
private int maxSpeed;
public Airplane() { // 생성자 1
System.out.println("Maverick");
}
public Airplane(String modelName, String color, int maxSpeed) { // Airplane의 매개변수가 있는 생성자 2
this(); // Airplane()과 같다.
this.modelName = modelName; // this 키워드는 인스턴스 변수와 매개변수를 구분하기 위해 사용한다.
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getModelName(){
return modelName;
}
public String getColor() {
return color;
}
}
기본 생성자 vs 매개변수가 있는 생성자
기본 생성자
모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 한다. 여태 따로 만들어주지 않았지만 괜찮았던 이유는 자바 컴파일러가 생성자를 자동으로 추가해줬기 대문이다.
생성자가 이미 추가되어있는 경우에는 기본 생성자가 아니라 이미 추가되어 있는 생성자를 기본으로 사용한다.
클래스명(){} //기본 생성자
DefaultConst(){} // 예시) DefaultConst 클래스의 기본 생성자
매개변수가 있는 생성자
매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는 데 사용된다. 고유한 특성을 가진 인스턴스를 계속 만들어야하는 경우 인스턴스마다 각기 다른 값을 가지고 초기화할 수 있어서 매우 유용하다.
인스턴스의 필드값을 일일이 설정해줄 필요없이 생성과 동시에 원하는 값으로 설정해줄 수 있어서 편리하다.
public class ConstructorExample {
public static void main(String[] args) {
Airplane ap = new Airplane("F-18", "Silver", 1400);
Airplane ap1 = new Airplane();
System.out.println("저 비행기는 " + ap.getModelName() + "이고, 컬러는 " + ap.getColor() + "입니다.");
}
}
class Airplane {
private String modelName;
private String color;
private int maxSpeed;
public Airplane(String modelName, String color, int maxSpeed) { // Airplane의 매개변수가 있는 생성자
this(); // Airplane()과 같다.
this.modelName = modelName; // this 키워드는 인스턴스 변수와 매개변수를 구분하기 위해 사용한다.
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getModelName(){
return modelName;
}
public String getColor() {
return color;
}
}
this vs this()
this()
같은 클래스 내에 있는 다른 생성자를 상호 호출하기 위해 this() 메서드를 사용한다. this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.
this() 메서드를 사용하기 위한 문법요소
- this() 메서드는 반드시 생성자의 내부에서만 사용할 수 있다.
- this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.
public class Test {
public static void main(String[] args) {
Example example = new Example();
Example example2 = new Example(5);
}
}
class Example {
public Example() {
System.out.println("Example의 기본 생성자 호출!");
};
public Example(int x) {
this(); // 생성자 내부의 첫 줄에 위치
System.out.println("Example의 두 번째 생성자 호출!");
}
}
//Output
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!
this 키워드
자바 프로그래밍에서 메서드의 지역 변수명이 필드명과 동일하게 구성되어 있는 것이 보통이다. 그래서
인스턴스 변수와 매개변수를 이름만으로는 구분하기가 어려워지는 문제가 발생하게 되는데, 이를 구분해주기 위한 용도로 주로 사용되는 방법이 this 키워드이다.
this는 인스턴스 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this를 통해서 인스턴스 자신의 변수에 접근할 수 있는 것이다.
public class ConstructorExample {
public static void main(String[] args) {
Airplane ap = new Airplane("F-18", "Silver", 1400);
Airplane ap1 = new Airplane();
System.out.println("저 비행기는 " + ap.getModelName() + "이고, 컬러는 " + ap.getColor() + "입니다.");
}
}
class Airplane {
private String modelName;
private String color;
private int maxSpeed;
public Airplane(String modelName, String color, int maxSpeed) { // Airplane의 매개변수가 있는 생성자
this(); // Airplane()과 같다.
this.modelName = modelName; // this 키워드는 인스턴스 변수와 매개변수를 구분하기 위해 사용한다.
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getModelName(){
return modelName;
}
public String getColor() {
return color;
}
}
this와 this()의 차이점
this | this() |
인스턴스 자신을 가리키는 참조 변수 | 같은 클래스의 다른 생성자 호출할 때 사용 |
인스턴스의 주소가 저장 | 조건 - 클래스 이름 대신 this 사용 - 반드시 첫 줄에 정의 |
주로 인스턴스 변수와 매개변수로 정의된 지역 변수를 구분하는 데에 사용 | - |
내부 클래스(Inner Class)
내부 클래스
클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.
외부 클래스 내에 선언된 클래스를 내부 클래스라고 한다. 사용의 편의성을 위해 만들어진 문법 요소이다.
장점
- 외부 클래스의 멤버들에 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다.
- 외부적으로 불필요한 데이터를 감출 수 있어 객체지향의 중요한 핵심 원칙인 캡슐화(Encapsulation)을 달성하는 데 유용하다.
- 클래스 변수, 인스턴스 변수, 지역 변수를 나누는 기준과 매우 유사하다.
종류 | 선언 위치 | 사용가능한 변수 |
인스턴스 내부 클래스(instance inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 인스턴스 변수, 외부 전역 변수 |
정적 내부 클래스(static inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 전역 변수 |
지역 내부 클래스(local inner class) | 외부 클래스의 메서드나 초기화블럭 안에 선언 | 외부 인스턴스 변수, 외부 전역 변수 |
익명 내부 클래스(anonymous inner class) | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 | 외부 인스턴스 변수, 외부 전역 변수 |
멤버 내부 클래스
인스턴스 내부 클래스
객체 내부에 멤버의 형태로 존재하며, 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.
- 접근 제어자의 종류와는 상관 없이 내부에서 외부 클래스의 인스턴스 변수와 정적 변수에 접근하여 해당 값을 사용할 수 있다.
- 반드시 외부 클래스를 생성한 이후에 사용해야 한다. 그래서 클래스의 생성과 관계 없이 사용할 수 있는 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 선언할 수 없다.
정적 내부 클래스
내부 클래스가 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있다.
지역 내부 클래스
메서드 내에서 정의되는 클래스, 일반적으로 메서드 안에서 선언 후에 바로 객체를 생성해서 사용한다.
느낀점
- 이론을 위주로 읽어볼 때는 시간이 꽤나 오래 걸렸지만 천천히 이해하려고 노력했다. 이해하기 어려운 부분은 코드를 작성해보며 하나씩 이해했다.
- 생성자라는 말이 익숙하지가 않아서 같은 부분을 여러번 읽었다. 그림도 그려보고 하면서 용어 자체에 익숙해진 것 같다.
- 심화 과제로 생성자와 this를 사용해서 간단한 게임을 만들었다. 시작할 때는 자신이 없었는데, 구글링도 하고 배웠던 것을 떠올려가며 만들어보니 생각보다 금방 만들어서 기분이 좋았다. 역시 백문이불여일타
- 개인적으로 주어지는 시간이 많으면 나태해질 때가 있다. 비가 쏟아지는 날씨에 더 처지는 기분이지만 그래도 시간 내에 완수해서 안도했다.
내일 할 일
☕️ 코드스테이츠 13일차
- 상속
- 캡슐화
- 1일 1커밋
- 밤 9시 알고리즘 스터디