Chapter 1. 생성자
학습 목표
- 생성자의 핵심 개념과 기본 문법을 이해하고 사용할 수 있다.
- 생성자가 메서드와 구분되는 두 가지 차이를 이해하고 설명할 수 있다.
- 메서드 오버로딩이 생성자에서 어떻게 구현될 수 있는 지 확인하고 이해할 수 있다.
- 기본 생성자와 매개변수가 있는 생성자의 차이를 설명할 수 있다.
- this 와 this() 의 차이에 대해 설명할 수 있다.
생성자(Constructor)
객체를 생성하는 역할을 하는 클래스의 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드다.
메서드와 비슷하다고 생각되지만 두 가지 차이점이 있다.
첫 번째, 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
두 번째, 생성자는 리턴 타입이 없다.
생성자의 기본 구조는 아래와 같다.
클래스명(매개변수) {
...
}
생성자도 오버로딩이 가능하므로 매개변수의 타입, 개수에 따라 한 클래스 내에 여러 개의 생성자가 존재할 수 있다.
public class ConstructorExample {
public static void main(String[] args) {
Constructor constructor1 = new Constructor();
Constructor constructor2 = new Constructor("Hello World");
Constructor constructor3 = new Constructor(5,10);
}
}
class Constructor {
Constructor() { // (1) 생성자 오버로딩
System.out.println("1번 생성자");
}
Constructor(String str) { // (2)
System.out.println("2번 생성자");
}
Constructor(int a, int b) { // (3)
System.out.println("3번 생성자");
}
}
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 키워드
인스턴스 변수와 매개변수 이름으로 구분이 어려울 때, 이를 구분하기 위해 사용한다.
public class ConstructorExample {
public static void main(String[] args) {
Car car = new Car("Model X", "빨간색", 250);
System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " + car.getColor() + "입니다.");
}
}
class Car {
private String modelName;
private String color;
private int maxSpeed;
public Car(String modelName, String color, int maxSpeed) {
this.modelName = modelName;
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getModelName() {
return modelName;
}
public String getColor() {
return color;
}
}
//Output
제 차는 Model X이고, 컬러는 빨간색입니다.
위 코드에서 this.modelName = modelName; 대신 modelName = modelName; 을 사용하게 된다면,
두 개의 modelName 모두 지역 변수로 간주된다.
Chapter 2. 내부 클래스
학습 목표
- 내부 클래스의 기본 개념과 장점에 대해 이해할 수 있다.
- 선언 위치에 따른 내부 클래스의 종류와 특징에 대해 이해하고 설명할 수 있다.
- 내부 클래스의 종류에 따른 유효 범위와 접근성을 이해할 수 있다.
내부 클래스는 클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.
내부 클래스를 사용하면 외부 클래스의 멤버들에 쉽게 접근할 수 있고 코드의 복잡성을 줄일 수 있다.
또한 외부적으로 불필요한 데이터를 감출 수 있어서 캡슐화를 달성하는데 유용하다.
class Outer { // 외부 클래스
class Inner {
// 인스턴스 내부 클래스
}
static class StaticInner {
// 정적 내부 클래스
}
void run() {
class LocalInner {
// 지역 내부 클래스
}
}
}
종 류 선언 위치 사용 가능한 변수
인스턴스 내부 클래스(instance inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 인스턴스 변수, 외부 전역 변수 |
정적 내부 클래스(static inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 전역 변수 |
지역 내부 클래스(local inner class) | 외부 클래스의 메서드나 초기화블럭 안에 선언 | 외부 인스턴스 변수, 외부 전역 변수 |
익명 내부 클래스(anonymous inner class) | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 | 외부 인스턴스 변수, 외부 전역 변수 |
인스턴스 내부 클래스
객체 내부에 멤버의 형태로 존재하며 외부 클래스의 모든 접근 지정자의 멤버에 접근이 가능하다.
인스턴스 내부 클래스는 반드시 외부 클래스를 생성한 이후에 사용이 가능하기 때문에 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 선언할 수 없다.
정적 내부 클래스
내부 클래스가 외부 클래스의 존재와 무관하게 정적 변수를 사용할 때 정적 내부 클래스가 필요하다.
class Outer { // 외부 클래스
private int num = 3; // 외부 클래스의 인스턴스 변수
private static int sNum = 4;
void getPrint() {
System.out.println("인스턴스 메서드");
}
static void getPrintStatic() {
System.out.println("스태틱 메서드");
}
static class StaticInClass { // 정적 내부 클래스
void test() {
System.out.println("Outer sNum = " +sNum + "(외부 클래스의 정적 변수)");
getPrintStatic();
// num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
}
}
}
public class Main {
public static void main(String[] args) {
Outer.StaticInClass a = new Outer.StaticInClass(); //정적 이너 클래스의 객체 생성
a.test();
}
}
//출력값
Outer sNum = 4(외부 클래스의 정적 변수)
스태틱 메서드
지역 내부 클래스
클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스이다.
메서드 내부에서만 사용 가능하기 때문에 일반적으로 메서드 안에서 지역 내부 클래스를 선언한 후 바로 객체를 생성해서 사용한다.
class Outer { //외부 클래스
int num = 5;
void test() {
int num2 = 6;
class LocalInClass { //지역 내부 클래스
void getPrint() {
System.out.println(num);
System.out.println(num2);
}
}
LocalInClass localInClass = new LocalInClass();
localInClass.getPrint();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
outer.test();
}
}
//출력값
5
6
'CodeStates_BE_44 > TIL' 카테고리의 다른 글
Day 12. [Java] 객체지향 프로그래밍 심화_다형성, 추상화 (0) | 2023.02.28 |
---|---|
Day 11. [Java] 객체지향 프로그래밍 심화_상속, 캡슐화 (0) | 2023.02.27 |
Day 9. [Java] 객체지향 프로그래밍 기초_클래스, 객체, 필드, 메서드 (0) | 2023.02.23 |
Day 7. [Java] 반복문 (0) | 2023.02.21 |
Day 6. [Java] 연산자, 콘솔 입출력, 조건문 (0) | 2023.02.20 |