10일차(생성자, 내부클래스)

Rina's·2023년 4월 24일

코드스테이츠

목록 보기
10/96

생성자

생성자는 인스턴스 초기화 매서드이다
인스턴스 생성을 담당하는 것은 new키워드이다

생성자 조건

  1. 클래스와 이름이 같을것
  2. 리턴 타입이 없을 것(void와는 다르다)
  3. 오버로딩이 가능하다(클래스로 여러 인스턴스를 만드는 방법)

생성자가 없을 경우 기본클래스를 자동 생성한다
클래스명(){}

매개변수가 있는 생성자

매개변수로 오버로딩하여 다른 값의 여러 인스턴스를 만들 수 있다

this()와 this

this()

생성자 끼리 호출할 때 사용,
자신이 속한 클래스의 다른 생성자를 호출
this()는 반드시 호출을 사용한 생성자의 첫 줄에 위치해야 함

public class Test {
    public static void main(String[] args) {
        Cookie_mold cookie1 = new Cookie_mold();
        Cookie_mold cookie2 = new Cookie_mold(23);
    }
}
class Cookie_mold  {
    public Cookie_mold() {
        System.out.println("맛있는 쿠키!");
    };
public Cookie_mold(int x) {
    this();
   		System.out.println(x+"개!");
    }
}

/*Output
맛있는 쿠키!
맛있는 쿠키!
23개!*/

this

인스턴스의 필드명과 메소드 등의 지역변수를 구분하기 위해 사용
인스턴스 자신을 가리키는 참조변수
컴파일러가 자동추가(this.)하여 생략 가능
this.인스턴스명

public class main {
    public static void main(String[] args) {
        Cookie_mold cookie1 = new Cookie_mold("딸기", " 빨간색");
        System.out.println(cookie1.getCookieName() + "맛 쿠키로" +  cookie1.getColor() + "입니다.");
    }
}

class Cookie_mold {
    private String cookieName;
    private String color;


    public Cookie_mold(String cookieName, String color) {
        this.cookieName = cookieName;
        this.color = color;
    }
    public String getCookieName() {
        return cookieName;
    }
    public String getColor() {
        return color;
    }
}

//output: 딸기맛 쿠키로 빨간색입니다.

내부 클래스

  • 내부클래스
  • 정적 내부클래스
  • 지역 내부클래스

클래스 안에 있는 클래스
내부클래스는 접근제어자와 관계없이 외부클래스에 접근 가능하다

class Outer { // 외부 클래스
	
	class Inner {  // 인스턴스 내부 클래스  }	
	static class StaticInner {  // 정적 내부 클래스  }
	->맴버 내부 클래스
	void run() {
    class LocalInner {	// 지역 내부 클래스  }
    }
} 

외부클래스에 내부클래스의 인스턴스를 선언하여 내부클래스를 호출 가능하다
외부클래스 메서드 호출 -> 메서드가 내부클래스의 메서드 호출하는 방식

내부클래스에선 static 변수와 메서드를 사용할 수 없다
반대로 정적 내부클래스 내에선 static 변수와 메서드만 사용할 수 있다
지역 지역 내부클래스는 메서드 내에서 선언되어 사용된다

아래는 클래스 사용에 익숙해지기 위해 만든 코드이다
Cat클래스를 만들어 이름과 나이, 물고기를 먹은 횟수를 필드값으로 넣고
야옹거리는 메소드와 물고기를 넣으면 횟수를 증가시키고 출력하는 메소드를 작성했다.

class Cat {
    String name = "야옹이";
    int old = 2;
    int eatCount = 0;

    public void meow(){
        System.out.println("야옹, 야옹");
    }
    public int eat(String fish){
        return this.eatCount++;
        System.out.printf("먹은 물고기 수: %d%n", this.eatCount);
    }
}

위 코드에서 몇가지 문제가 있음을 알아차렸는데
1. return문 이후로는 코드가 실행되지 않아 printf가 되지 않는다는것
2. return은 당장의 상태를 반환하기에 후위 연산자인 this.eatCount++를 쓰면 계속해서 계산 전인 0을 반환하고 끝난다는 것이다

때문에 수정코드는 이렇다

class Cat {
    String name = "야옹이";
    int age = 2;
    int eatCount = 0;

    public void meow(){
        System.out.println("야옹, 야옹");
    }
    public void eat(String fish){
        this.eatCount++;
        System.out.printf("%s를 먹었습니다. 먹은 횟수: %d%n", fish, this.eatCount);
    }
}
  1. 리턴타입을 void로 바꾸어 return없이 print하였다
  2. 자연스럽게 후위연산자를 써도 오류가 나지 않게 되었다
  3. old보다는 age가 적합하다 생각되어 수정하였다
  4. 출력문에 받은 인수를 확인할 수 있도록 정정했다

🦀🦀🦀

좀더 열심히 하자
profile
갭린이 리나

0개의 댓글