-
[TIL #12][JAVA] 생성자, this 와 this()CodeStates_Backend/TIL (Today I Learned) 2022. 5. 16. 20:59
코드스테이츠 백엔드 부트캠프 39기 17일차, 05/11
생성자
new 키워드를 사용하여 객체를 생성할 때 호출되는 것이 바로 생성자이다. 생성자는 인스턴스가 생성될 때 인스턴스를 초기화하는 역할을 한다. 붕어빵틀에서 붕어빵을 만들때 어떤 녀석은 팥붕어빵, 어떤 녀석은 슈크림붕어빵으로 만들어내지 않는가? 생성자가 팥인지 슈크림인지를 지정해주는 역할을 하는 것이다.
🏐 생성자 이름은 클래스명과 같아야 한다.
🏐 생성자는 리턴타입이 없으며 void 를 사용하지 않는다.
🏐 생성자도 오버로딩이 가능하다. 그래서 여러개의 생성자가 존재할 수 있는것.
🏐 생성자가 하나도 없으면 컴파일러가 자동으로 기본 생성자를 만들어 준다. 단, 하나라도 다른 생성자가 존재하면 기본 생성자를 만들어 주지 않으며, 이 때 기본 생성자를 호출하면 오류가 발생한다.
🏐 생성자도 접근제어자 설정이 가능하다. public일 경우는 생략이 가능한 것.
더보기[생성자의 접근제어자 활용 예시]
생성자의 접근 제어자를 private으로 지정하면, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없다. 대신 클래스 내부에서는 인스턴스가 생성이 가능하므로 인스턴스를 생성해서 반환해주는 public 메소드를 제공함으로써 해당 클래스에 접근이 가능하도록 할 수 있다. 단, 메소드는 public 인 동시에 static이어야 한다. 이러한 경우는 외부로부터 불필요한 접근을 막기 위해 사용한다.
class ConstructorTest{ private static ConstructorTest s = new ConstructorTest(); private ConstructorTest(){ // 초기화; } public static ConstructorTest getInstance(){ if(s == null){ s = new ConstructorTest(); } return s; } }
class ConstructorTest{ public static void main(String args[]){ // ConstructorTest s = new ConstructorTest(); 인스턴스를 생성할 수 없다. ConstructorTest s = ConstructorTest.getInstance(); } }
this 와 this()
this
일반적으로 생성자의 매개변수는 인스턴스 변수를 초기화할 때 사용하는데, 같은 이름으로 설정하는 것이 관례다. 그렇다면 생성자 내부의 블록에서 어떻게 매개변수와 인스턴스 변수를 구분할 수 있는가? 같은 이름인데? 이럴 때 사용하는 것이 this 키워드이다.
지역변수가 인스턴스 변수보다 우선순위에 있는건 이미 알고 있을 것이다. 인자로 들어오는 매개변수는 지역변수이고 인스턴스 변수보다 우선순위를 가지므로 둘이 같은 이름일 때, 해당 이름을 그대로 쓰면 지역변수만 가리키게 된다. 따라서 이 클래스의 인스턴스 변수를 가리키기 위해 this.인스턴스 변수이름 이런 식으로 사용하게 된다.
조금 더 자세히 설명해보면, 모든 메소드에는 자신이 포함된 클래스의 객체를 가리키는 this 라는 참조변수가 있는데 일반적인 경우 컴파일러가 this. 을 자동으로 추가해주기 때문에 전부 생략하는 것이다.(직접 this. 을 붙여 테스트 해보았음.) 결론적으로 this 는 인스턴스 자신을 가리키며 this 를 통해 인스턴스 자신의 변수에 접근할 수 있다.
this()
같은 클래스 안의 메소드들끼리 서로 호출할 수 있었던 것처럼 생성자도 서로 호출이 가능하다. 이 때 사용하는 것이 this() 이다. this() 메소드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.
this() 의 2가지 조건
1️⃣ 생성자 내부에서만 사용가능하다.
2️⃣ 생성자 내부의 '첫째 줄'에 위치해야 한다. 👉 아닐 경우 초기화하는 도중에 다른 생성자를 호출해버리므로 충돌이 생김. 오류 발생.
'CodeStates_Backend > TIL (Today I Learned)' 카테고리의 다른 글
[TIL #13-2][JAVA] 객체지향 프로그래밍 심화, 캡슐화(패키지, 접근 제어자, getter, setter) (0) 2022.05.21 [TIL #13-1][JAVA]객체지향 프로그래밍 심화, 상속(오버라이딩, super()와 super) (0) 2022.05.18 [TIL #11-2][JAVA] 객체지향 프로그래밍(OOP, Object Oriented Programming) 개념, 클래스, 객체, 필드, 메서드 (0) 2022.05.16 [TIL #11-1][블로그] 블로깅에 대해 (0) 2022.05.14 [TIL #10][JAVA] 계산기 만들기 (0) 2022.05.14