12일차 09/05 2022

SangYu Lee·2022년 9월 5일
0

codestates backend

목록 보기
13/30

Keyword - 생성자, 이너클래스

1. 생성자

인스턴스가 생성될 때 '초기화' 하는 메서드.

  • 리턴 타입이 없다.
  • 클래스와 이름이 완전히 똑같아야 한다.

사용법부터 보면

public static string main(String[] args) {
	Person Syu = new Person(2003, "brown");
}

class Person{
	int ele;
    String engName;
    
    Person(int ele, String engName) {
    	this.ele = ele;
        this.String = engName;
    }
}

Person(int ele, String engName)이라는 생성자 함수를 만들었다. 이 생성자 함수는 new라는 명령어를 통해 메모리의 heap 에 Person클래스의 객체가 만들어질 때, 그 객체의 변수를 매개변수로 받은 인자로 초기화시켜주는 역할을 한다.

초기화라는 말의 뉘앙스가 '처음상태로 되돌리는 것'이라고 느껴지지만, 처음 객체를 생성할 때에는 '새롭게 설정'이라는 의미에 가깝다고 생각한다.

Person Syu = new Person(2003, "brown");

이 명령줄에서는 Person이라는 객체를 new 키워드가 생성할 때 초등학교에 들어간 연도를 의미하는 ele라는 변수에 2003이라는 값을, 영어 이름을 의미하는 engName이라는 변수에 "brown"이라는 값을 넣고 새롭게 생성한다는 의미이다. 이와 같은 표현으로 보통 객체를 생성하기 때문에 생성자 함수는 클래스와 이름이 똑같아야 한다는 것이다.

※ 클래스에 생성자는 무조건 있어야 하지만 생성자가 없다면, 컴파일러에서 기본 생성자를 삽입한다.


this 와 this()

this()는 한 생성자 안에서 다른 생성자를 호출할 때 사용하는 메서드이다.

  • 이렇게 그냥 생성자 함수로 쓰면 되는거 아닌가? (아직 이해못함)
class Person{
	String name;
    int age;
    
    Person() {
    	Person(아무개);
    }
    Person(String name) {
        Person(아무개, 20);
    }
    Person(String name, int age){
    	Person.name = name;
        Person.age = age;
    }
}

자바 문법이 만들어 질때 이미 클래스변수와 클래스 메소드를 호출할 때 클래스명.변수, 클래스명.함수로 호출 해서 이미 문법을 선점 당해 생성자를 호출 할 때 this를 사용하게 되었다.
출처 : https://crushonit.tistory.com/14

  • 왜 this()는 첫줄에 쓰여야 하는가
    => this()윗줄에 열심히 초기화해봐야 this()가 다시 초기화시켜버리기 때문이다.

그래서 위의 코드를 this()를 사용하여 문법에 맞게 바꾸면 이렇다.

class Person{
	String name;
    int age;
    
    Person() {
    	this(아무개);
    }
    Person(String name) {
        this(아무개, 20);
    }
    Person(String name, int age){
    	this.name = name;
        this.age = age;
    }
}

this
모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조변수가 있다. 주로 인스턴스 변수와 지역변수를 구분해주는 역할을 한다. 위의 코드에서도

    Person(String name, int age){
    	this.name = name;
       	this.age = age;
   }

this.name = name이라고 작성한 것은, 그냥 name = name이라고 하면 둘 모두 매개변수로 받은 name을 의미하기 때문에 클래스의 객체 this의 name이라고 표현해야 인스턴스 변수를 의미할 수 있다. 일반적인 경우(생성자가 아닌)에는 컴파일러가 this.를 추가해주기 때문에 생략하는 경우가 많다.


2. 이너클래스

멤버 내부 클레스 = 인스턴스 내부 클래스 or 정적 내부 클래스

인스턴스 내부 클래스
클래스 내부에 멤버 변수의 형태로 존재한다.

  • 모든 외부클래스의 인스턴스변수에 접근가능하다. private이더라도.
  • 외부 클래스가 생성되어야 쓸 수 있다. 그러므로 정적 변수와 정적 메서드는 내부 클래스에서 선언될 수 없다. 이미 있는 건 접근은 가능.

정적 내부 클래스
static 인스턴스 내부 클래스 라고 할 수 있다. 외부 클래스에 의존하는 인스턴스 내부 클래스와는 다르게, static 키워드가 붙었기 때문에 정적 변수와 정적 메소드를 선언하거나 초기화 하는 것이 가능하다.

  • 그러나 반대로 정적 내부 클래스는 static 키워드가 붙지 않은 동적 멤버변수나 메서드를 사용할 수 없다.

그럼 이너클래스를 쓰는 이유가 무엇이냐...

  1. 외부 클래스와의 관계를 나타내기 쉽다.
  2. 읽기 쉽고 유지보수가 가능한 코드에 적합하다.
  3. 작성하는 데 더 적은 코드를 사용한다.

심화 : https://tworab.tistory.com/49

profile
아이스커피

0개의 댓글