#생성자
: 객체를 생성하는 역할을 하는 클래스의 구성 요소.
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.
- 인스턴스를 생성하는 것은 new 키워드이다.
- 생성자는 인스턴스 변수들을 초기화하는 메서드이다.
- 생성자도 오버로딩이 가능하다. (하나의 클래스에 여러 개의 생성자가 있을 수 있다.)
public class ExampleofConstructor {
public static void mian(String[] args) {
Constructor constructor1 = new Constructor();
Constructor constructor2 = new Constructor("Tistory Blog");
Constructor constructor3 = new Constructor(3.14);
}
}
class Constructor {
Constructor() { // 생성자 오버로딩
System.out.println("cs num1");
}
Constructor(String str) {
System.out.println("cs num2");
}
Constructor(double a) {
System.out.println("cs num3");
}
}
- 메서드 오버로딩과 마찬가지로 생성자의 모양에 맞는 매개변수를 전달해주어야 한다.
- 생성자의 선언은 다음과 같이 한다.
(1) 매개변수 없는 생성자
: 클래스이름() {...}
(2) 매개변수 있는 생성자
: 클래스이름(인수1, 인수2, ...) {...}
#기본 생성자
: 매개변수가 없는 생성자를 의미한다.
- 모든 클래스에는 하나 이상의 생성자가 필요하다.
- 자바는 생성자가 없는 클래스에 자동으로 기본 생성자를 추가해준다.
- 자바가 자동 생성한 기본 생성자는 매개변수, 명령어를 포함하고 있지 않다.
#매개변수가 있는 생성자
: 매개변수를 통해 호출 시에 인스턴스를 초기화하는 데 사용된다.
public class ExampleofConstructor {
public static void main(String[] args) {
WaterBottle B = new WaterBottle(스타벅스, 하늘색, 500); // 생성자의 호출
System.out.println("나의 텀블러 브랜드는 " + B.getBrand() + "이며, 색깔은 " + B.color + " 용량은 " + B.capacity);
// 생성자에 의해 초기화 되었는 지 확인함.
}
}
class WaterBottle {
private String brand;
private String color;
private int capacity;
public WaterBottle(String brand, String color, int capacity) {
this.brand = brand;
this.color = color;
this.capacity = capacity;
}
public String getBrand() {
return brand;
}
public String getColor() {
return color;
}
public int getCapacity() {
retunr capacity;
}
}
}
//출력값: 나의 텀블러 브랜드는 스타벅스이며, 색깔은 하늘색 용량은 500
- 매개변수 있는 생성자를 사용할 때, 인스턴스의 생성 후 필드값을 설정과정을 생략할 수 있다.
- 매개변수가 있을 때 개수와 타임에 알맞게 생성자를 호출해주어야 한다.
#this와 this()
(1) this()
: 생성자를 상호 호출하기 위해 사용한다.
즉, 자신이 속한 클래스에서 다른 생성자를 호출할 때 사용한다.
- this() 메서드는 생성자의 내부에서만 사용할 수 있다.
- this() 메서드는 생성자의 첫 줄에 위치해야 한다.
public class Constructor {
public static void main(String[] args) {
Example example1 = new Example(); // 인스턴스 생성
Example example2 = new Example("pilgrim");
}
}
class Example {
public Example() {
System.out.println("Example의 기본생성자");
}
public Example(String str) {
this(); // this()를 통해 기본생성자 호출
System.out.println(str);
}
}
//출력값
Example의 기본생성자
Example의 기본생성자
pilgrim
- Example 클래스로 인스턴스를 생성할 때, 첫 번째 생성자가 호출된다.
- Example 클래스의 두번째 생성자로 인스턴스를 생성할 때, this()메서드를 통해 첫 번째 생성자가 호출되고,
다음으로 두 번째 생성자가 호출된다.
(2)this
public class ExampleofConstructor {
public static void main(String[] args) {
WaterBottle B = new WaterBottle(스타벅스, 하늘색, 500);
System.out.println("나의 텀블러 브랜드는 " + B.getBrand() + "이며, 색깔은 " + B.color + " 용량은 " + B.capacity);
}
}
class WaterBottle {
private String brand;
private String color;
private int capacity;
public WaterBottle(String brand, String color, int capacity) { // 생성자의 매개변수
this.brand = brand; //인스턴스변수
this.color = color; //인스턴스변수
this.capacity = capacity; //인스턴스변수
}
public String getBrand() {
return brand;
}
public String getColor() {
return color;
}
public int getCapacity() {
retunr capacity;
}
}
}
- 위 코드에서 인스턴스 변수와 생성자의 매개변수가 brand, cololr, capacity가 동일하게 선언&정의되어 있다.
- 인스턴스 변수와 매개변수를 구분하기 위해서 this 키워드를 사용한다.
- this 키워드를 사용해 인스턴스의 필드명과 지역변수를 구분할 수 있다.
(인스턴스 변수와 매개변수 차이)
#내부 클래스
: 클래스 내에 선언된 클래스
- 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.
- 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근 가능.
- 코드의 캡슐화 증가
- 외부에서의 내부 클래스 접근 차단으로 코드의 복잡성 감소
class Outer { // 외부 클래스
class Inner {
// 인스턴스 내부 클래스
}
static class StaticInner {
// 정적 내부 클래스
}
void run() {
class LocalInner {
// 지역 내부 클래스
}
}
}
- 내부 클래스의 종류
종류 | 선언 위치 | 사용 가능한 변수 |
인스턴스 클래스 | 외부 클래스의 멤버변수의 선언위치 (멤버 내부 클래스) |
외부 인스턴스 변수, 외부 전역 변수 |
정적 클래스 | 외부 전역 변수 | |
지역 클래스 | 외부 클래스의 메서드나 초기화블록 안 | 외부 인스턴스 변수, 외부 전역 변수 |
익명 클래스 | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 |
(1) 인스턴스 내부 클래스
: 객체 내부에 멤버의 형태로 존재한다.
- 외부 클래스를 생성한 뒤에 사용가능하다.
- 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 사용할 수 없다.
- 외부 클래스의 모든 접근 지정자의 멤버에 접근 가능.
(2) 정적 내부 클래스
: 외부 클래스의 존재와 무관하게 정적 변수를 사용할 때 내부 클래스에 사용.
- static 키워드를 사용한다.
(3) 지역 클래스
: 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스.
- 메서드 내부에서만 사용 가능하다.
- 메서드 내부에서 선언 후 바로 객체를 생성하여 사용한다.
'개발지 > Today I learn' 카테고리의 다른 글
[0721] 자바 객체지향 프로그래밍 심화 (상속2) (0) | 2023.07.22 |
---|---|
[0720] 자바 객체지향프로그래밍 (상속1) (0) | 2023.07.21 |
[0718] 자바 객체지향프로그래밍 2 (필드와 메서드) (0) | 2023.07.19 |
[0717] 자바 객체지향프로그래밍 1 (클래스와 객체) (0) | 2023.07.17 |
[0711] 자바 기초 10 (배열) (0) | 2023.07.14 |